You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by jr...@apache.org on 2009/03/17 05:39:58 UTC
svn commit: r755113 - in /openjpa/trunk/openjpa-jdbc/src/main:
java/org/apache/openjpa/jdbc/kernel/
java/org/apache/openjpa/jdbc/meta/strats/
java/org/apache/openjpa/jdbc/schema/ java/org/apache/openjpa/jdbc/sql/
resources/org/apache/openjpa/jdbc/sql/
Author: jrbauer
Date: Tue Mar 17 04:39:56 2009
New Revision: 755113
URL: http://svn.apache.org/viewvc?rev=755113&view=rev
Log:
OPENJPA-878 Committing code, tests, and documentation updates for Donald Woods.
Modified:
openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/FinderQueryImpl.java
openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/JDBCStoreQuery.java
openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/NativeJDBCSeq.java
openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/PessimisticLockManager.java
openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/PreparedSQLStoreQuery.java
openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/SQLStoreQuery.java
openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/TableJDBCSeq.java
openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/ClassNameDiscriminatorStrategy.java
openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/MaxEmbeddedLobFieldStrategy.java
openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/schema/TableSchemaFactory.java
openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DB2Dictionary.java
openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DBDictionary.java
openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DerbyDictionary.java
openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/OracleDictionary.java
openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/PostgresDictionary.java
openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SQLErrorCodeReader.java
openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SQLExceptions.java
openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SelectImpl.java
openjpa/trunk/openjpa-jdbc/src/main/resources/org/apache/openjpa/jdbc/sql/sql-error-state-codes.xml
Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/FinderQueryImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/FinderQueryImpl.java?rev=755113&r1=755112&r2=755113&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/FinderQueryImpl.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/FinderQueryImpl.java Tue Mar 17 04:39:56 2009
@@ -149,7 +149,7 @@
dict.setUnknown(stmnt, i+1, params[i], _pkCols[i]);
}
}
-
+ dict.setTimeouts(stmnt, (JDBCFetchConfiguration)fetch, forUpdate);
rs = _select.executeQuery(conn, stmnt, getQueryString(), jstore,
params, _pkCols);
return _select.getEagerResult(conn, stmnt, rs, jstore,
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=755113&r1=755112&r2=755113&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 Mar 17 04:39:56 2009
@@ -30,6 +30,7 @@
import java.util.Map;
import org.apache.openjpa.event.LifecycleEventManager;
+import org.apache.openjpa.jdbc.conf.JDBCConfiguration;
import org.apache.openjpa.jdbc.kernel.exps.ExpContext;
import org.apache.openjpa.jdbc.kernel.exps.GetColumn;
import org.apache.openjpa.jdbc.kernel.exps.JDBCExpressionFactory;
@@ -512,6 +513,7 @@
stmnt = null;
try {
stmnt = prepareStatement(conn, sql[i]);
+ dict.setTimeouts(stmnt, fetch, true);
count += executeUpdate(conn, stmnt, sql[i], isUpdate);
} catch (SQLException se) {
throw SQLExceptions.getStore(se, sql[i].getSQL(),
Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/NativeJDBCSeq.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/NativeJDBCSeq.java?rev=755113&r1=755112&r2=755113&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/NativeJDBCSeq.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/NativeJDBCSeq.java Tue Mar 17 04:39:56 2009
@@ -290,10 +290,12 @@
*/
private long getSequence(Connection conn)
throws SQLException {
+ DBDictionary dict = _conf.getDBDictionaryInstance();
PreparedStatement stmnt = null;
ResultSet rs = null;
try {
stmnt = conn.prepareStatement(_select);
+ dict.setTimeouts(stmnt, _conf, false);
synchronized(this) {
rs = stmnt.executeQuery();
}
Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/PessimisticLockManager.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/PessimisticLockManager.java?rev=755113&r1=755112&r2=755113&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/PessimisticLockManager.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/PessimisticLockManager.java Tue Mar 17 04:39:56 2009
@@ -111,6 +111,7 @@
// construct; if not, and we the assertion does not throw an
// exception, then just return without locking
DBDictionary dict = _store.getDBDictionary();
+ JDBCFetchConfiguration fetch = _store.getFetchConfiguration();
if (dict.simulateLocking)
return;
dict.assertSupport(dict.supportsSelectForUpdate,
@@ -125,7 +126,7 @@
Select select = _store.getSQLFactory().newSelect();
select.select(mapping.getPrimaryKeyColumns());
select.wherePrimaryKey(id, mapping, _store);
- SQLBuffer sql = select.toSelect(true, _store.getFetchConfiguration());
+ SQLBuffer sql = select.toSelect(true, fetch);
ensureStoreManagerTransaction();
Connection conn = _store.getConnection();
@@ -133,7 +134,7 @@
ResultSet rs = null;
try {
stmnt = prepareStatement(conn, sql);
- setTimeout(stmnt, timeout);
+ dict.setTimeouts(stmnt, fetch, true);
rs = executeQuery(conn, stmnt, sql);
checkLock(rs, sm, timeout);
} catch (SQLException se) {
@@ -177,23 +178,6 @@
/**
* This method is to provide override for non-JDBC or JDBC-like
- * implementation of setting query timeout.
- */
- protected void setTimeout(PreparedStatement stmnt, int timeout)
- throws SQLException {
- DBDictionary dict = _store.getDBDictionary();
- if (timeout >= 0 && dict.supportsQueryTimeout) {
- if (timeout < 1000) {
- timeout = 1000;
- if (log.isWarnEnabled())
- log.warn(_loc.get("millis-query-timeout"));
- }
- stmnt.setQueryTimeout(timeout / 1000);
- }
- }
-
- /**
- * This method is to provide override for non-JDBC or JDBC-like
* implementation of executing query.
*/
protected ResultSet executeQuery(Connection conn, PreparedStatement stmnt,
Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/PreparedSQLStoreQuery.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/PreparedSQLStoreQuery.java?rev=755113&r1=755112&r2=755113&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/PreparedSQLStoreQuery.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/PreparedSQLStoreQuery.java Tue Mar 17 04:39:56 2009
@@ -24,6 +24,7 @@
import java.sql.SQLException;
import java.util.Map;
+import org.apache.openjpa.jdbc.conf.JDBCConfiguration;
import org.apache.openjpa.jdbc.meta.ClassMapping;
import org.apache.openjpa.jdbc.sql.DBDictionary;
import org.apache.openjpa.jdbc.sql.Result;
@@ -101,6 +102,8 @@
for (int i = 0; i < params.length; i++)
dict.setUnknown(stmnt, ++index, params[i], null);
+ dict.setTimeouts(stmnt, fetch, false);
+
ResultSet rs = stmnt.executeQuery();
SelectImpl cachedSelect = pq.getSelect();
Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/SQLStoreQuery.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/SQLStoreQuery.java?rev=755113&r1=755112&r2=755113&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/SQLStoreQuery.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/SQLStoreQuery.java Tue Mar 17 04:39:56 2009
@@ -34,6 +34,7 @@
import java.util.Set;
import org.apache.commons.lang.StringUtils;
+import org.apache.openjpa.jdbc.conf.JDBCConfiguration;
import org.apache.openjpa.jdbc.meta.ClassMapping;
import org.apache.openjpa.jdbc.meta.MappingRepository;
import org.apache.openjpa.jdbc.meta.QueryResultMapping;
@@ -166,6 +167,8 @@
if (stmnt != null)
buf.setParameters(stmnt);
+ dict.setTimeouts(stmnt, fetch, true);
+
int count = executeUpdate(store, conn, stmnt, buf);
return Numbers.valueOf(count);
@@ -218,6 +221,7 @@
stmnt != null;)
dict.setUnknown(stmnt, ++index, i.next(), null);
+ dict.setTimeouts(stmnt, fetch, false);
ResultSet rs = executeQuery(store, conn, stmnt, buf, paramList);
ResultSetResult res = stmnt != null ?
new ResultSetResult(conn, stmnt, rs, store) :
Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/TableJDBCSeq.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/TableJDBCSeq.java?rev=755113&r1=755112&r2=755113&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/TableJDBCSeq.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/TableJDBCSeq.java Tue Mar 17 04:39:56 2009
@@ -467,6 +467,7 @@
PreparedStatement stmnt = null;
try {
stmnt = prepareStatement(conn, insert);
+ dict.setTimeouts(stmnt, _conf, true);
executeUpdate(_conf, conn, stmnt, insert, RowImpl.ACTION_INSERT);
} finally {
if (stmnt != null)
@@ -508,9 +509,11 @@
null, false, dict.supportsSelectForUpdate, 0, Long.MAX_VALUE,
false, true);
- PreparedStatement stmnt = prepareStatement(conn, select);
+ PreparedStatement stmnt = null;
ResultSet rs = null;
try {
+ stmnt = prepareStatement(conn, select);
+ dict.setTimeouts(stmnt, _conf, false);
rs = executeQuery(_conf, conn, stmnt, select);
return getSequence(rs, dict);
} finally {
@@ -566,6 +569,7 @@
appendValue(Numbers.valueOf(cur), _seqColumn);
stmnt = prepareStatement(conn, upd);
+ dict.setTimeouts(stmnt, _conf, true);
updates = executeUpdate(_conf, conn, stmnt, upd, RowImpl.ACTION_UPDATE);
} finally {
if (rs != null)
Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/ClassNameDiscriminatorStrategy.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/ClassNameDiscriminatorStrategy.java?rev=755113&r1=755112&r2=755113&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/ClassNameDiscriminatorStrategy.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/ClassNameDiscriminatorStrategy.java Tue Mar 17 04:39:56 2009
@@ -24,6 +24,8 @@
import java.sql.SQLException;
import org.apache.commons.lang.StringUtils;
+import org.apache.openjpa.jdbc.conf.JDBCConfiguration;
+import org.apache.openjpa.jdbc.kernel.JDBCFetchConfiguration;
import org.apache.openjpa.jdbc.kernel.JDBCStore;
import org.apache.openjpa.jdbc.meta.ClassMapping;
import org.apache.openjpa.jdbc.schema.Column;
@@ -73,9 +75,9 @@
Column col = disc.getColumns()[0];
DBDictionary dict = store.getDBDictionary();
+ JDBCFetchConfiguration fetch = store.getFetchConfiguration();
SQLBuffer select = dict.toSelect(new SQLBuffer(dict).append(col),
- store.getFetchConfiguration(),
- new SQLBuffer(dict).append(col.getTable()), null, null,
+ fetch, new SQLBuffer(dict).append(col.getTable()), null, null,
null, null, true, false, 0, Long.MAX_VALUE);
Log log = disc.getMappingRepository().getLog();
@@ -88,6 +90,7 @@
ResultSet rs = null;
try {
stmnt = select.prepareStatement(conn);
+ dict.setTimeouts(stmnt, fetch, false);
rs = stmnt.executeQuery();
String className;
while (rs.next()) {
Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/MaxEmbeddedLobFieldStrategy.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/MaxEmbeddedLobFieldStrategy.java?rev=755113&r1=755112&r2=755113&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/MaxEmbeddedLobFieldStrategy.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/MaxEmbeddedLobFieldStrategy.java Tue Mar 17 04:39:56 2009
@@ -23,6 +23,7 @@
import java.sql.ResultSet;
import java.sql.SQLException;
+import org.apache.openjpa.jdbc.conf.JDBCConfiguration;
import org.apache.openjpa.jdbc.kernel.JDBCFetchConfiguration;
import org.apache.openjpa.jdbc.kernel.JDBCStore;
import org.apache.openjpa.jdbc.meta.JavaSQLTypes;
@@ -142,20 +143,23 @@
public void customUpdate(OpenJPAStateManager sm, JDBCStore store)
throws SQLException {
+ JDBCFetchConfiguration fetch = store.getFetchConfiguration();
// select existing value for update
Column col = field.getColumns()[0];
Select sel = store.getSQLFactory().newSelect();
sel.select(col);
field.wherePrimaryKey(sel, sm, store);
- SQLBuffer sql = sel.toSelect(true, store.getFetchConfiguration());
+ SQLBuffer sql = sel.toSelect(true, fetch);
Connection conn = store.getConnection();
+ DBDictionary dict = store.getDBDictionary();
PreparedStatement stmnt = null;
ResultSet rs = null;
try {
stmnt = sql.prepareStatement(conn,
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATABLE);
+ dict.setTimeouts(stmnt, fetch, true);
rs = stmnt.executeQuery();
rs.next();
Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/schema/TableSchemaFactory.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/schema/TableSchemaFactory.java?rev=755113&r1=755112&r2=755113&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/schema/TableSchemaFactory.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/schema/TableSchemaFactory.java Tue Mar 17 04:39:56 2009
@@ -235,7 +235,7 @@
+ " (" + _pkColumn + ", " + _schemaColumn + ") VALUES (?, ?)");
dict.setInt(stmnt, 1, 1, _pkColumn);
dict.setNull(stmnt, 2, _schemaColumn.getType(), _schemaColumn);
-
+ dict.setTimeouts(stmnt, _conf, true);
stmnt.executeUpdate();
} finally {
if (stmnt != null)
@@ -290,6 +290,7 @@
conn.setAutoCommit(true);
stmnt = select.prepareStatement(conn);
+ dict.setQueryTimeout(stmnt, _conf.getQueryTimeout());
rs = stmnt.executeQuery();
rs.next();
String schema = (_schemaColumn.getType() == Types.CLOB) ?
@@ -353,12 +354,14 @@
else
dict.setString(stmnt, 1, schema, _schemaColumn);
dict.setInt(stmnt, 2, 1, _pkColumn);
+ dict.setTimeouts(stmnt, _conf, true);
stmnt.executeUpdate();
} else {
stmnt = conn.prepareStatement(update,
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATABLE);
dict.setInt(stmnt, 1, 1, _pkColumn);
+ dict.setTimeouts(stmnt, _conf, true);
rs = stmnt.executeQuery();
rs.next();
dict.putString(rs.getClob(1), schema);
Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DB2Dictionary.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DB2Dictionary.java?rev=755113&r1=755112&r2=755113&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DB2Dictionary.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DB2Dictionary.java Tue Mar 17 04:39:56 2009
@@ -843,6 +843,10 @@
if (subtype == StoreException.LOCK && errorState.equals("57033")
&& ex.getMessage().indexOf("80") != -1) {
recoverable = Boolean.TRUE;
+ } else if (subtype == StoreException.QUERY && errorState.equals("57014")
+ && ex.getMessage().indexOf("40001") == -1) {
+ // FIXME drwoods - OPENJPA-964 - Need to determine expected DB2 behavior for query timeouts
+ recoverable = Boolean.TRUE;
}
}
return recoverable;
Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DBDictionary.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DBDictionary.java?rev=755113&r1=755112&r2=755113&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DBDictionary.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DBDictionary.java Tue Mar 17 04:39:56 2009
@@ -109,6 +109,7 @@
import org.apache.openjpa.util.ObjectNotFoundException;
import org.apache.openjpa.util.OpenJPAException;
import org.apache.openjpa.util.OptimisticException;
+import org.apache.openjpa.util.QueryException;
import org.apache.openjpa.util.ReferentialIntegrityException;
import org.apache.openjpa.util.Serialization;
import org.apache.openjpa.util.StoreException;
@@ -3649,7 +3650,7 @@
stmnt.setString(idx++, schemaName.toUpperCase());
if (sequenceName != null)
stmnt.setString(idx++, sequenceName);
-
+ setQueryTimeout(stmnt, conf.getQueryTimeout());
rs = executeQuery(conn, stmnt, str);
return getSequence(rs);
} finally {
@@ -4046,6 +4047,7 @@
PreparedStatement stmnt = prepareStatement(conn, query);
ResultSet rs = null;
try {
+ setQueryTimeout(stmnt, conf.getQueryTimeout());
rs = executeQuery(conn, stmnt, query);
return getKey(rs, col);
} finally {
@@ -4174,6 +4176,76 @@
}
}
+ /**
+ * FIXME - OPENJPA-957 - lockTimeout is a server-side function and
+ * shouldn't be using client-side setQueryTimeout for lock timeouts.
+ *
+ * This method is to provide override for non-JDBC or JDBC-like
+ * implementation of setting query and lock timeouts.
+ *
+ * @param stmnt
+ * @param fetch
+ * @param forUpdate - true if we should also try setting a lock timeout
+ * @throws SQLException
+ */
+ public void setTimeouts(PreparedStatement stmnt,
+ JDBCFetchConfiguration fetch, boolean forUpdate) throws SQLException {
+ if (this.supportsQueryTimeout) {
+ int timeout = fetch.getQueryTimeout();
+ if (forUpdate) {
+ // if this is a locking select and the lock timeout is greater
+ // than the configured query timeout, use the lock timeout
+ timeout = Math.max(fetch.getQueryTimeout(),
+ fetch.getLockTimeout());
+ }
+ setQueryTimeout(stmnt, timeout);
+ }
+ }
+
+ /**
+ * FIXME - OPENJPA-957 - lockTimeout is a server-side function and
+ * shouldn't be using client-side setQueryTimeout for lock timeouts.
+ *
+ * This method is to provide override for non-JDBC or JDBC-like
+ * implementation of setting query and lock timeouts.
+ *
+ * @param stmnt
+ * @param fetch
+ * @param forUpdate - true if we should also try setting a lock timeout
+ * @throws SQLException
+ */
+ public void setTimeouts(PreparedStatement stmnt, JDBCConfiguration conf,
+ boolean forUpdate) throws SQLException {
+ if (this.supportsQueryTimeout) {
+ int timeout = conf.getQueryTimeout();
+ if (forUpdate) {
+ // if this is a locking select and the lock timeout is greater
+ // than the configured query timeout, use the lock timeout
+ timeout = Math.max(conf.getQueryTimeout(),
+ conf.getLockTimeout());
+ }
+ setQueryTimeout(stmnt, timeout);
+ }
+ }
+
+ /**
+ * This method is to provide override for non-JDBC or JDBC-like
+ * implementation of setting query timeout.
+ */
+ public void setQueryTimeout(PreparedStatement stmnt, int timeout)
+ throws SQLException {
+ if (this.supportsQueryTimeout && timeout >= 0) {
+ if (timeout > 0 && timeout < 1000) {
+ timeout = 1000;
+ Log log = conf.getLog(JDBCConfiguration.LOG_JDBC);
+ if (log.isWarnEnabled())
+ log.warn(_loc.get("millis-query-timeout"));
+ }
+ stmnt.setQueryTimeout(timeout / 1000);
+ }
+ }
+
+
//////////////////////////////////////
// ConnectionDecorator implementation
//////////////////////////////////////
@@ -4276,6 +4348,9 @@
case StoreException.REFERENTIAL_INTEGRITY:
storeEx = new ReferentialIntegrityException(msg);
break;
+ case StoreException.QUERY:
+ storeEx = new QueryException(msg);
+ break;
default:
storeEx = new StoreException(msg);
}
@@ -4362,6 +4437,7 @@
stmnt = sql.prepareStatement(conn, store.getFetchConfiguration(),
ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
+ setTimeouts(stmnt, store.getFetchConfiguration(), true);
res = stmnt.executeQuery();
if (!res.next()) {
throw new InternalException(_loc.get("stream-exception"));
@@ -4395,6 +4471,7 @@
stmnt = sql.prepareStatement(conn, store.getFetchConfiguration(),
ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
+ setTimeouts(stmnt, store.getFetchConfiguration(), true);
res = stmnt.executeQuery();
if (!res.next()) {
throw new InternalException(_loc.get("stream-exception"));
Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DerbyDictionary.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DerbyDictionary.java?rev=755113&r1=755112&r2=755113&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DerbyDictionary.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DerbyDictionary.java Tue Mar 17 04:39:56 2009
@@ -113,7 +113,7 @@
int errorCode = ex.getErrorCode();
if (errorStates.contains(errorState)) {
recoverable = Boolean.FALSE;
- if (subtype == StoreException.LOCK && errorCode < 30000) {
+ if ((subtype == StoreException.LOCK || subtype == StoreException.QUERY) && errorCode < 30000) {
recoverable = Boolean.TRUE;
}
}
Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/OracleDictionary.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/OracleDictionary.java?rev=755113&r1=755112&r2=755113&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/OracleDictionary.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/OracleDictionary.java Tue Mar 17 04:39:56 2009
@@ -655,7 +655,7 @@
setString(stmnt, idx++, schemaName.toUpperCase(), null);
if (tableName != null)
setString(stmnt, idx++, tableName.toUpperCase(), null);
-
+ setTimeouts(stmnt, conf, false);
rs = stmnt.executeQuery();
List pkList = new ArrayList();
while (rs != null && rs.next())
@@ -703,6 +703,7 @@
if (tableName != null)
setString(stmnt, idx++, tableName.toUpperCase(), null);
+ setTimeouts(stmnt, conf, false);
rs = stmnt.executeQuery();
List idxList = new ArrayList();
while (rs != null && rs.next())
@@ -769,7 +770,7 @@
setString(stmnt, idx++, schemaName.toUpperCase(), null);
if (tableName != null)
setString(stmnt, idx++, tableName.toUpperCase(), null);
-
+ setTimeouts(stmnt, conf, false);
rs = stmnt.executeQuery();
List fkList = new ArrayList();
while (rs != null && rs.next())
@@ -888,6 +889,7 @@
+ ".currval FROM DUAL");
ResultSet rs = null;
try {
+ setTimeouts(stmnt, conf, false);
rs = stmnt.executeQuery();
rs.next();
return Numbers.valueOf(rs.getLong(1));
Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/PostgresDictionary.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/PostgresDictionary.java?rev=755113&r1=755112&r2=755113&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/PostgresDictionary.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/PostgresDictionary.java Tue Mar 17 04:39:56 2009
@@ -32,6 +32,7 @@
import java.util.Arrays;
import java.util.Date;
+import org.apache.openjpa.jdbc.kernel.JDBCFetchConfiguration;
import org.apache.openjpa.jdbc.kernel.JDBCStore;
import org.apache.openjpa.jdbc.kernel.exps.FilterValue;
import org.apache.openjpa.jdbc.schema.Column;
@@ -382,14 +383,16 @@
private void updatePostgresBlob(Row row, Column col, JDBCStore store,
Object ob, Select sel) throws SQLException {
- SQLBuffer sql = sel.toSelect(true, store.getFetchConfiguration());
+ JDBCFetchConfiguration fetch = store.getFetchConfiguration();
+ SQLBuffer sql = sel.toSelect(true, fetch);
ResultSet res = null;
DelegatingConnection conn =
(DelegatingConnection) store.getConnection();
PreparedStatement stmnt = null;
try {
- stmnt = sql.prepareStatement(conn, store.getFetchConfiguration(),
+ stmnt = sql.prepareStatement(conn, fetch,
ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
+ setTimeouts(stmnt, fetch, true);
res = stmnt.executeQuery();
if (!res.next()) {
throw new InternalException(_loc.get("stream-exception"));
@@ -443,14 +446,16 @@
}
public void deleteStream(JDBCStore store, Select sel) throws SQLException {
- SQLBuffer sql = sel.toSelect(true, store.getFetchConfiguration());
+ JDBCFetchConfiguration fetch = store.getFetchConfiguration();
+ SQLBuffer sql = sel.toSelect(true, fetch);
ResultSet res = null;
DelegatingConnection conn =
(DelegatingConnection) store.getConnection();
PreparedStatement stmnt = null;
try {
- stmnt = sql.prepareStatement(conn, store.getFetchConfiguration(),
+ stmnt = sql.prepareStatement(conn, fetch,
ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
+ setTimeouts(stmnt, fetch, true);
res = stmnt.executeQuery();
if (!res.next()) {
throw new InternalException(_loc.get("stream-exception"));
Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SQLErrorCodeReader.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SQLErrorCodeReader.java?rev=755113&r1=755112&r2=755113&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SQLErrorCodeReader.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SQLErrorCodeReader.java Tue Mar 17 04:39:56 2009
@@ -60,7 +60,7 @@
storeErrorTypes.put("optimistic", StoreException.OPTIMISTIC);
storeErrorTypes.put("referential-integrity",
StoreException.REFERENTIAL_INTEGRITY);
-
+ storeErrorTypes.put("query", StoreException.QUERY);
}
private static final Localizer _loc =
Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SQLExceptions.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SQLExceptions.java?rev=755113&r1=755112&r2=755113&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SQLExceptions.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SQLExceptions.java Tue Mar 17 04:39:56 2009
@@ -28,6 +28,7 @@
import org.apache.openjpa.lib.util.Localizer.Message;
import org.apache.openjpa.util.LockException;
import org.apache.openjpa.util.OpenJPAException;
+import org.apache.openjpa.util.QueryException;
import org.apache.openjpa.util.StoreException;
/**
@@ -130,6 +131,8 @@
if (storeEx.getSubtype() == StoreException.LOCK) {
LockException lockEx = (LockException) storeEx;
lockEx.setLockLevel(level);
+ } else if (storeEx.getSubtype() == StoreException.QUERY) {
+ QueryException QueryEx = (QueryException) storeEx;
}
return storeEx;
}
Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SelectImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SelectImpl.java?rev=755113&r1=755112&r2=755113&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SelectImpl.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SelectImpl.java Tue Mar 17 04:39:56 2009
@@ -322,6 +322,7 @@
stmnt = prepareStatement(conn, sql, null,
ResultSet.TYPE_FORWARD_ONLY,
ResultSet.CONCUR_READ_ONLY, false);
+ _dict.setQueryTimeout(stmnt, store.getFetchConfiguration().getQueryTimeout());
rs = executeQuery(conn, stmnt, sql, false, store);
return getCount(rs);
} finally {
@@ -377,7 +378,7 @@
else
stmnt = prepareStatement(conn, sql, null, rsType, -1, false);
- setTimeout(stmnt, forUpdate, fetch);
+ _dict.setTimeouts(stmnt, fetch, forUpdate);
rs = executeQuery(conn, stmnt, sql, isLRS, store);
} catch (SQLException se) {
@@ -450,27 +451,6 @@
/**
* This method is to provide override for non-JDBC or JDBC-like
- * implementation of setting query timeout.
- */
- protected void setTimeout(PreparedStatement stmnt, boolean forUpdate,
- JDBCFetchConfiguration fetch) throws SQLException {
- // if this is a locking select and the lock timeout is greater than
- // the configured query timeout, use the lock timeout
- if (forUpdate && _dict.supportsQueryTimeout && fetch != null
- && fetch.getLockTimeout() > stmnt.getQueryTimeout() * 1000) {
- int timeout = fetch.getLockTimeout();
- if (timeout < 1000) {
- timeout = 1000;
- Log log = _conf.getLog(JDBCConfiguration.LOG_JDBC);
- if (log.isWarnEnabled())
- log.warn(_loc.get("millis-query-timeout"));
- }
- stmnt.setQueryTimeout(timeout / 1000);
- }
- }
-
- /**
- * This method is to provide override for non-JDBC or JDBC-like
* implementation of executing query.
*/
protected ResultSet executeQuery(Connection conn, PreparedStatement stmnt,
Modified: openjpa/trunk/openjpa-jdbc/src/main/resources/org/apache/openjpa/jdbc/sql/sql-error-state-codes.xml
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/resources/org/apache/openjpa/jdbc/sql/sql-error-state-codes.xml?rev=755113&r1=755112&r2=755113&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/resources/org/apache/openjpa/jdbc/sql/sql-error-state-codes.xml (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/resources/org/apache/openjpa/jdbc/sql/sql-error-state-codes.xml Tue Mar 17 04:39:56 2009
@@ -29,11 +29,12 @@
<sql-state-codes>
<dictionary class="org.apache.openjpa.jdbc.sql.DB2Dictionary">
- <lock>40001,57033,57014</lock>
+ <lock>40001,57033</lock>
<referential-integrity>23502,42912,23001,23504,23511,23512,23513,23515,23520,23505</referential-integrity>
<object-exists></object-exists>
<object-not-found></object-not-found>
<optimistic></optimistic>
+ <query>57014</query>
</dictionary>
<dictionary class="org.apache.openjpa.jdbc.sql.DerbyDictionary">
@@ -42,6 +43,7 @@
<object-exists>23505</object-exists>
<object-not-found></object-not-found>
<optimistic></optimistic>
+ <query>XCL52</query>
</dictionary>
<dictionary class="org.apache.openjpa.jdbc.sql.SQLServerDictionary">
@@ -50,6 +52,7 @@
<object-exists></object-exists>
<object-not-found></object-not-found>
<optimistic>1205</optimistic>
+ <query></query>
</dictionary>
<dictionary class="org.apache.openjpa.jdbc.sql.SybaseDictionary">
@@ -58,6 +61,7 @@
<object-exists></object-exists>
<object-not-found></object-not-found>
<optimistic>1205</optimistic>
+ <query></query>
</dictionary>
<dictionary class="org.apache.openjpa.jdbc.sql.AccessDictionary">
@@ -66,6 +70,7 @@
<object-exists>23505,456c</object-exists>
<object-not-found></object-not-found>
<optimistic>40XL1,40001</optimistic>
+ <query></query>
</dictionary>
<dictionary class="org.apache.openjpa.jdbc.sql.CacheDictionary">
@@ -74,6 +79,7 @@
<object-exists>23505,456c</object-exists>
<object-not-found></object-not-found>
<optimistic>40XL1,40001</optimistic>
+ <query></query>
</dictionary>
<dictionary class="org.apache.openjpa.jdbc.sql.EmpressDictionary">
@@ -82,6 +88,7 @@
<object-exists>23505,456c</object-exists>
<object-not-found></object-not-found>
<optimistic>40XL1,40001</optimistic>
+ <query></query>
</dictionary>
<dictionary class="org.apache.openjpa.jdbc.sql.FoxProDictionary">
@@ -90,6 +97,7 @@
<object-exists>23505,456c</object-exists>
<object-not-found></object-not-found>
<optimistic>40XL1,40001</optimistic>
+ <query></query>
</dictionary>
<dictionary class="org.apache.openjpa.jdbc.sql.H2Dictionary">
@@ -98,6 +106,7 @@
<object-exists></object-exists>
<object-not-found></object-not-found>
<optimistic></optimistic>
+ <query></query>
</dictionary>
<dictionary class="org.apache.openjpa.jdbc.sql.HSQLDictionary">
@@ -106,6 +115,7 @@
<object-exists></object-exists>
<object-not-found></object-not-found>
<optimistic></optimistic>
+ <query></query>
</dictionary>
<dictionary class="org.apache.openjpa.jdbc.sql.InformixDictionary">
@@ -114,6 +124,7 @@
<object-exists></object-exists>
<object-not-found></object-not-found>
<optimistic></optimistic>
+ <query></query>
</dictionary>
<dictionary class="org.apache.openjpa.jdbc.sql.InterbaseDictionary">
@@ -122,6 +133,7 @@
<object-exists></object-exists>
<object-not-found></object-not-found>
<optimistic></optimistic>
+ <query></query>
</dictionary>
<dictionary class="org.apache.openjpa.jdbc.sql.FirebirdDictionary">
@@ -130,6 +142,7 @@
<object-exists></object-exists>
<object-not-found></object-not-found>
<optimistic></optimistic>
+ <query></query>
</dictionary>
<dictionary class="org.apache.openjpa.jdbc.sql.JDataStoreDictionary">
@@ -138,6 +151,7 @@
<object-exists></object-exists>
<object-not-found></object-not-found>
<optimistic></optimistic>
+ <query></query>
</dictionary>
<dictionary class="org.apache.openjpa.jdbc.sql.MySQLDictionary">
@@ -146,6 +160,7 @@
<object-exists>23000</object-exists>
<object-not-found></object-not-found>
<optimistic>41000,1205,1213</optimistic>
+ <query></query>
</dictionary>
<dictionary class="org.apache.openjpa.jdbc.sql.OracleDictionary">
@@ -154,6 +169,7 @@
<object-exists></object-exists>
<object-not-found></object-not-found>
<optimistic></optimistic>
+ <query></query>
</dictionary>
<dictionary class="org.apache.openjpa.jdbc.sql.PointbaseDictionary">
@@ -162,6 +178,7 @@
<object-exists></object-exists>
<object-not-found></object-not-found>
<optimistic></optimistic>
+ <query></query>
</dictionary>
<dictionary class="org.apache.openjpa.jdbc.sql.PostgresDictionary">
@@ -170,6 +187,7 @@
<object-exists></object-exists>
<object-not-found></object-not-found>
<optimistic>55P03</optimistic>
+ <query></query>
</dictionary>
</sql-state-codes>
\ No newline at end of file