You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by ht...@apache.org on 2012/10/19 04:19:57 UTC

svn commit: r1399948 - in /openjpa/branches/2.2.x/openjpa-jdbc/src/main: java/org/apache/openjpa/jdbc/kernel/NativeJDBCSeq.java java/org/apache/openjpa/jdbc/sql/DBDictionary.java resources/org/apache/openjpa/jdbc/kernel/localizer.properties

Author: hthomann
Date: Fri Oct 19 02:19:56 2012
New Revision: 1399948

URL: http://svn.apache.org/viewvc?rev=1399948&view=rev
Log:
OPENJPA-2196: Back-ported Albert's trunk changes to 2.2.x

Modified:
    openjpa/branches/2.2.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/NativeJDBCSeq.java
    openjpa/branches/2.2.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DBDictionary.java
    openjpa/branches/2.2.x/openjpa-jdbc/src/main/resources/org/apache/openjpa/jdbc/kernel/localizer.properties

Modified: openjpa/branches/2.2.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/NativeJDBCSeq.java
URL: http://svn.apache.org/viewvc/openjpa/branches/2.2.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/NativeJDBCSeq.java?rev=1399948&r1=1399947&r2=1399948&view=diff
==============================================================================
--- openjpa/branches/2.2.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/NativeJDBCSeq.java (original)
+++ openjpa/branches/2.2.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/NativeJDBCSeq.java Fri Oct 19 02:19:56 2012
@@ -82,6 +82,7 @@ public class NativeJDBCSeq
     private DBIdentifier _schema = DBIdentifier.NULL;
 
     private boolean alterIncrementBy = false;
+    private boolean alreadyLoggedAlterSeqFailure = false;
 
     /**
      * The sequence name. Defaults to <code>OPENJPA_SEQUENCE</code>.
@@ -218,7 +219,18 @@ public class NativeJDBCSeq
         try {
             if (!alterIncrementBy) {
                 DBDictionary dict = _conf.getDBDictionaryInstance();
-                udpateSql(conn, dict.getAlterSequenceSQL(_seq));
+                // If this fails, we will warn the user at most one time and set _allocated and _increment to 1 so
+                // as to not potentially insert records ahead of what the database thinks is the next sequence value.
+                if (updateSql(conn, dict.getAlterSequenceSQL(_seq)) == -1) {
+                    if (!alreadyLoggedAlterSeqFailure) {
+                        Log log = _conf.getLog(OpenJPAConfiguration.LOG_RUNTIME);
+                        if (log.isWarnEnabled()) {
+                            log.warn(_loc.get("fallback-no-seq-cache", _seqName));
+                        }
+                    }
+                    alreadyLoggedAlterSeqFailure = true;
+                    _allocate = 1;
+                }
             }
             _nextValue = getSequence(conn);
             _maxValue = _nextValue + _allocate * _increment;
@@ -311,7 +323,7 @@ public class NativeJDBCSeq
         }
     }
 
-    private int udpateSql(Connection conn, String sql) throws SQLException {
+    private int updateSql(Connection conn, String sql) throws SQLException {
         DBDictionary dict = _conf.getDBDictionaryInstance();
         PreparedStatement stmnt = null;
         int rc = -1;
@@ -320,7 +332,8 @@ public class NativeJDBCSeq
             dict.setTimeouts(stmnt, _conf, false);
             rc = stmnt.executeUpdate();
         } catch (Exception e) {
-            // tolerate exception when attempting to alter increment
+            // tolerate exception when attempting to alter increment,
+            // however, caller should check rc and not cache sequence values if rc != -1.
         } finally {
             // clean up our resources
             if (stmnt != null) {

Modified: openjpa/branches/2.2.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DBDictionary.java
URL: http://svn.apache.org/viewvc/openjpa/branches/2.2.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DBDictionary.java?rev=1399948&r1=1399947&r2=1399948&view=diff
==============================================================================
--- openjpa/branches/2.2.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DBDictionary.java (original)
+++ openjpa/branches/2.2.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DBDictionary.java Fri Oct 19 02:19:56 2012
@@ -3489,7 +3489,7 @@ public class DBDictionary
         buf.append(seqName);
         if (create && seq.getInitialValue() != 0)
             buf.append(" START WITH ").append(seq.getInitialValue());
-        if ((seq.getIncrement() > 1) || (seq.getAllocate() > 1))
+        if ((seq.getIncrement() >= 1) || (seq.getAllocate() >= 1))
             buf.append(" INCREMENT BY ").append(seq.getIncrement() * seq.getAllocate());
         return new String[]{ buf.toString() };
     }

Modified: openjpa/branches/2.2.x/openjpa-jdbc/src/main/resources/org/apache/openjpa/jdbc/kernel/localizer.properties
URL: http://svn.apache.org/viewvc/openjpa/branches/2.2.x/openjpa-jdbc/src/main/resources/org/apache/openjpa/jdbc/kernel/localizer.properties?rev=1399948&r1=1399947&r2=1399948&view=diff
==============================================================================
--- openjpa/branches/2.2.x/openjpa-jdbc/src/main/resources/org/apache/openjpa/jdbc/kernel/localizer.properties (original)
+++ openjpa/branches/2.2.x/openjpa-jdbc/src/main/resources/org/apache/openjpa/jdbc/kernel/localizer.properties Fri Oct 19 02:19:56 2012
@@ -172,4 +172,7 @@ exclude-in-expression: Query "{0}" is no
 exclude-user-strategy: Query "{0}" is not cached because some parameterized \
     field value depends on user-defined field strategy.        
 exclude-pagination: Query "{0}" is not cached because it uses pagination.
+fallback-no-seq-cache: Unable to cache sequence values for sequence "{0}". \
+    This can occur if your application is not configured connecting to the \
+    database with the appropriate permission to execute an ALTER SEQUENCE command.
       
\ No newline at end of file