Hi everybody;
I have a memory leak problem with the transaction manager which I wrote.  I 
extend AbstractPlatformTransactionManager and implement 
ResourceTransactionManager 
of spring. I can make commit, rollback and other transactional things. But 
 after things finished  OrientGraphNoTx objects are still alive. java 
garbage collector did not clean them. I write the codes about transaction 
manager following.Any help appreciated.


@Component
public class OrientDBFactory {

    private OrientGraphFactory pool;

    @Autowired
    private OrientDBConnectionSettings settings;

    @PostConstruct
    public void initFactory() {

        pool = new OrientGraphFactory(settings.getUrl(), settings.getUsr(), 
settings.getPwd()).setupPool(settings.getMinConnection(),settings.getMaxConnection());
        pool.setAutoStartTx(false);
        pool.declareIntent(new OIntentMassiveInsert());
    }
    @PreDestroy
    public void  removeFactory(){
        pool.close();
    }

    public OrientGraph getTxGraph() {

        return pool.getTx();

    }

    public OrientGraphNoTx getGraph() {

        return pool.getNoTx();

    }

    public void close() {

        pool.close();

    }

    private ODatabaseInternal<?> db() {

        return ODatabaseRecordThreadLocal.INSTANCE.get().getDatabaseOwner();
    }

    public OrientGraphNoTx getCurrentDb(){

        ODatabaseRecordThreadLocal.INSTANCE.get().getDatabaseOwner();
        return new OrientGraphNoTx((ODatabaseDocumentTx) this.db());
    }

    public OrientGraphFactory getPool() {

        return pool;
    }

    public void setPool(OrientGraphFactory pool) {

        this.pool = pool;
    }

    public OrientDBConnectionSettings getSettings() {

        return settings;
    }

    public void setSettings(OrientDBConnectionSettings settings) {

        this.settings = settings;
    }
}



public class OrientTransactionManager extends 
AbstractPlatformTransactionManager implements ResourceTransactionManager {

    private static final long serialVersionUID = 1L;

    /**
     * The logger.
     */
    private static Logger log = 
LoggerFactory.getLogger(OrientTransactionManager.class);

    /**
     * The database factory.
     */
    private OrientDBFactory dbf;

    /**
     * Instantiates a new {@link OrientTransactionManager}.
     *
     * @param dbf the dbf
     */
    public OrientTransactionManager(OrientDBFactory dbf) {

        super();
        this.dbf = dbf;
    }

    /* (non-Javadoc)
     * @see 
org.springframework.transaction.support.AbstractPlatformTransactionManager#doGetTransaction()
     */
    @Override
    protected Object doGetTransaction() throws TransactionException {

        TransactionHolder transactionHolder = (TransactionHolder) 
TransactionSynchronizationManager.getResource(OrientBaseGraph.class);

        if (transactionHolder==null){
            OrientBaseGraph orientGraph = dbf.getGraph();
            transactionHolder = new TransactionHolder(orientGraph);
            ODatabaseRecordThreadLocal.INSTANCE.set((ODatabaseDocumentInternal) 
orientGraph.getRawGraph());
            
TransactionSynchronizationManager.bindResource(OrientBaseGraph.class, 
transactionHolder);

        }
        return transactionHolder;
    }


    /* (non-Javadoc)
     * @see 
org.springframework.transaction.support.AbstractPlatformTransactionManager#doBegin(java.lang.Object,
 org.springframework.transaction.TransactionDefinition)
     */
    @Override
    protected void doBegin(Object transaction, TransactionDefinition 
definition) throws TransactionException {
        TransactionHolder transactionHolder = (TransactionHolder)transaction;
        transactionHolder.getOrientGraph().begin();
        log.debug("beginning transaction, db.hashCode() = {}", 
transactionHolder.getOrientGraph().hashCode());

    }

    /* (non-Javadoc)
     * @see 
org.springframework.transaction.support.AbstractPlatformTransactionManager#doCommit(org.springframework.transaction.support.DefaultTransactionStatus)
     */
    @Override
    protected void doCommit(DefaultTransactionStatus status) throws 
TransactionException {

        TransactionHolder transactionHolder = 
(TransactionHolder)status.getTransaction();
        log.debug("committing transaction, db.hashCode() = {}", 
transactionHolder.getOrientGraph().hashCode());
        transactionHolder.getOrientGraph().commit();
        releaseConnection(transactionHolder);

    }

    /* (non-Javadoc)
     * @see 
org.springframework.transaction.support.AbstractPlatformTransactionManager#doRollback(org.springframework.transaction.support.DefaultTransactionStatus)
     */
    @Override
    protected void doRollback(DefaultTransactionStatus status) throws 
TransactionException {

        TransactionHolder transactionHolder = 
(TransactionHolder)status.getTransaction();
        log.debug("rollbacking transaction, db.hashCode() = {}", 
transactionHolder.getOrientGraph().hashCode());
        transactionHolder.getOrientGraph().rollback();
        releaseConnection(transactionHolder);
    }

    protected void releaseConnection(TransactionHolder holder) {
        holder.getOrientGraph().shutdown();
        TransactionSynchronizationManager.unbindResource(OrientBaseGraph.class);
    }

    /* (non-Javadoc)
     * @see 
org.springframework.transaction.support.ResourceTransactionManager#getResourceFactory()
     */
    @Override
    public Object getResourceFactory() {

        return dbf;
    }

    /**
     * Gets the database factory for the database managed by this transaction 
manager.
     *
     * @return the database
     */
    public OrientDBFactory getDatabaseFactory() {

        return dbf;
    }

    /**
     * Sets the database factory for the database managed by this transaction 
manager.
     *
     * @param databaseFactory the database to set
     */
    public void setDatabaseFactory(OrientDBFactory databaseFactory) {

        this.dbf = databaseFactory;
    }
}





public class TransactionHolder {

    private OrientBaseGraph orientGraph;

    public TransactionHolder(OrientBaseGraph orientGraph) {
        this.orientGraph = orientGraph;
    }

    public OrientBaseGraph getOrientGraph() {
        return orientGraph;
    }

    public void setOrientGraph(OrientBaseGraph orientGraph) {
        this.orientGraph = orientGraph;
    }
}


-- 

--- 
You received this message because you are subscribed to the Google Groups 
"OrientDB" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to