[
http://opensource.atlassian.com/projects/hibernate/browse/HHH-5565?page=c...
]
Eugene Goroschenya commented on HHH-5565:
-----------------------------------------
Yes, I will create patch for the current Hibernate trunk (3.6.x).
Regarding testcase not sure as don't know good way to check private field
auditSyncManager.auditSyncs<Transaction, AuditSync>) contains not necessary data
which never cleared.
The only idea maybe use EasyMock to verify that if auditSyncManager.get(eventSource) was
called then auditSyncManager.remove(transaction) must be called too if transaction active
and that auditSyncManager.get(eventSource) never is called if transaction is inactive.
The other problem with testcase is that EntityManager.flush() is only possible within
active transaction but it is not restriction for Hibernate session, unfortunately
testcases are used EntityManager (see AbstractEntityTest), so I will have to create
testcase which uses Hibernate session directly (without EntityManager)
Memory leak is possible if changes for audited entities are outside
of transaction
----------------------------------------------------------------------------------
Key: HHH-5565
URL:
http://opensource.atlassian.com/projects/hibernate/browse/HHH-5565
Project: Hibernate Core
Issue Type: Bug
Components: envers
Affects Versions: 3.3.1
Environment: hibernate-core-3.3.1.GA.jar, jboss-envers-1.2.1-hibernate-3.3.jar
Reporter: Eugene Goroschenya
Attachments: HHH-5565.patch, HHH-5565_(corrected).patch
Envers always collects changes for audited objects in global (global per sessionFactory
instance) application map (auditConfiguration.auditSyncManager.auditSyncs<Transaction,
AuditSync>) even if transaction is inactive.
It leads to memory leak in application if there were changes (insert/update/delete) for
versioned objects outside of transaction (transaction.isActive() == false) because in this
case transaction is not committed where collected changes for current transaction are
removed from global map.
Possible solution is patch Envers to check if transaction is active (AuditEventListener
in onPostInsert/onPostUpdate/onPostDeleteonCollectionAction methods) before starting
collect changes for audited object.
Skip collecting (to prevent memory leak) if transaction is inactive and log WARN message
to indicate problem ("Couldn't create revision for entity ${entityName} because
transaction is not active.")
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://opensource.atlassian.com/projects/hibernate/secure/Administrators....
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira