arminw 2005/04/26 17:23:53
Modified: src/java/org/apache/ojb/broker/accesslayer Tag:
OJB_1_0_RELEASE ConnectionManagerImpl.java
src/java/org/apache/ojb/broker/core Tag: OJB_1_0_RELEASE
PersistenceBrokerFactorySyncImpl.java
PersistenceBrokerImpl.java
src/java/org/apache/ojb/broker/platforms Tag:
OJB_1_0_RELEASE PlatformDefaultImpl.java
src/test/org/apache/ojb Tag: OJB_1_0_RELEASE
repository_database.xml
Log:
make handling of OJB in managed environments more flexible, introduce methods
is/setManaged in PBImpl. Now the ConnectionManager can decide (using the new
'managed' flag) when it's allowed to change the autoCommit state and to
commit/rollback a connection (in managed environment it's not allowed to do
this). A specific ConnectionFactory implementation
(ConnectionFactoryManagedImpl) is no longer needed
Revision Changes Path
No revision
No revision
1.17.2.3 +53 -17
db-ojb/src/java/org/apache/ojb/broker/accesslayer/ConnectionManagerImpl.java
Index: ConnectionManagerImpl.java
===================================================================
RCS file:
/home/cvs/db-ojb/src/java/org/apache/ojb/broker/accesslayer/ConnectionManagerImpl.java,v
retrieving revision 1.17.2.2
retrieving revision 1.17.2.3
diff -u -r1.17.2.2 -r1.17.2.3
--- ConnectionManagerImpl.java 27 Jan 2005 00:11:17 -0000 1.17.2.2
+++ ConnectionManagerImpl.java 27 Apr 2005 00:23:52 -0000 1.17.2.3
@@ -25,6 +25,7 @@
import org.apache.ojb.broker.TransactionAbortedException;
import org.apache.ojb.broker.TransactionInProgressException;
import org.apache.ojb.broker.TransactionNotInProgressException;
+import org.apache.ojb.broker.core.PersistenceBrokerImpl;
import org.apache.ojb.broker.metadata.JdbcConnectionDescriptor;
import org.apache.ojb.broker.metadata.MetadataManager;
import org.apache.ojb.broker.platforms.Platform;
@@ -44,7 +45,7 @@
{
private Logger log =
LoggerFactory.getLogger(ConnectionManagerImpl.class);
- private PersistenceBroker broker = null;
+ private PersistenceBrokerImpl broker = null;
private ConnectionFactory connectionFactory;
private JdbcConnectionDescriptor jcd;
private Platform platform;
@@ -57,7 +58,8 @@
public ConnectionManagerImpl(PersistenceBroker broker)
{
- this.broker = broker;
+ // TODO: avoid this cast
+ this.broker = (PersistenceBrokerImpl) broker;
this.pbKey = broker.getPBKey();
this.jcd =
MetadataManager.getInstance().connectionRepository().getDescriptor(pbKey);
this.connectionFactory =
ConnectionFactoryFactory.getInstance().createConnectionFactory();
@@ -168,10 +170,20 @@
throw new PersistenceBrokerException("Can't lookup a
connection", e);
}
if (log.isDebugEnabled()) log.debug("localBegin was called for con "
+ connection);
- if (jcd.getUseAutoCommit() ==
JdbcConnectionDescriptor.AUTO_COMMIT_SET_TRUE_AND_TEMPORARY_FALSE)
+ // change autoCommit state only if we are not in a managed
environment
+ // and it is enabled by user
+ if(!broker.isManaged())
{
- if (log.isDebugEnabled()) log.debug("Try to change autoCommit
state to 'false'");
- platform.changeAutoCommitState(jcd, connection, false);
+ if (jcd.getUseAutoCommit() ==
JdbcConnectionDescriptor.AUTO_COMMIT_SET_TRUE_AND_TEMPORARY_FALSE)
+ {
+ if (log.isDebugEnabled()) log.debug("Try to change
autoCommit state to 'false'");
+ platform.changeAutoCommitState(jcd, connection, false);
+ }
+ }
+ else
+ {
+ if(log.isDebugEnabled()) log.debug(
+ "Found managed environment setting in PB, will skip
Platform.changeAutoCommitState(...) call");
}
this.isInLocalTransaction = true;
}
@@ -188,13 +200,21 @@
}
try
{
- if (batchCon != null)
+ if(!broker.isManaged())
{
- batchCon.commit();
+ if (batchCon != null)
+ {
+ batchCon.commit();
+ }
+ else if (con != null)
+ {
+ con.commit();
+ }
}
- else if (con != null)
+ else
{
- con.commit();
+ if(log.isDebugEnabled()) log.debug(
+ "Found managed environment setting in PB, will skip
Connection.commit() call");
}
}
catch (SQLException e)
@@ -225,13 +245,21 @@
{
//truncate the local transaction
this.isInLocalTransaction = false;
- if (batchCon != null)
+ if(!broker.isManaged())
{
- batchCon.rollback();
+ if (batchCon != null)
+ {
+ batchCon.rollback();
+ }
+ else if (con != null && !con.isClosed())
+ {
+ con.rollback();
+ }
}
- else if (con != null && !con.isClosed())
+ else
{
- con.rollback();
+ if(log.isEnabledFor(Logger.INFO)) log.info(
+ "Found managed environment setting in PB, will
ignore rollback call on connection, this should be done by JTA");
}
}
catch (SQLException e)
@@ -259,10 +287,18 @@
{
try
{
- if (jcd.getUseAutoCommit() ==
JdbcConnectionDescriptor.AUTO_COMMIT_SET_TRUE_AND_TEMPORARY_FALSE
- && originalAutoCommitState == true && con != null &&
!con.isClosed())
+ if(!broker.isManaged())
+ {
+ if (jcd.getUseAutoCommit() ==
JdbcConnectionDescriptor.AUTO_COMMIT_SET_TRUE_AND_TEMPORARY_FALSE
+ && originalAutoCommitState == true && con != null &&
!con.isClosed())
+ {
+ platform.changeAutoCommitState(jcd, con, true);
+ }
+ }
+ else
{
- platform.changeAutoCommitState(jcd, con, true);
+ if(log.isDebugEnabled()) log.debug(
+ "Found managed environment setting in PB, will skip
Platform.changeAutoCommitState(...) call");
}
}
catch (SQLException e)
No revision
No revision
1.7.2.4 +7 -1
db-ojb/src/java/org/apache/ojb/broker/core/PersistenceBrokerFactorySyncImpl.java
Index: PersistenceBrokerFactorySyncImpl.java
===================================================================
RCS file:
/home/cvs/db-ojb/src/java/org/apache/ojb/broker/core/PersistenceBrokerFactorySyncImpl.java,v
retrieving revision 1.7.2.3
retrieving revision 1.7.2.4
diff -u -r1.7.2.3 -r1.7.2.4
--- PersistenceBrokerFactorySyncImpl.java 3 Apr 2005 02:11:29 -0000
1.7.2.3
+++ PersistenceBrokerFactorySyncImpl.java 27 Apr 2005 00:23:52 -0000
1.7.2.4
@@ -110,6 +110,7 @@
PersistenceBrokerSyncHandle result;
if (tx != null)
{
+ // try to find a broker instance already used by current tx
obtainedBroker = txRegistry.findBroker(tx, pbKey);
}
@@ -314,6 +315,11 @@
private void internBegin()
{
+ /*
+ TODO: Find more elegant way to do this. In 1.x we can declare
'is/setManaged' in PBI
+ */
+ PersistenceBrokerImpl pb = (PersistenceBrokerImpl)
getInnermostDelegate();
+ pb.setManaged(true);
super.beginTransaction();
}
1.83.2.19 +27 -1
db-ojb/src/java/org/apache/ojb/broker/core/PersistenceBrokerImpl.java
Index: PersistenceBrokerImpl.java
===================================================================
RCS file:
/home/cvs/db-ojb/src/java/org/apache/ojb/broker/core/PersistenceBrokerImpl.java,v
retrieving revision 1.83.2.18
retrieving revision 1.83.2.19
diff -u -r1.83.2.18 -r1.83.2.19
--- PersistenceBrokerImpl.java 26 Apr 2005 03:41:36 -0000
1.83.2.18
+++ PersistenceBrokerImpl.java 27 Apr 2005 00:23:52 -0000
1.83.2.19
@@ -105,6 +105,11 @@
* Reflects the transaction status of this instance.
*/
private boolean inTransaction;
+ /**
+ * Flag indicate that this PB instance is handled
+ * in a managed environment.
+ */
+ private boolean managed;
private MaterializationCache objectCache;
/**
* m_DbAccess is used to do all Jdbc related work: connecting,
executing...
@@ -265,6 +270,25 @@
}
/**
+ * If <em>true</em> this instance is handled by a managed
+ * environment - registered within a JTA transaction.
+ */
+ public boolean isManaged()
+ {
+ return managed;
+ }
+
+ /**
+ * Set <em>true</em> if this instance is registered within a
+ * JTA transaction. On [EMAIL PROTECTED] #close()} call this flag was
reset
+ * to <em>false</em> automatic.
+ */
+ public void setManaged(boolean managed)
+ {
+ this.managed = managed;
+ }
+
+ /**
* Lookup the current [EMAIL PROTECTED] DescriptorRepository} for
* this class. This method is responsible to keep this
* PB instance in sync with [EMAIL PROTECTED] MetadataManager}.
@@ -356,6 +380,8 @@
}
finally
{
+ // reset flag indicating use in managed environment
+ setManaged(false);
// free current used DescriptorRepository reference
descriptorRepository = null;
removeAllListeners();
No revision
No revision
1.27.2.3 +42 -31
db-ojb/src/java/org/apache/ojb/broker/platforms/PlatformDefaultImpl.java
Index: PlatformDefaultImpl.java
===================================================================
RCS file:
/home/cvs/db-ojb/src/java/org/apache/ojb/broker/platforms/PlatformDefaultImpl.java,v
retrieving revision 1.27.2.2
retrieving revision 1.27.2.3
diff -u -r1.27.2.2 -r1.27.2.3
--- PlatformDefaultImpl.java 6 Apr 2005 13:29:33 -0000 1.27.2.2
+++ PlatformDefaultImpl.java 27 Apr 2005 00:23:52 -0000 1.27.2.3
@@ -44,6 +44,8 @@
public class PlatformDefaultImpl implements Platform, JoinSyntaxTypes
{
protected Logger log =
LoggerFactory.getLogger(PlatformDefaultImpl.class);
+ private static final String INITIALIZATION_CHECK_AUTOCOMMIT =
"initializationCheck";
+ private static final String FALSE_STR = "false";
protected boolean m_batchUpdatesChecked = false;
protected boolean m_supportsBatchUpdates = false;
@@ -143,45 +145,54 @@
public void initializeJdbcConnection(JdbcConnectionDescriptor jcd,
Connection conn) throws PlatformException
{
if (jcd.getBatchMode()) checkForBatchSupport(conn);
- switch (jcd.getUseAutoCommit())
+ /*
+ arminw:
+ workaround to be backward compatible. In future releases we
shouldn't change the autocommit
+ state of a connection at initializing by the ConnectionFactory. The
autocommit state should only be
+ changed by the ConnectionManager. We have to separate this stuff.
+ */
+ if(!jcd.getAttribute(INITIALIZATION_CHECK_AUTOCOMMIT,
FALSE_STR).equalsIgnoreCase(FALSE_STR))
{
- case JdbcConnectionDescriptor.AUTO_COMMIT_IGNORE_STATE:
- // nothing to do
- break;
- case
JdbcConnectionDescriptor.AUTO_COMMIT_SET_TRUE_AND_TEMPORARY_FALSE:
- try
- {
- if (!conn.getAutoCommit()) conn.setAutoCommit(true);
- }
- catch (SQLException e)
- {
- if (!jcd.isIgnoreAutoCommitExceptions())
+ switch (jcd.getUseAutoCommit())
+ {
+ case JdbcConnectionDescriptor.AUTO_COMMIT_IGNORE_STATE:
+ // nothing to do
+ break;
+ case
JdbcConnectionDescriptor.AUTO_COMMIT_SET_TRUE_AND_TEMPORARY_FALSE:
+ try
{
- throw new PlatformException("Connection
initializing: setAutoCommit(true) failed", e);
+ if (!conn.getAutoCommit()) conn.setAutoCommit(true);
}
- else
+ catch (SQLException e)
{
- log.info("Connection initializing: setAutoCommit
jdbc-driver problems. " + e.getMessage());
+ if (!jcd.isIgnoreAutoCommitExceptions())
+ {
+ throw new PlatformException("Connection
initializing: setAutoCommit(true) failed", e);
+ }
+ else
+ {
+ log.info("Connection initializing: setAutoCommit
jdbc-driver problems. " + e.getMessage());
+ }
}
- }
- break;
- case JdbcConnectionDescriptor.AUTO_COMMIT_SET_FALSE:
- try
- {
- if (conn.getAutoCommit()) conn.setAutoCommit(false);
- }
- catch (SQLException e)
- {
- if (!jcd.isIgnoreAutoCommitExceptions())
+ break;
+ case JdbcConnectionDescriptor.AUTO_COMMIT_SET_FALSE:
+ try
{
- throw new PlatformException("Connection
initializing: setAutoCommit(false) failed", e);
+ if (conn.getAutoCommit()) conn.setAutoCommit(false);
}
- else
+ catch (SQLException e)
{
- log.info("Connection initializing: setAutoCommit
jdbc-driver problems. " + e.getMessage());
+ if (!jcd.isIgnoreAutoCommitExceptions())
+ {
+ throw new PlatformException("Connection
initializing: setAutoCommit(false) failed", e);
+ }
+ else
+ {
+ log.info("Connection initializing: setAutoCommit
jdbc-driver problems. " + e.getMessage());
+ }
}
- }
- break;
+ break;
+ }
}
}
No revision
No revision
1.22.2.9 +12 -1 db-ojb/src/test/org/apache/ojb/repository_database.xml
Index: repository_database.xml
===================================================================
RCS file: /home/cvs/db-ojb/src/test/org/apache/ojb/repository_database.xml,v
retrieving revision 1.22.2.8
retrieving revision 1.22.2.9
diff -u -r1.22.2.8 -r1.22.2.9
--- repository_database.xml 26 Apr 2005 03:41:37 -0000 1.22.2.8
+++ repository_database.xml 27 Apr 2005 00:23:52 -0000 1.22.2.9
@@ -48,6 +48,17 @@
ignoreAutoCommitExceptions="false"
>
+ <!-- On initialization of connections the ConnectionFactory change
the autoCommit
+ state dependent of the used 'useAutoCommit' setting. This
doesn't work in all
+ situations/environments, thus this check is deprecated.
+ To use the old behavior set this property to 'true', then OJB
try to
+ change the autocommit state (if needed) of a new obtained
connections at
+ connection initialization.
+ If 'false' or this property is removed, OJB don't try to change
connection
+ autoCommit state at connection initialization.
+ -->
+ <attribute attribute-name="initializationCheck"
attribute-value="false" />
+
<!-- alternative cache implementations, see docs section "Caching"
-->
<object-cache
class="org.apache.ojb.broker.cache.ObjectCacheTwoLevelImpl">
<!-- meaning of attributes, please see docs section "Caching" -->
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]