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.