From: <jbo...@li...> - 2006-01-15 13:59:52
|
Author: ste...@jb... Date: 2006-01-15 08:59:42 -0500 (Sun, 15 Jan 2006) New Revision: 2101 Added: trunk/labs/hibernate/jdbc-redesign/src/org/hibernate/tx/IsolationDelegate.java Modified: trunk/labs/hibernate/jdbc-redesign/src/org/hibernate/jdbc3/JDBCContainer.java trunk/labs/hibernate/jdbc-redesign/src/org/hibernate/jdbc3/JDBCContainerFactory.java trunk/labs/hibernate/jdbc-redesign/src/org/hibernate/jdbc3/impl/JDBCContainerImpl.java trunk/labs/hibernate/jdbc-redesign/src/org/hibernate/tx/TransactionCoordinator.java Log: seperate transaction work Modified: trunk/labs/hibernate/jdbc-redesign/src/org/hibernate/jdbc3/JDBCContainer.java =================================================================== --- trunk/labs/hibernate/jdbc-redesign/src/org/hibernate/jdbc3/JDBCContainer.java 2006-01-15 04:53:37 UTC (rev 2100) +++ trunk/labs/hibernate/jdbc-redesign/src/org/hibernate/jdbc3/JDBCContainer.java 2006-01-15 13:59:42 UTC (rev 2101) @@ -21,6 +21,15 @@ public void doWork(Work work) throws HibernateException; /** + * Performs some work within the confines of this container. + * + * @param work The work to be performed. + * @throws HibernateException Indicates a problem occurred trying to + * perform the requested work. + */ + public void doWorkInSeperateTransaction(Work work) throws HibernateException; + + /** * Cancels the last requested operation. * * @throws HibernateException Indicates a problem cancelling the last Modified: trunk/labs/hibernate/jdbc-redesign/src/org/hibernate/jdbc3/JDBCContainerFactory.java =================================================================== --- trunk/labs/hibernate/jdbc-redesign/src/org/hibernate/jdbc3/JDBCContainerFactory.java 2006-01-15 04:53:37 UTC (rev 2100) +++ trunk/labs/hibernate/jdbc-redesign/src/org/hibernate/jdbc3/JDBCContainerFactory.java 2006-01-15 13:59:42 UTC (rev 2101) @@ -60,6 +60,7 @@ Connection userSuppliedConnection, TransactionCoordinator txCoordinator) { return new JDBCContainerImpl( + txCoordinator, userSuppliedConnection, connectionProvider, releaseMode, @@ -76,6 +77,7 @@ TransactionCoordinator txCoordinator, ConnectionReleaseMode releaseMode) { return new JDBCContainerImpl( + txCoordinator, userSuppliedConnection, connectionProvider, releaseMode, Modified: trunk/labs/hibernate/jdbc-redesign/src/org/hibernate/jdbc3/impl/JDBCContainerImpl.java =================================================================== --- trunk/labs/hibernate/jdbc-redesign/src/org/hibernate/jdbc3/impl/JDBCContainerImpl.java 2006-01-15 04:53:37 UTC (rev 2100) +++ trunk/labs/hibernate/jdbc-redesign/src/org/hibernate/jdbc3/impl/JDBCContainerImpl.java 2006-01-15 13:59:42 UTC (rev 2101) @@ -12,6 +12,7 @@ import org.hibernate.ConnectionReleaseMode; import org.hibernate.HibernateException; import org.hibernate.JDBCException; +import org.hibernate.tx.TransactionCoordinator; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -42,6 +43,7 @@ // private PreparedStatement lastQuery; + private final TransactionCoordinator transactionCoordinator; private final ConnectionProvider connectionProvider; private final ConnectionReleaseMode releaseMode; private final SQLStatementLogger sqlStatementLogger; @@ -53,6 +55,7 @@ private transient LogicalConnection logicalConnection; public JDBCContainerImpl( + TransactionCoordinator transactionCoordinator, Connection userSuppliedConnection, ConnectionProvider connectionProvider, ConnectionReleaseMode releaseMode, @@ -61,6 +64,7 @@ Dialect dialect, SQLStatementLogger sqlStatementLogger, int batchSize) { + this.transactionCoordinator = transactionCoordinator; this.connectionProvider = connectionProvider; this.releaseMode = releaseMode; this.sqlExceptionConverter = sqlExceptionConverter; @@ -89,8 +93,18 @@ } } + public void doWorkInSeperateTransaction(Work work) throws HibernateException { + IsolatedWorkspaceImpl workspace = new IsolatedWorkspaceImpl(); + try { + transactionCoordinator.getIsolationDelegate().doWorkInIsolation( work, workspace ); + } + finally { + workspace.close(); + } + } + public void release(Work work) { - // needed for non-concise work to signal the fact that we are done + // needed for non-concise work to signal the fact that we are closed // with the resources... doRelease( work ); afterStatement(); @@ -199,60 +213,64 @@ return conn; } - public class WorkspaceImpl implements Workspace { - // TODO : implement "connection handle registration" logic + // Workspace impls ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - private HashSet registeredStatements = new HashSet(); - private HashSet registeredResultSets = new HashSet(); + public abstract class AbstractWorkspaceImpl implements Workspace { - public WorkspaceImpl() { + protected final HashSet registeredStatements = new HashSet(); + protected final HashSet registeredResultSets = new HashSet(); + + public AbstractWorkspaceImpl() { log.debug( "Opening workspace [" + this + "]" ); + opened(); } - public Connection getConnection() { - return JDBCContainerImpl.this.getLogicalConnection().getConnection(); + protected void opened() { } - public Dialect getDialect() { + protected void closed() { + } + + public final Dialect getDialect() { return JDBCContainerImpl.this.dialect; } - public SQLStatementLogger getSqlLogger() { + public final SQLStatementLogger getSqlLogger() { return JDBCContainerImpl.this.sqlStatementLogger; } - public JDBCException convert(SQLException sqlException, String message) { + public final JDBCException convert(SQLException sqlException, String message) { return JDBCContainerImpl.this.convert( sqlException, message ); } - public JDBCException convert(SQLException sqlException, String message, String sql) { + public final JDBCException convert(SQLException sqlException, String message, String sql) { return JDBCContainerImpl.this.convert( sqlException, message, sql ); } - public void register(PreparedStatement statement) { + public final void register(PreparedStatement statement) { log.trace( "registering prepared statement [" + statement + "]" ); registeredStatements.add( statement ); } - public void release(PreparedStatement statement) { + public final void release(PreparedStatement statement) { log.trace( "releasing prepared statement [" + statement + "]" ); registeredStatements.remove( statement ); close( statement ); } - public void register(ResultSet resultSet) { + public final void register(ResultSet resultSet) { log.trace( "registering result set [" + resultSet + "]" ); registeredResultSets.add( resultSet ); } - public void release(ResultSet resultSet) { + public final void release(ResultSet resultSet) { log.trace( "releasing result set [" + resultSet + "]" ); registeredResultSets.remove( resultSet ); close( resultSet ); } - private void close(PreparedStatement statement) { + protected final void close(PreparedStatement statement) { log.trace( "closing prepared statement [" + statement + "]" ); try { // if we are unable to "clean" the prepared statement, @@ -277,7 +295,7 @@ } } - private void close(ResultSet resultSet) { + protected final void close(ResultSet resultSet) { log.trace( "closing result set [" + resultSet + "]" ); try { resultSet.close(); @@ -287,7 +305,7 @@ } } - public void close() { + public final void close() { log.trace( "closing workspace [" + this + "]" ); Iterator iter = registeredResultSets.iterator(); while ( iter.hasNext() ) { @@ -301,6 +319,54 @@ } registeredStatements.clear(); + closed(); + } + } + + public class IsolatedWorkspaceImpl extends AbstractWorkspaceImpl implements Workspace { + private Connection connection; + + public Connection getConnection() { + return connection; + } + + public void prepare() { + try { + connection = connectionProvider.getConnection(); + log.debug( "obtained JDBC connection for isolated work" ); + if ( stats != null ) { + stats.connect(); + } + } + catch( SQLException sqle ) { + throw convert( sqle, "Unable to obtain JDBC connection for isolated work" ); + } + } + + public void release() { + try { + connectionProvider.closeConnection( connection ); + log.debug( "released JDBC connection for isolated work" ); + } + catch( SQLException sqle ) { + log.trace( "unable to release connection on exception [" + sqle + "]" ); + } + finally { + connection = null; + } + } + } + + public class WorkspaceImpl extends AbstractWorkspaceImpl implements Workspace { + public Connection getConnection() { + return JDBCContainerImpl.this.getLogicalConnection().getConnection(); + } + + protected void opened() { + // TODO : implement "connection handle registration" logic + } + + protected void closed() { // TODO : release our "hold" on the connection } } Added: trunk/labs/hibernate/jdbc-redesign/src/org/hibernate/tx/IsolationDelegate.java =================================================================== --- trunk/labs/hibernate/jdbc-redesign/src/org/hibernate/tx/IsolationDelegate.java 2006-01-15 04:53:37 UTC (rev 2100) +++ trunk/labs/hibernate/jdbc-redesign/src/org/hibernate/tx/IsolationDelegate.java 2006-01-15 13:59:42 UTC (rev 2101) @@ -0,0 +1,11 @@ +package org.hibernate.tx; + +import org.hibernate.jdbc3.Work; +import org.hibernate.jdbc3.impl.JDBCContainerImpl; + +/** + * @author Steve Ebersole + */ +public interface IsolationDelegate { + public void doWorkInIsolation(Work work, JDBCContainerImpl.IsolatedWorkspaceImpl workspace); +} Modified: trunk/labs/hibernate/jdbc-redesign/src/org/hibernate/tx/TransactionCoordinator.java =================================================================== --- trunk/labs/hibernate/jdbc-redesign/src/org/hibernate/tx/TransactionCoordinator.java 2006-01-15 04:53:37 UTC (rev 2100) +++ trunk/labs/hibernate/jdbc-redesign/src/org/hibernate/tx/TransactionCoordinator.java 2006-01-15 13:59:42 UTC (rev 2101) @@ -4,4 +4,5 @@ * @author Steve Ebersole */ public interface TransactionCoordinator { + public IsolationDelegate getIsolationDelegate(); } |