You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by pp...@apache.org on 2008/12/17 07:23:01 UTC
svn commit: r727297 - in /openjpa/trunk:
openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/
openjpa-kernel/src/main/java/org/apache/openjpa/kernel/
openjpa-slice/src/main/java/org/apache/openjpa/slice/jdbc/
Author: ppoddar
Date: Tue Dec 16 22:23:00 2008
New Revision: 727297
URL: http://svn.apache.org/viewvc?rev=727297&view=rev
Log:
OPENJPA-825: Cache unique flag for query to avoid lcoking. Use StateManager's instance lock rather than acquiring Broker's lock.
Modified:
openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/JDBCStoreQuery.java
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/QueryImpl.java
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/StateManagerImpl.java
openjpa/trunk/openjpa-slice/src/main/java/org/apache/openjpa/slice/jdbc/DistributedStoreQuery.java
Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/JDBCStoreQuery.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/JDBCStoreQuery.java?rev=727297&r1=727296&r2=727297&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/JDBCStoreQuery.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/JDBCStoreQuery.java Tue Dec 16 22:23:00 2008
@@ -56,6 +56,7 @@
import org.apache.openjpa.kernel.Filters;
import org.apache.openjpa.kernel.OpenJPAStateManager;
import org.apache.openjpa.kernel.OrderingMergedResultObjectProvider;
+import org.apache.openjpa.kernel.QueryContext;
import org.apache.openjpa.kernel.QueryHints;
import org.apache.openjpa.kernel.exps.Constant;
import org.apache.openjpa.kernel.exps.ExpressionFactory;
@@ -83,6 +84,7 @@
public class JDBCStoreQuery
extends ExpressionStoreQuery {
+ private boolean _isUnique = false;
private static final Table INVALID = new Table();
// add all standard filter and aggregate listeners to these maps
@@ -110,6 +112,11 @@
_store = store;
}
+ @Override
+ public void setContext(QueryContext ctx) {
+ super.setContext(ctx);
+ _isUnique = ctx.isUnique();
+ }
/**
* Return the store.
*/
@@ -341,7 +348,7 @@
evaluate(ctx, null, null, exps[i], states[i]);
if (optHint != null)
sel.setExpectedResultCount(optHint.intValue(), true);
- else if (this.ctx.isUnique())
+ else if (_isUnique)
sel.setExpectedResultCount(1, false);
for (int j = 0; j < verts.length; j++) {
selMappings.add(verts[j]);
@@ -423,7 +430,7 @@
long end) {
if (exps.projections.length > 0 || start >= end)
return EagerFetchModes.EAGER_NONE;
- if (end - start == 1 || ctx.isUnique())
+ if (end - start == 1 || _isUnique)
return EagerFetchModes.EAGER_JOIN;
return EagerFetchModes.EAGER_PARALLEL;
}
Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/QueryImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/QueryImpl.java?rev=727297&r1=727296&r2=727297&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/QueryImpl.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/QueryImpl.java Tue Dec 16 22:23:00 2008
@@ -458,8 +458,8 @@
// no explicit setting; default
StoreQuery.Executor ex = compileForExecutor();
if (!ex.isAggregate(_storeQuery))
- return false;
- return !ex.hasGrouping(_storeQuery);
+ return _unique = false;
+ return _unique = !ex.hasGrouping(_storeQuery);
} finally {
unlock();
}
Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/StateManagerImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/StateManagerImpl.java?rev=727297&r1=727296&r2=727297&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/StateManagerImpl.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/StateManagerImpl.java Tue Dec 16 22:23:00 2008
@@ -34,6 +34,7 @@
import java.util.HashMap;
import java.util.Iterator;
import java.util.TimeZone;
+import java.util.concurrent.locks.ReentrantLock;
import org.apache.commons.lang.StringUtils;
import org.apache.openjpa.conf.OpenJPAConfiguration;
@@ -147,6 +148,8 @@
// information about the owner of this instance, if it is embedded
private StateManagerImpl _owner = null;
private int _ownerIndex = -1;
+
+ private transient ReentrantLock _instanceLock = null;
/**
* Constructor; supply id, type metadata, and owning persistence manager.
@@ -157,6 +160,8 @@
_meta = meta;
_broker = broker;
_single = new SingleFieldManager(this, broker);
+ if (broker.getMultithreaded())
+ _instanceLock = new ReentrantLock();
if (_meta.getIdentityType() == ClassMetaData.ID_UNKNOWN)
throw new UserException(_loc.get("meta-unknownid", _meta));
@@ -3184,19 +3189,16 @@
* Lock the state manager if the multithreaded option is set.
*/
protected void lock() {
- // use broker-level lock to avoid deadlock situations with the state
- // manager lock and broker lock being obtained in different orders
- _broker.lock();
+ if (_instanceLock != null)
+ _instanceLock.lock();
}
/**
* Unlock the state manager.
*/
- protected void unlock ()
- {
- // use broker-level lock to avoid deadlock situations with the state
- // manager lock and broker lock being obtained in different orders
- _broker.unlock ();
+ protected void unlock () {
+ if (_instanceLock != null)
+ _instanceLock.unlock();
}
private void writeObject(ObjectOutputStream oos) throws IOException {
Modified: openjpa/trunk/openjpa-slice/src/main/java/org/apache/openjpa/slice/jdbc/DistributedStoreQuery.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-slice/src/main/java/org/apache/openjpa/slice/jdbc/DistributedStoreQuery.java?rev=727297&r1=727296&r2=727297&view=diff
==============================================================================
--- openjpa/trunk/openjpa-slice/src/main/java/org/apache/openjpa/slice/jdbc/DistributedStoreQuery.java (original)
+++ openjpa/trunk/openjpa-slice/src/main/java/org/apache/openjpa/slice/jdbc/DistributedStoreQuery.java Tue Dec 16 22:23:00 2008
@@ -108,7 +108,7 @@
super(dsq, meta, subclasses, parser, parsed);
owner = dsq;
threadPool = dsq.getExecutorServiceInstance();
- serialMode = serial;
+ serialMode = false;//serial;
}
public void addExecutor(Executor ex) {