[hibernate-commits] Hibernate SVN: r18790 - in core/trunk/cache-infinispan/src: main/java/org/hibernate/cache/infinispan/query and 2 other directories.
hibernate-commits at lists.jboss.org
hibernate-commits at lists.jboss.org
Fri Feb 12 07:21:44 EST 2010
Author: galder.zamarreno at jboss.com
Date: 2010-02-12 07:21:43 -0500 (Fri, 12 Feb 2010)
New Revision: 18790
Modified:
core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/impl/BaseRegion.java
core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/query/QueryResultsRegionImpl.java
core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/timestamp/TimestampsRegionImpl.java
core/trunk/cache-infinispan/src/test/java/org/hibernate/test/cache/infinispan/functional/BasicTransactionalTestCase.java
Log:
[HHH-4836] (Infinispan: 2L QueryCache don't considers cached queries which belong to current transaction) Fixed by not suspending transactions on get any more, since no locks are aquired on get.
Modified: core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/impl/BaseRegion.java
===================================================================
--- core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/impl/BaseRegion.java 2010-02-12 06:22:52 UTC (rev 18789)
+++ core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/impl/BaseRegion.java 2010-02-12 12:21:43 UTC (rev 18790)
@@ -194,28 +194,21 @@
}
/**
- * Performs a JBoss Cache <code>get(Fqn, Object)</code> after first
- * {@link #suspend suspending any ongoing transaction}. Wraps any exception
- * in a {@link CacheException}. Ensures any ongoing transaction is resumed.
- *
+ * Performs a Infinispan <code>get(Fqn, Object)</code>
+ *
* @param key The key of the item to get
* @param opt any option to add to the get invocation. May be <code>null</code>
* @param suppressTimeout should any TimeoutException be suppressed?
* @return The retrieved object
* @throws CacheException issue managing transaction or talking to cache
*/
- protected Object suspendAndGet(Object key, FlagAdapter opt, boolean suppressTimeout) throws CacheException {
- Transaction tx = suspend();
- try {
- if (suppressTimeout)
- return cacheAdapter.getAllowingTimeout(key);
- else
- return cacheAdapter.get(key);
- } finally {
- resume(tx);
- }
+ protected Object get(Object key, FlagAdapter opt, boolean suppressTimeout) throws CacheException {
+ if (suppressTimeout)
+ return cacheAdapter.getAllowingTimeout(key);
+ else
+ return cacheAdapter.get(key);
}
-
+
public Object getOwnerForPut() {
Transaction tx = null;
try {
Modified: core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/query/QueryResultsRegionImpl.java
===================================================================
--- core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/query/QueryResultsRegionImpl.java 2010-02-12 06:22:52 UTC (rev 18789)
+++ core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/query/QueryResultsRegionImpl.java 2010-02-12 12:21:43 UTC (rev 18790)
@@ -50,12 +50,13 @@
if (!checkValid())
return null;
- // Don't hold the JBC node lock throughout the tx, as that
- // prevents updates
+ // In Infinispan get doesn't acquire any locks, so no need to suspend the tx.
+ // In the past, when get operations acquired locks, suspending the tx was a way
+ // to avoid holding locks that would prevent updates.
// Add a zero (or low) timeout option so we don't block
// waiting for tx's that did a put to commit
- return suspendAndGet(key, FlagAdapter.ZERO_LOCK_ACQUISITION_TIMEOUT, true);
- }
+ return get(key, FlagAdapter.ZERO_LOCK_ACQUISITION_TIMEOUT, true);
+ }
public void put(Object key, Object value) throws CacheException {
if (checkValid()) {
Modified: core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/timestamp/TimestampsRegionImpl.java
===================================================================
--- core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/timestamp/TimestampsRegionImpl.java 2010-02-12 06:22:52 UTC (rev 18789)
+++ core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/timestamp/TimestampsRegionImpl.java 2010-02-12 12:21:43 UTC (rev 18790)
@@ -58,7 +58,7 @@
public Object get(Object key) throws CacheException {
Object value = localCache.get(key);
if (value == null && checkValid()) {
- value = suspendAndGet(key, null, false);
+ value = get(key, null, false);
if (value != null)
localCache.put(key, value);
}
Modified: core/trunk/cache-infinispan/src/test/java/org/hibernate/test/cache/infinispan/functional/BasicTransactionalTestCase.java
===================================================================
--- core/trunk/cache-infinispan/src/test/java/org/hibernate/test/cache/infinispan/functional/BasicTransactionalTestCase.java 2010-02-12 06:22:52 UTC (rev 18789)
+++ core/trunk/cache-infinispan/src/test/java/org/hibernate/test/cache/infinispan/functional/BasicTransactionalTestCase.java 2010-02-12 12:21:43 UTC (rev 18790)
@@ -287,4 +287,47 @@
commitOrRollbackTx();
}
}
+
+ public void testQueryCacheHitInSameTransaction() throws Exception {
+ Session s = null;
+ Item item = new Item("galder", "Galder's Item");
+
+ beginTx();
+ try {
+ s = openSession();
+ s.getTransaction().begin();
+ s.persist(item);
+ s.getTransaction().commit();
+ s.close();
+ } catch (Exception e) {
+ setRollbackOnlyTx(e);
+ } finally {
+ commitOrRollbackTx();
+ }
+
+ beginTx();
+ try {
+ s = openSession();
+ Statistics stats = s.getSessionFactory().getStatistics();
+ s.createQuery("from Item").setCacheable(true).list();
+ s.createQuery("from Item").setCacheable(true).list();
+ assertEquals(1, stats.getQueryCacheHitCount());
+ s.close();
+ } catch (Exception e) {
+ setRollbackOnlyTx(e);
+ } finally {
+ commitOrRollbackTx();
+ }
+
+ beginTx();
+ try {
+ s = openSession();
+ s.createQuery("delete from Item").executeUpdate();
+ s.close();
+ } catch (Exception e) {
+ setRollbackOnlyTx(e);
+ } finally {
+ commitOrRollbackTx();
+ }
+ }
}
More information about the hibernate-commits
mailing list