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/12/30 02:20:56 UTC
svn commit: r491147 - in
/incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel:
AbstractJDBCSeq.java NativeJDBCSeq.java TableJDBCSeq.java
Author: pcl
Date: Fri Dec 29 17:20:55 2006
New Revision: 491147
URL: http://svn.apache.org/viewvc?view=rev&rev=491147
Log:
Code changes for OPENJPA-93: sequence maintainance in JTA env without non-JTA datasource. This has been nominally tested in WebLogic Server.
Modified:
incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/AbstractJDBCSeq.java
incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/NativeJDBCSeq.java
incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/TableJDBCSeq.java
Modified: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/AbstractJDBCSeq.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/AbstractJDBCSeq.java?view=diff&rev=491147&r1=491146&r2=491147
==============================================================================
--- incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/AbstractJDBCSeq.java (original)
+++ incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/AbstractJDBCSeq.java Fri Dec 29 17:20:55 2006
@@ -18,6 +18,8 @@
import java.sql.Connection;
import java.sql.SQLException;
import javax.sql.DataSource;
+import javax.transaction.Transaction;
+import javax.transaction.TransactionManager;
import org.apache.openjpa.jdbc.conf.JDBCConfiguration;
import org.apache.openjpa.jdbc.meta.ClassMapping;
@@ -40,6 +42,7 @@
protected int type = TYPE_DEFAULT;
protected Object current = null;
+ private transient Transaction _outerTransaction;
/**
* Records the sequence type.
@@ -106,6 +109,11 @@
protected abstract Object nextInternal(JDBCStore store,
ClassMapping mapping)
throws Exception;
+
+ /**
+ * Return the {@link JDBCConfiguration} for this sequence.
+ */
+ public abstract JDBCConfiguration getConfiguration();
/**
* Return the current sequence object. By default returns the last
@@ -140,13 +148,24 @@
throws SQLException {
if (type == TYPE_TRANSACTIONAL || type == TYPE_CONTIGUOUS)
return store.getConnection();
-
- JDBCConfiguration conf = store.getConfiguration();
- DataSource ds = conf.getDataSource2(store.getContext());
- Connection conn = ds.getConnection();
- if (conn.getAutoCommit())
- conn.setAutoCommit(false);
- return conn;
+ else if (suspendInJTA()) {
+ try {
+ TransactionManager tm = getConfiguration()
+ .getManagedRuntimeInstance().getTransactionManager();
+ _outerTransaction = tm.suspend();
+ tm.begin();
+ return store.getConnection();
+ } catch (Exception e) {
+ throw new StoreException(e);
+ }
+ } else {
+ JDBCConfiguration conf = store.getConfiguration();
+ DataSource ds = conf.getDataSource2(store.getContext());
+ Connection conn = ds.getConnection();
+ if (conn.getAutoCommit())
+ conn.setAutoCommit(false);
+ return conn;
+ }
}
/**
@@ -156,13 +175,41 @@
if (conn == null)
return;
- try {
- if (type != TYPE_TRANSACTIONAL && type != TYPE_CONTIGUOUS)
+ if (type == TYPE_TRANSACTIONAL || type == TYPE_CONTIGUOUS) {
+ // do nothing; this seq is part of the business transaction
+ return;
+ } else if (suspendInJTA()) {
+ try {
+ TransactionManager tm = getConfiguration()
+ .getManagedRuntimeInstance().getTransactionManager();
+ tm.commit();
+ try { conn.close(); } catch (SQLException se) {}
+
+ if (_outerTransaction != null)
+ tm.resume(_outerTransaction);
+
+ } catch (Exception e) {
+ throw new StoreException(e);
+ } finally {
+ _outerTransaction = null;
+ }
+ } else {
+ try {
conn.commit();
- } catch (SQLException se) {
- throw SQLExceptions.getStore(se);
- } finally {
- try { conn.close(); } catch (SQLException se) {}
+ } catch (SQLException se) {
+ throw SQLExceptions.getStore(se);
+ } finally {
+ try { conn.close(); } catch (SQLException se) {}
+ }
}
+ }
+
+ /**
+ * Detect whether or not OpenJPA should suspend the transaction in
+ * a managed environment.
+ */
+ protected boolean suspendInJTA() {
+ return getConfiguration().isConnectionFactoryModeManaged() &&
+ getConfiguration().getConnectionFactory2() == null;
}
}
Modified: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/NativeJDBCSeq.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/NativeJDBCSeq.java?view=diff&rev=491147&r1=491146&r2=491147
==============================================================================
--- incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/NativeJDBCSeq.java (original)
+++ incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/NativeJDBCSeq.java Fri Dec 29 17:20:55 2006
@@ -172,6 +172,10 @@
schema.importSequence(_seq);
}
+ public JDBCConfiguration getConfiguration() {
+ return _conf;
+ }
+
public void setConfiguration(Configuration conf) {
_conf = (JDBCConfiguration) conf;
}
Modified: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/TableJDBCSeq.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/TableJDBCSeq.java?view=diff&rev=491147&r1=491146&r2=491147
==============================================================================
--- incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/TableJDBCSeq.java (original)
+++ incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/TableJDBCSeq.java Fri Dec 29 17:20:55 2006
@@ -330,7 +330,8 @@
try {
// possible that we might get errors when inserting if
// another thread/process is inserting same pk at same time
- SQLException err = null;
+ SQLException err = null;
+ // ### why does this not call getConnection() / closeConnection()?
conn = _conf.getDataSource2(store.getContext()).getConnection();
try {
insertSequence(mapping, conn);
@@ -377,7 +378,7 @@
appendValue(Numbers.valueOf(1), _seqColumn).append(")");
boolean wasAuto = conn.getAutoCommit();
- if (!wasAuto)
+ if (!wasAuto && !suspendInJTA())
conn.setAutoCommit(true);
PreparedStatement stmnt = null;
@@ -387,7 +388,7 @@
} finally {
if (stmnt != null)
try { stmnt.close(); } catch (SQLException se) {}
- if (!wasAuto)
+ if (!wasAuto && !suspendInJTA())
conn.setAutoCommit(false);
}
}