[
http://opensource.atlassian.com/projects/hibernate/browse/HHH-1786?page=c...
]
Gary Sargent commented on HHH-1786:
-----------------------------------
Having looked into this further, in JTASessionContext, the map is being populated with a
different key to that used when it is being read (in the two places a get and a remove are
performed on the Map).
This will work fine for non-Websphere transaction lookups as the default implementation
returns the transaction, which is what is used for the get / remove.
For WebSphere, this won't work as this uses a different key. This means a new session
is ALWAYS created even if one exists, and sessions are NEVER removed!
Solution is to ensure the correct key is used in the get and remove methods on the Map.
Diff for JTASessionContext.java against 3.3.0 is:
104c104,107
< Session currentSession = ( Session ) currentSessionMap.get( txn );
---
Object txnIdentifier =
factory.getSettings().getTransactionManagerLookup() == null
? txn
: factory.getSettings().getTransactionManagerLookup().getTransactionIdentifier( txn );
Session currentSession = ( Session ) currentSessionMap.get( txnIdentifier );
110c113
< txn.registerSynchronization( buildCleanupSynch( txn ) );
---
txn.registerSynchronization( buildCleanupSynch( txnIdentifier ) );
122,124d124
< Object txnIdentifier = factory.getSettings().getTransactionManagerLookup() == null
< ? txn
< : factory.getSettings().getTransactionManagerLookup().getTransactionIdentifier( txn
);
131,132c131,132
< private CleanupSynch buildCleanupSynch(Transaction txn) {
< return new CleanupSynch( txn, this );
---
private CleanupSynch buildCleanupSynch(Object txnIdentifier) {
return new CleanupSynch( txnIdentifier, this );
183c183
< private Transaction txn;
---
private Object txnIdentifier;
186,187c186,187
< public CleanupSynch(Transaction txn, JTASessionContext context) {
< this.txn = txn;
---
public CleanupSynch(Object txnIdentifier, JTASessionContext context)
{
this.txnIdentifier = txnIdentifier;
201c201
< context.currentSessionMap.remove( txn );
---
Object x = context.currentSessionMap.remove( txnIdentifier );
JTASessionContext.CleanupSynch does not remove sessions from
currentSessionMap
------------------------------------------------------------------------------
Key: HHH-1786
URL:
http://opensource.atlassian.com/projects/hibernate/browse/HHH-1786
Project: Hibernate3
Issue Type: Improvement
Affects Versions: 3.1.2
Environment: IBM WebSphere 6.0.2.7, Hibernate CVS snapshot from 2006-02-24
Reporter: Tomi Szabo
Assignee: Steve Ebersole
Fix For: 3.3.0.CR2
Attachments: JTASessionContext.java, screenshot-1.jpg, screenshot-2.jpg,
WebSphereExtendedJTATransactionLookup.java,
WebSphereExtendedJTATransactionLookup.patch.txt
We are using JTASessionContext, CMTTransaction and WebSphereExtendedJTATransactionLookup.
We have experienced some memmory leak problems and after closer inspection we have found
that Hibernate sessions are not removed from currentSessionMap inside JTASessionContext.
Method JTASessionContext.CleanupSynch.afterCompletion() is called as expected but code
"context.currentSessionMap.remove( txn );" does not remove session from Map
because of key's hashcode has changed. This is due to fact that
com.ibm.websphere.jtaextensions.ExtendedJTATransaction.hashCode is actually ID of
underlaying transaction. But if it comes to the afterCompletion method in CleanupSynch the
underlaying transaction is already closed. Closed transaction has ID 0 (default value) and
it is different from ID under which the Hibernate session was previously inserted into
Map.
Possible patch is in attachements.
--
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