You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by pc...@apache.org on 2006/11/07 20:33:44 UTC
svn commit: r472218 - in /incubator/openjpa/trunk:
openjpa-kernel/src/main/java/org/apache/openjpa/conf/
openjpa-kernel/src/main/java/org/apache/openjpa/kernel/
openjpa-kernel/src/main/java/org/apache/openjpa/meta/
openjpa-kernel/src/main/resources/org...
Author: pcl
Date: Tue Nov 7 11:33:43 2006
New Revision: 472218
URL: http://svn.apache.org/viewvc?view=rev&rev=472218
Log:
Moved Kodo query compilation cache into OpenJPA.
Added:
incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/conf/QueryCompilationCacheValue.java
Modified:
incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/conf/OpenJPAConfiguration.java
incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/conf/OpenJPAConfigurationImpl.java
incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/QueryImpl.java
incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/ClassMetaData.java
incubator/openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/conf/localizer.properties
incubator/openjpa/trunk/openjpa-project/src/doc/manual/ref_guide_caching.xml
incubator/openjpa/trunk/openjpa-project/src/doc/manual/ref_guide_conf.xml
incubator/openjpa/trunk/openjpa-project/src/doc/manual/ref_guide_optimization.xml
Modified: incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/conf/OpenJPAConfiguration.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/conf/OpenJPAConfiguration.java?view=diff&rev=472218&r1=472217&r2=472218
==============================================================================
--- incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/conf/OpenJPAConfiguration.java (original)
+++ incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/conf/OpenJPAConfiguration.java Tue Nov 7 11:33:43 2006
@@ -16,6 +16,7 @@
package org.apache.openjpa.conf;
import java.util.Collection;
+import java.util.Map;
import org.apache.openjpa.datacache.DataCache;
import org.apache.openjpa.datacache.DataCacheManager;
@@ -1355,6 +1356,27 @@
* Backwards compatibility options.
*/
public Compatibility getCompatibilityInstance ();
+
+ /**
+ * Configuration settings for the query compilation cache to use.
+ * @see QueryCompilationCacheValue
+ * @since 0.9.6
+ */
+ public String getQueryCompilationCache();
+
+ /**
+ * Configuration settings for the query compilation cache to use.
+ * @see QueryCompilationCacheValue
+ * @since 0.9.6
+ */
+ public void setQueryCompilationCache(String conf);
+
+ /**
+ * Configuration settings for the query compilation cache to use.
+ * @see QueryCompilationCacheValue
+ * @since 0.9.6
+ */
+ public Map getQueryCompilationCacheInstance();
/**
* Return the {@link StoreFacadeTypeRegistry} instance associated with this
Modified: incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/conf/OpenJPAConfigurationImpl.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/conf/OpenJPAConfigurationImpl.java?view=diff&rev=472218&r1=472217&r2=472218
==============================================================================
--- incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/conf/OpenJPAConfigurationImpl.java (original)
+++ incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/conf/OpenJPAConfigurationImpl.java Tue Nov 7 11:33:43 2006
@@ -17,6 +17,8 @@
import java.util.Collection;
import java.util.HashSet;
+import java.util.Map;
+
import org.apache.commons.lang.StringUtils;
import org.apache.openjpa.datacache.ConcurrentDataCache;
import org.apache.openjpa.datacache.ConcurrentQueryCache;
@@ -59,8 +61,8 @@
extends ConfigurationImpl
implements OpenJPAConfiguration {
- private static final Localizer _loc = Localizer.forPackage
- (OpenJPAConfigurationImpl.class);
+ private static final Localizer _loc =
+ Localizer.forPackage(OpenJPAConfigurationImpl.class);
// cached state; some of this is created in getter methods, so make
// protected in case subclasses want to access without creating
@@ -124,6 +126,7 @@
public ObjectValue savepointManagerPlugin;
public ObjectValue orphanedKeyPlugin;
public ObjectValue compatibilityPlugin;
+ public QueryCompilationCacheValue queryCompilationCachePlugin;
// custom values
public BrokerFactoryValue brokerFactoryPlugin;
@@ -162,11 +165,11 @@
String[] aliases;
classResolverPlugin = addPlugin("ClassResolver", true);
- aliases = new String[]{
- "default", "org.apache.openjpa.util.ClassResolverImpl",
- // deprecated alias
- "spec", "org.apache.openjpa.util.ClassResolverImpl",
- };
+ aliases =
+ new String[] { "default",
+ "org.apache.openjpa.util.ClassResolverImpl",
+ // deprecated alias
+ "spec", "org.apache.openjpa.util.ClassResolverImpl", };
classResolverPlugin.setAliases(aliases);
classResolverPlugin.setDefault(aliases[0]);
classResolverPlugin.setString(aliases[0]);
@@ -176,26 +179,24 @@
addValue(brokerFactoryPlugin);
brokerPlugin = addPlugin("BrokerImpl", false);
- aliases = new String[]{ "default", BrokerImpl.class.getName() };
+ aliases = new String[] { "default", BrokerImpl.class.getName() };
brokerPlugin.setAliases(aliases);
brokerPlugin.setDefault(aliases[0]);
brokerPlugin.setString(aliases[0]);
dataCacheManagerPlugin = addPlugin("DataCacheManager", true);
- aliases = new String[]{
- "default", DataCacheManagerImpl.class.getName(),
- };
+ aliases =
+ new String[] { "default", DataCacheManagerImpl.class.getName(), };
dataCacheManagerPlugin.setAliases(aliases);
dataCacheManagerPlugin.setDefault(aliases[0]);
dataCacheManagerPlugin.setString(aliases[0]);
dataCacheManagerPlugin.setInstantiatingGetter("getDataCacheManager");
dataCachePlugin = addPlugin("DataCache", false);
- aliases = new String[]{
- "false", null,
- "true", ConcurrentDataCache.class.getName(),
- "concurrent", ConcurrentDataCache.class.getName(),
- };
+ aliases =
+ new String[] { "false", null, "true",
+ ConcurrentDataCache.class.getName(), "concurrent",
+ ConcurrentDataCache.class.getName(), };
dataCachePlugin.setAliases(aliases);
dataCachePlugin.setDefault(aliases[0]);
dataCachePlugin.setString(aliases[0]);
@@ -205,11 +206,10 @@
dataCacheTimeout.set(-1);
queryCachePlugin = addPlugin("QueryCache", true);
- aliases = new String[]{
- "true", ConcurrentQueryCache.class.getName(),
- "concurrent", ConcurrentQueryCache.class.getName(),
- "false", null,
- };
+ aliases =
+ new String[] { "true", ConcurrentQueryCache.class.getName(),
+ "concurrent", ConcurrentQueryCache.class.getName(), "false",
+ null, };
queryCachePlugin.setAliases(aliases);
queryCachePlugin.setDefault(aliases[0]);
queryCachePlugin.setString(aliases[0]);
@@ -219,71 +219,67 @@
dynamicDataStructs.set(false);
lockManagerPlugin = addPlugin("LockManager", false);
- aliases = new String[]{
- "none", "org.apache.openjpa.kernel.NoneLockManager",
- "version", "org.apache.openjpa.kernel.VersionLockManager",
- };
+ aliases =
+ new String[] { "none", "org.apache.openjpa.kernel.NoneLockManager",
+ "version", "org.apache.openjpa.kernel.VersionLockManager", };
lockManagerPlugin.setAliases(aliases);
lockManagerPlugin.setDefault(aliases[0]);
lockManagerPlugin.setString(aliases[0]);
inverseManagerPlugin = addPlugin("InverseManager", false);
- aliases = new String[]{
- "false", null,
- "true", "org.apache.openjpa.kernel.InverseManager",
- };
+ aliases =
+ new String[] { "false", null, "true",
+ "org.apache.openjpa.kernel.InverseManager", };
inverseManagerPlugin.setAliases(aliases);
inverseManagerPlugin.setDefault(aliases[0]);
inverseManagerPlugin.setString(aliases[0]);
savepointManagerPlugin = addPlugin("SavepointManager", true);
- aliases = new String[]{
- "in-mem", "org.apache.openjpa.kernel.InMemorySavepointManager",
- };
+ aliases =
+ new String[] { "in-mem",
+ "org.apache.openjpa.kernel.InMemorySavepointManager", };
savepointManagerPlugin.setAliases(aliases);
savepointManagerPlugin.setDefault(aliases[0]);
savepointManagerPlugin.setString(aliases[0]);
- savepointManagerPlugin.setInstantiatingGetter
- ("getSavepointManagerInstance");
+ savepointManagerPlugin
+ .setInstantiatingGetter("getSavepointManagerInstance");
orphanedKeyPlugin = addPlugin("OrphanedKeyAction", true);
- aliases = new String[]{
- "log", "org.apache.openjpa.event.LogOrphanedKeyAction",
- "exception", "org.apache.openjpa.event.ExceptionOrphanedKeyAction",
- "none", "org.apache.openjpa.event.NoneOrphanedKeyAction",
- };
+ aliases =
+ new String[] { "log",
+ "org.apache.openjpa.event.LogOrphanedKeyAction", "exception",
+ "org.apache.openjpa.event.ExceptionOrphanedKeyAction", "none",
+ "org.apache.openjpa.event.NoneOrphanedKeyAction", };
orphanedKeyPlugin.setAliases(aliases);
orphanedKeyPlugin.setDefault(aliases[0]);
orphanedKeyPlugin.setString(aliases[0]);
- orphanedKeyPlugin.setInstantiatingGetter
- ("getOrphanedKeyActionInstance");
+ orphanedKeyPlugin
+ .setInstantiatingGetter("getOrphanedKeyActionInstance");
remoteProviderPlugin = new RemoteCommitProviderValue();
addValue(remoteProviderPlugin);
transactionMode = addBoolean("TransactionMode");
- aliases = new String[]{
- "local", "false",
- "managed", "true",
- };
+ aliases = new String[] { "local", "false", "managed", "true", };
transactionMode.setAliases(aliases);
transactionMode.setDefault(aliases[0]);
managedRuntimePlugin = addPlugin("ManagedRuntime", true);
- aliases = new String[]{
- "auto", "org.apache.openjpa.ee.AutomaticManagedRuntime",
- "jndi", "org.apache.openjpa.ee.JNDIManagedRuntime",
- "invocation", "org.apache.openjpa.ee.InvocationManagedRuntime",
- };
+ aliases =
+ new String[] { "auto",
+ "org.apache.openjpa.ee.AutomaticManagedRuntime", "jndi",
+ "org.apache.openjpa.ee.JNDIManagedRuntime", "invocation",
+ "org.apache.openjpa.ee.InvocationManagedRuntime", };
managedRuntimePlugin.setAliases(aliases);
managedRuntimePlugin.setDefault(aliases[0]);
managedRuntimePlugin.setString(aliases[0]);
- managedRuntimePlugin.setInstantiatingGetter
- ("getManagedRuntimeInstance");
+ managedRuntimePlugin
+ .setInstantiatingGetter("getManagedRuntimeInstance");
proxyManagerPlugin = addPlugin("ProxyManager", true);
- aliases = new String[]{ "default",
- "org.apache.openjpa.util.ProxyManagerImpl" };
+ aliases =
+ new String[] { "default",
+ "org.apache.openjpa.util.ProxyManagerImpl" };
proxyManagerPlugin.setAliases(aliases);
proxyManagerPlugin.setDefault(aliases[0]);
proxyManagerPlugin.setString(aliases[0]);
@@ -293,8 +289,9 @@
metaFactoryPlugin = addPlugin("MetaDataFactory", false);
metaRepositoryPlugin = addPlugin("MetaDataRepository", false);
- aliases = new String[]{ "default",
- "org.apache.openjpa.meta.MetaDataRepository" };
+ aliases =
+ new String[] { "default",
+ "org.apache.openjpa.meta.MetaDataRepository" };
metaRepositoryPlugin.setAliases(aliases);
metaRepositoryPlugin.setDefault(aliases[0]);
metaRepositoryPlugin.setString(aliases[0]);
@@ -317,15 +314,12 @@
connection2URL = addString("Connection2URL");
connection2DriverName = addString("Connection2DriverName");
connection2Properties = addString("Connection2Properties");
- connectionFactory2Properties = addString(
- "ConnectionFactory2Properties");
+ connectionFactory2Properties =
+ addString("ConnectionFactory2Properties");
connectionFactory2Name = addString("ConnectionFactory2Name");
connectionFactoryMode = addBoolean("ConnectionFactoryMode");
- aliases = new String[]{
- "local", "false",
- "managed", "true",
- };
+ aliases = new String[] { "local", "false", "managed", "true", };
connectionFactoryMode.setAliases(aliases);
connectionFactoryMode.setDefault(aliases[0]);
@@ -334,10 +328,10 @@
optimistic.set(true);
autoClear = addInt("AutoClear");
- aliases = new String[]{
- "datastore", String.valueOf(AutoClear.CLEAR_DATASTORE),
- "all", String.valueOf(AutoClear.CLEAR_ALL),
- };
+ aliases =
+ new String[] { "datastore",
+ String.valueOf(AutoClear.CLEAR_DATASTORE), "all",
+ String.valueOf(AutoClear.CLEAR_ALL), };
autoClear.setAliases(aliases);
autoClear.setDefault(aliases[0]);
autoClear.set(AutoClear.CLEAR_DATASTORE);
@@ -348,14 +342,13 @@
retainState.set(true);
restoreState = addInt("RestoreState");
- aliases = new String[]{
- "none", String.valueOf(RestoreState.RESTORE_NONE),
- "false", String.valueOf(RestoreState.RESTORE_NONE),
- "immutable", String.valueOf(RestoreState.RESTORE_IMMUTABLE),
- // "true" for compat with jdo RestoreValues
- "true", String.valueOf(RestoreState.RESTORE_IMMUTABLE),
- "all", String.valueOf(RestoreState.RESTORE_ALL),
- };
+ aliases =
+ new String[] { "none", String.valueOf(RestoreState.RESTORE_NONE),
+ "false", String.valueOf(RestoreState.RESTORE_NONE),
+ "immutable", String.valueOf(RestoreState.RESTORE_IMMUTABLE),
+ // "true" for compat with jdo RestoreValues
+ "true", String.valueOf(RestoreState.RESTORE_IMMUTABLE), "all",
+ String.valueOf(RestoreState.RESTORE_ALL), };
restoreState.setAliases(aliases);
restoreState.setDefault(aliases[0]);
restoreState.set(RestoreState.RESTORE_IMMUTABLE);
@@ -365,11 +358,10 @@
addValue(autoDetach);
detachStatePlugin = addPlugin("DetachState", true);
- aliases = new String[]{
- "loaded", DetachOptions.Loaded.class.getName(),
- "fgs", DetachOptions.FetchGroups.class.getName(),
- "all", DetachOptions.All.class.getName(),
- };
+ aliases =
+ new String[] { "loaded", DetachOptions.Loaded.class.getName(),
+ "fgs", DetachOptions.FetchGroups.class.getName(), "all",
+ DetachOptions.All.class.getName(), };
detachStatePlugin.setAliases(aliases);
detachStatePlugin.setDefault(aliases[0]);
detachStatePlugin.setString(aliases[0]);
@@ -394,15 +386,14 @@
fetchGroups = addStringList("FetchGroups");
fetchGroups.setDefault("default");
- fetchGroups.set(new String[]{ "default" });
+ fetchGroups.set(new String[] { "default" });
flushBeforeQueries = addInt("FlushBeforeQueries");
- aliases = new String[]{
- "true", String.valueOf(QueryFlushModes.FLUSH_TRUE),
- "false", String.valueOf(QueryFlushModes.FLUSH_FALSE),
- "with-connection", String.valueOf
- (QueryFlushModes.FLUSH_WITH_CONNECTION),
- };
+ aliases =
+ new String[] { "true", String.valueOf(QueryFlushModes.FLUSH_TRUE),
+ "false", String.valueOf(QueryFlushModes.FLUSH_FALSE),
+ "with-connection",
+ String.valueOf(QueryFlushModes.FLUSH_WITH_CONNECTION), };
flushBeforeQueries.setAliases(aliases);
flushBeforeQueries.setDefault(aliases[0]);
flushBeforeQueries.set(QueryFlushModes.FLUSH_TRUE);
@@ -413,22 +404,20 @@
lockTimeout.set(-1);
readLockLevel = addInt("ReadLockLevel");
- aliases = new String[]{
- "read", String.valueOf(LockLevels.LOCK_READ),
- "write", String.valueOf(LockLevels.LOCK_WRITE),
- "none", String.valueOf(LockLevels.LOCK_NONE),
- };
+ aliases =
+ new String[] { "read", String.valueOf(LockLevels.LOCK_READ),
+ "write", String.valueOf(LockLevels.LOCK_WRITE), "none",
+ String.valueOf(LockLevels.LOCK_NONE), };
readLockLevel.setAliases(aliases);
readLockLevel.setDefault(aliases[0]);
readLockLevel.set(LockLevels.LOCK_READ);
readLockLevel.setAliasListComprehensive(true);
writeLockLevel = addInt("WriteLockLevel");
- aliases = new String[]{
- "read", String.valueOf(LockLevels.LOCK_READ),
- "write", String.valueOf(LockLevels.LOCK_WRITE),
- "none", String.valueOf(LockLevels.LOCK_NONE),
- };
+ aliases =
+ new String[] { "read", String.valueOf(LockLevels.LOCK_READ),
+ "write", String.valueOf(LockLevels.LOCK_WRITE), "none",
+ String.valueOf(LockLevels.LOCK_NONE), };
writeLockLevel.setAliases(aliases);
writeLockLevel.setDefault(aliases[1]);
writeLockLevel.set(LockLevels.LOCK_WRITE);
@@ -439,38 +428,40 @@
addValue(seqPlugin);
connectionRetainMode = addInt("ConnectionRetainMode");
- aliases = new String[]{
- "on-demand",
- String.valueOf(ConnectionRetainModes.CONN_RETAIN_DEMAND),
- "transaction",
- String.valueOf(ConnectionRetainModes.CONN_RETAIN_TRANS),
- "always",
- String.valueOf(ConnectionRetainModes.CONN_RETAIN_ALWAYS),
- // deprecated
- "persistence-manager",
- String.valueOf(ConnectionRetainModes.CONN_RETAIN_ALWAYS),
- };
+ aliases =
+ new String[] { "on-demand",
+ String.valueOf(ConnectionRetainModes.CONN_RETAIN_DEMAND),
+ "transaction",
+ String.valueOf(ConnectionRetainModes.CONN_RETAIN_TRANS),
+ "always",
+ String.valueOf(ConnectionRetainModes.CONN_RETAIN_ALWAYS),
+ // deprecated
+ "persistence-manager",
+ String.valueOf(ConnectionRetainModes.CONN_RETAIN_ALWAYS), };
connectionRetainMode.setAliases(aliases);
connectionRetainMode.setDefault(aliases[0]);
connectionRetainMode.setAliasListComprehensive(true);
connectionRetainMode.set(ConnectionRetainModes.CONN_RETAIN_DEMAND);
filterListenerPlugins = addPluginList("FilterListeners");
- filterListenerPlugins.setInstantiatingGetter
- ("getFilterListenerInstances");
+ filterListenerPlugins
+ .setInstantiatingGetter("getFilterListenerInstances");
aggregateListenerPlugins = addPluginList("AggregateListeners");
- aggregateListenerPlugins.setInstantiatingGetter
- ("getAggregateListenerInstances");
+ aggregateListenerPlugins
+ .setInstantiatingGetter("getAggregateListenerInstances");
retryClassRegistration = addBoolean("RetryClassRegistration");
compatibilityPlugin = addPlugin("Compatibility", true);
- aliases = new String[]{ "default", Compatibility.class.getName() };
+ aliases = new String[] { "default", Compatibility.class.getName() };
compatibilityPlugin.setAliases(aliases);
compatibilityPlugin.setDefault(aliases[0]);
compatibilityPlugin.setString(aliases[0]);
compatibilityPlugin.setInstantiatingGetter("getCompatibilityInstance");
+
+ queryCompilationCachePlugin = new QueryCompilationCacheValue(this);
+ addValue(queryCompilationCachePlugin);
// initialize supported options that some runtimes may not support
supportedOptions.add(OPTION_NONTRANS_READ);
@@ -510,8 +501,8 @@
if (this.spec != null) {
if (!this.spec.equals(spec)
&& getConfigurationLog().isWarnEnabled())
- getConfigurationLog().warn(_loc.get("diff-specs", this.spec,
- spec));
+ getConfigurationLog().warn(
+ _loc.get("diff-specs", this.spec, spec));
return false;
}
this.spec = spec;
@@ -558,8 +549,8 @@
}
public BrokerImpl newBrokerInstance(String user, String pass) {
- BrokerImpl broker = (BrokerImpl) brokerPlugin.instantiate
- (BrokerImpl.class, this);
+ BrokerImpl broker =
+ (BrokerImpl) brokerPlugin.instantiate(BrokerImpl.class, this);
if (broker != null)
broker.setAuthentication(user, pass);
return broker;
@@ -584,8 +575,9 @@
public DataCacheManager getDataCacheManagerInstance() {
DataCacheManager dcm = (DataCacheManager) dataCacheManagerPlugin.get();
if (dcm == null) {
- dcm = (DataCacheManager) dataCacheManagerPlugin.instantiate
- (DataCacheManager.class, this);
+ dcm =
+ (DataCacheManager) dataCacheManagerPlugin.instantiate(
+ DataCacheManager.class, this);
dcm.initialize(this, dataCachePlugin, queryCachePlugin);
}
return dcm;
@@ -662,8 +654,8 @@
}
public InverseManager newInverseManagerInstance() {
- return (InverseManager) inverseManagerPlugin.instantiate
- (InverseManager.class, this);
+ return (InverseManager) inverseManagerPlugin.instantiate(
+ InverseManager.class, this);
}
public void setSavepointManager(String savepointManager) {
@@ -714,8 +706,8 @@
return remoteProviderPlugin.instantiateProvider(this);
}
- public void setRemoteCommitEventManager
- (RemoteCommitEventManager remoteEventManager) {
+ public void setRemoteCommitEventManager(
+ RemoteCommitEventManager remoteEventManager) {
assertNotReadOnly();
this.remoteEventManager = remoteEventManager;
remoteProviderPlugin.configureEventManager(remoteEventManager);
@@ -806,8 +798,8 @@
}
public MetaDataFactory newMetaDataFactoryInstance() {
- return (MetaDataFactory) metaFactoryPlugin.instantiate
- (MetaDataFactory.class, this);
+ return (MetaDataFactory) metaFactoryPlugin.instantiate(
+ MetaDataFactory.class, this);
}
public void setMetaDataRepository(String meta) {
@@ -831,8 +823,8 @@
}
public MetaDataRepository newMetaDataRepositoryInstance() {
- return (MetaDataRepository) metaRepositoryPlugin.instantiate
- (MetaDataRepository.class, this);
+ return (MetaDataRepository) metaRepositoryPlugin.instantiate(
+ MetaDataRepository.class, this);
}
public void setConnectionUserName(String connectionUserName) {
@@ -880,8 +872,8 @@
return connectionProperties.getString();
}
- public void setConnectionFactoryProperties
- (String connectionFactoryProperties) {
+ public void setConnectionFactoryProperties(
+ String connectionFactoryProperties) {
assertNotReadOnly();
this.connectionFactoryProperties.setString(connectionFactoryProperties);
}
@@ -924,8 +916,8 @@
public Object getConnectionFactory() {
if (connectionFactory.get() == null)
- connectionFactory.set(lookupConnectionFactory
- (getConnectionFactoryName()), true);
+ connectionFactory.set(
+ lookupConnectionFactory(getConnectionFactoryName()), true);
return connectionFactory.get();
}
@@ -984,11 +976,11 @@
return connection2Properties.getString();
}
- public void setConnectionFactory2Properties
- (String connectionFactory2Properties) {
+ public void setConnectionFactory2Properties(
+ String connectionFactory2Properties) {
assertNotReadOnly();
- this.connectionFactory2Properties.setString
- (connectionFactory2Properties);
+ this.connectionFactory2Properties
+ .setString(connectionFactory2Properties);
}
public String getConnectionFactory2Properties() {
@@ -1011,8 +1003,8 @@
public Object getConnectionFactory2() {
if (connectionFactory2.get() == null)
- connectionFactory2.set(lookupConnectionFactory
- (getConnectionFactory2Name()), false);
+ connectionFactory2.set(
+ lookupConnectionFactory(getConnectionFactory2Name()), false);
return connectionFactory2.get();
}
@@ -1392,6 +1384,21 @@
return (Compatibility) compatibilityPlugin.get();
}
+ public String getQueryCompilationCache() {
+ return queryCompilationCachePlugin.getString();
+ }
+
+ public void setQueryCompilationCache(String conf) {
+ queryCompilationCachePlugin.setString(conf);
+ }
+
+ public Map getQueryCompilationCacheInstance() {
+ if (queryCompilationCachePlugin.get() == null)
+ queryCompilationCachePlugin.instantiate(
+ QueryCompilationCacheValue.class, this);
+ return (Map) queryCompilationCachePlugin.get();
+ }
+
public StoreFacadeTypeRegistry getStoreFacadeTypeRegistry() {
return _storeFacadeRegistry;
}
@@ -1410,5 +1417,5 @@
public Log getConfigurationLog() {
return getLog(LOG_RUNTIME);
- }
+ }
}
Added: incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/conf/QueryCompilationCacheValue.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/conf/QueryCompilationCacheValue.java?view=auto&rev=472218
==============================================================================
--- incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/conf/QueryCompilationCacheValue.java (added)
+++ incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/conf/QueryCompilationCacheValue.java Tue Nov 7 11:33:43 2006
@@ -0,0 +1,60 @@
+package org.apache.openjpa.conf;
+
+import java.util.*;
+
+import org.apache.openjpa.lib.conf.*;
+import org.apache.openjpa.lib.util.concurrent.*;
+import org.apache.openjpa.util.*;
+
+/**
+ * <p>A cache of compiled queries.</p>
+ *
+ * @author Abe White
+ * @since 0.9.6 (also existed in prior versions of Kodo)
+ * @nojavadoc
+ */
+public class QueryCompilationCacheValue
+ extends PluginValue {
+
+ /**
+ * Query compilation cache configuration property key.
+ */
+ private static final String KEY = "QueryCompilationCache";
+
+ public static final String[] ALIASES = {
+ "true", CacheMap.class.getName(),
+ "all", ConcurrentHashMap.class.getName(),
+ "false", null,
+ };
+
+ private final OpenJPAConfiguration _conf;
+
+ public QueryCompilationCacheValue(OpenJPAConfiguration conf) {
+ super(KEY, true);
+ setAliases(ALIASES);
+ setDefault(ALIASES[0]);
+ setClassName(ALIASES[1]);
+ setInstantiatingGetter("this.instantiate");
+ setScope(getClass());
+ _conf = conf;
+ }
+
+ /**
+ * Instantiate internal map.
+ */
+ public void instantiate() {
+ if (get() == null)
+ instantiate(Map.class, _conf, true);
+ }
+
+ public Object newInstance(String clsName, Class type,
+ Configuration conf, boolean fatal) {
+ // make sure map handles concurrency
+ Map map = (Map) super.newInstance(clsName, type, conf, fatal);
+ if (map != null && !(map instanceof Hashtable)
+ && !(map instanceof CacheMap)
+ && !(map instanceof ConcurrentMap))
+ map = Collections.synchronizedMap(map);
+ return map;
+ }
+}
Modified: incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/QueryImpl.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/QueryImpl.java?view=diff&rev=472218&r1=472217&r2=472218
==============================================================================
--- incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/QueryImpl.java (original)
+++ incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/QueryImpl.java Tue Nov 7 11:33:43 2006
@@ -15,6 +15,7 @@
*/
package org.apache.openjpa.kernel;
+import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
@@ -26,6 +27,7 @@
import java.util.Map;
import org.apache.commons.collections.map.LinkedMap;
+import org.apache.commons.lang.ObjectUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.openjpa.conf.OpenJPAConfiguration;
import org.apache.openjpa.enhance.PersistenceCapable;
@@ -574,7 +576,7 @@
_readOnly = false;
_compiling = true;
try {
- _compiled = newCompilation();
+ _compiled = compilationFromCache();
return _compiled;
} catch (OpenJPAException ke) {
throw ke;
@@ -589,7 +591,38 @@
/**
* Create and initialize a query compilation based on current data.
*/
- protected Compilation newCompilation() {
+ protected Compilation compilationFromCache() {
+ Map compCache =
+ _broker.getConfiguration().getQueryCompilationCacheInstance();
+ if (compCache == null) {
+ return newCompilation();
+ } else {
+ CompilationKey key = new CompilationKey();
+ key.queryType = _storeQuery.getClass();
+ key.candidateType = getCandidateType();
+ key.subclasses = hasSubclasses();
+ key.query = getQueryString();
+ key.language = getLanguage();
+ key.storeKey = _storeQuery.newCompilationKey();
+ Compilation comp = (Compilation) compCache.get(key);
+
+ // parse declarations if needed
+ boolean cache = false;
+ if (comp == null) {
+ comp = newCompilation();
+ // only cache those queries that can be compiled
+ cache = comp.storeData != null;
+ } else
+ _storeQuery.populateFromCompilation(comp.storeData);
+
+ // cache parsed state if needed
+ if (cache)
+ compCache.put(key, comp);
+ return comp;
+ }
+ }
+
+ private Compilation newCompilation() {
Compilation comp = new Compilation();
comp.storeData = _storeQuery.newCompilation();
_storeQuery.populateFromCompilation(comp.storeData);
@@ -2044,4 +2077,52 @@
return _res;
}
}
+
+ /**
+ * Struct to hold the unparsed properties associated with a query.
+ */
+ private static class CompilationKey
+ implements Serializable {
+
+ public Class queryType = null;
+ public Class candidateType = null;
+ public boolean subclasses = true;
+ public String query = null;
+ public String language = null;
+ public Object storeKey = null;
+
+ public int hashCode() {
+ int rs = 17;
+ rs = 37 * rs + ((queryType == null) ? 0 : queryType.hashCode());
+ rs = 37 * rs + ((query == null) ? 0 : query.hashCode());
+ rs = 37 * rs + ((language == null) ? 0 : language.hashCode());
+ rs = 37 * rs + ((storeKey == null) ? 0 : storeKey.hashCode());
+ return rs;
+ }
+
+ public boolean equals(Object other) {
+ if (other == this)
+ return true;
+ if (other == null || other.getClass() != getClass())
+ return false;
+
+ CompilationKey key = (CompilationKey) other;
+ if (key.queryType != queryType
+ || !StringUtils.equals(key.query, query)
+ || !StringUtils.equals(key.language, language))
+ return false;
+
+ if (!ObjectUtils.equals(key.storeKey, storeKey))
+ return false;
+
+ // allow either candidate type to be null because it might be
+ // encoded in the query string, but if both are set then they
+ // must be equal
+ if (candidateType != null && key.candidateType != null)
+ return candidateType == key.candidateType
+ && subclasses == key.subclasses;
+
+ return true;
+ }
+ }
}
Modified: incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/ClassMetaData.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/ClassMetaData.java?view=diff&rev=472218&r1=472217&r2=472218
==============================================================================
--- incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/ClassMetaData.java (original)
+++ incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/ClassMetaData.java Tue Nov 7 11:33:43 2006
@@ -1900,7 +1900,6 @@
String cap;
int type;
Class c;
- ClassMetaData idmeta;
int access = meta.getAccessType();
for (int i = 0; i < fmds.length; i++) {
switch (fmds[i].getDeclaredTypeCode()) {
Modified: incubator/openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/conf/localizer.properties
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/conf/localizer.properties?view=diff&rev=472218&r1=472217&r2=472218
==============================================================================
--- incubator/openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/conf/localizer.properties (original)
+++ incubator/openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/conf/localizer.properties Tue Nov 7 11:33:43 2006
@@ -532,6 +532,17 @@
Compatibility-expert: true
Compatibility-interface: org.apache.openjpa.conf.Compatibility
+QueryCompilationCache-name: Query compilation cache
+QueryCompilationCache-desc: Plugin used to cache query compilation data. \
+ Must implement java.util.Map. Does not need to be thread-safe -- it will \
+ be wrapped via the Collections.synchronizedMap() method if it does not \
+ extend org.apache.openjpa.util.CacheMap.
+QueryCompilationCache-type: General
+QueryCompilationCache-cat: Cache.Queries
+QueryCompilationCache-displayorder: 50
+QueryCompilationCache-expert: true
+QueryCompilationCache-interface: java.util.Map
+
no-named-cf: use a DataSource bound to JNDI
diff-specs: Attempt to configure for multiple specifications. Was configured \
for "{0}". Attempt to now configure for "{1}". This attempt will be \
Modified: incubator/openjpa/trunk/openjpa-project/src/doc/manual/ref_guide_caching.xml
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-project/src/doc/manual/ref_guide_caching.xml?view=diff&rev=472218&r1=472217&r2=472218
==============================================================================
--- incubator/openjpa/trunk/openjpa-project/src/doc/manual/ref_guide_caching.xml (original)
+++ incubator/openjpa/trunk/openjpa-project/src/doc/manual/ref_guide_caching.xml Tue Nov 7 11:33:43 2006
@@ -788,4 +788,82 @@
</itemizedlist>
</section>
</section>
+ <section id="ref_guide_cache_querycomp">
+ <title>Query Compilation Cache</title>
+ <indexterm zone="ref_guide_cache_querycomp">
+ <primary>caching</primary>
+ <secondary>query compilation cache</secondary>
+ </indexterm>
+ <para>
+ The query compilation cache is a <classname>Map</classname> used to
+ cache parsed query strings. As a result, most queries are
+ only parsed once in OpenJPA, and cached thereafter. You can control the
+ compilation cache through the
+ <link linkend="openjpa.QueryCompilationCache"><literal>
+ openjpa.QueryCompilationCache</literal></link> configuration property.
+ This property accepts a plugin string (see
+ <xref linkend="ref_guide_conf_plugins"/>) describing the
+ <classname>Map</classname> used to associate query strings and their
+ parsed form. This property accepts the following aliases:
+ </para>
+ <table>
+ <title>Pre-defined aliases</title>
+ <tgroup cols="2" align="left" colsep="1" rowsep="1">
+ <colspec colname="alias"/>
+ <colspec colname="value"/>
+ <colspec colname="notes"/>
+ <thead>
+ <row>
+ <entry colname="alias">Alias</entry>
+ <entry colname="value">Value</entry>
+ <entry colname="notes">Notes</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry colname="alias">
+ <literal>true</literal>
+ </entry>
+ <entry colname="value">
+ <literal>org.apache.openjpa.util.CacheMap</literal>
+ </entry>
+ <entry colname="notes">
+ The default option. Uses a
+ <ulink url="&javadoc-dir;/org/apache/openjpa/util/CacheMap.html">
+ <literal>CacheMap</literal></ulink> to store
+ compilation data. <literal>CacheMap</literal> uses
+ a least-recently-used strategy for a fixed number
+ of cache entries, and an optional soft reference
+ map for entries that are moved out of the LRU
+ space. So, for applications that have a
+ monotonically increasing number of distinct queries,
+ this option can be used to ensure that a fixed
+ amount of memory is used by the cache.
+ </entry>
+ </row>
+ <row>
+ <entry colname="alias"><literal>all</literal></entry>
+ <entry colname="value">
+ <literal>org.apache.openjpa.lib.util.ConcurrentHashMap</literal>
+ </entry>
+ <entry colname="notes">
+ This is the fastest option, but compilation data is
+ never dropped from the cache, so if you use a large
+ number of dynamic queries, this option may result in
+ ever-increasing memory usage. Note that if your
+ queries only differ in the values of the parameters,
+ this should not be an issue.
+ </entry>
+ </row>
+ <row>
+ <entry colname="alias"><literal>false</literal></entry>
+ <entry colname="value"><emphasis>none</emphasis></entry>
+ <entry colname="notes">
+ Disables the compilation cache.
+ </entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ </section>
</chapter>
Modified: incubator/openjpa/trunk/openjpa-project/src/doc/manual/ref_guide_conf.xml
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-project/src/doc/manual/ref_guide_conf.xml?view=diff&rev=472218&r1=472217&r2=472218
==============================================================================
--- incubator/openjpa/trunk/openjpa-project/src/doc/manual/ref_guide_conf.xml (original)
+++ incubator/openjpa/trunk/openjpa-project/src/doc/manual/ref_guide_conf.xml Tue Nov 7 11:33:43 2006
@@ -2454,6 +2454,34 @@
<xref linkend="ref_guide_cache_query"/> for details.
</para>
</section>
+ <section id="openjpa.QueryCompilationCache">
+ <title>openjpa.QueryCompilationCache</title>
+ <indexterm zone="openjpa.QueryCompilationCache">
+ <primary>QueryCompilationCache</primary>
+ </indexterm>
+ <indexterm zone="openjpa.QueryCompilationCache">
+ <primary>caching</primary>
+ <secondary>QueryCompilationCache</secondary>
+ </indexterm>
+ <para>
+ <emphasis role="bold">Property name:</emphasis>
+ <literal>openjpa.QueryCompilationCache</literal>
+ </para>
+ <para>
+ <emphasis role="bold">Resource adaptor config-property:</emphasis>
+ <literal>QueryCompilationCache</literal>
+ </para>
+ <para>
+ <emphasis role="bold">Default:</emphasis> <literal>true</literal>.
+ </para>
+ <para>
+ <emphasis role="bold">Description:</emphasis> A plugin
+ string (see <xref linkend="ref_guide_conf_plugins"/>)
+ describing the <literal>java.util.Map</literal> to use for
+ caching of data used during query compilation.
+ See <xref linkend="ref_guide_cache_querycomp"/> for details.
+ </para>
+ </section>
<section id="openjpa.ReadLockLevel">
<title>
openjpa.ReadLockLevel
Modified: incubator/openjpa/trunk/openjpa-project/src/doc/manual/ref_guide_optimization.xml
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-project/src/doc/manual/ref_guide_optimization.xml?view=diff&rev=472218&r1=472217&r2=472218
==============================================================================
--- incubator/openjpa/trunk/openjpa-project/src/doc/manual/ref_guide_optimization.xml (original)
+++ incubator/openjpa/trunk/openjpa-project/src/doc/manual/ref_guide_optimization.xml Tue Nov 7 11:33:43 2006
@@ -489,6 +489,22 @@
<classname>TreeSet</classname>.
</entry>
</row>
+ <row>
+ <entry colname="name">
+ <emphasis role="bold">Use query parameters instead of
+ encoding search data in filter strings</emphasis>
+ <para><emphasis>performance</emphasis></para>
+ </entry>
+ <entry colname="desc">
+ If your queries depend on parameter data only known at
+ runtime, you should use query parameters rather than
+ dynamically building different query strings. OpenJPA
+ performs aggressive caching of query compilation
+ data, and the effectiveness of this cache is diminished if
+ multiple query filters are used where a single one could
+ have sufficed.
+ </entry>
+ </row>
<row>
<entry colname="name">
<emphasis role="bold">