/* * Hibernate, Relational Persistence for Idiomatic Java * * License: GNU Lesser General Public License (LGPL), version 2.1 or later. * See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>. */ package org.hibernate.test.jdbc.internal; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; import org.hibernate.testing.boot.BasicTestingJdbcServiceImpl; import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase; import org.junit.Test; /** * @author Steve Ebersole */ public class AggressiveReleaseTest extends BaseCoreFunctionalTestCase { private BasicTestingJdbcServiceImpl services = new BasicTestingJdbcServiceImpl(); @Override protected void prepareTest() throws Exception { services.prepare( true ); Connection connection = null; Statement stmnt = null; try { connection = services.getBootstrapJdbcConnectionAccess().obtainConnection(); stmnt = connection.createStatement(); stmnt.execute( "drop table SANDBOX_JDBC_TST if exists" ); stmnt.execute( "create table SANDBOX_JDBC_TST ( ID integer, NAME varchar(100) )" ); } finally { if ( stmnt != null ) { try { stmnt.close(); } catch ( SQLException ignore ) { } } if ( connection != null ) { try { services.getBootstrapJdbcConnectionAccess().releaseConnection( connection ); } catch ( SQLException ignore ) { } } } } @Override protected void cleanupTest() throws Exception { Connection connection = null; Statement stmnt = null; try { connection = services.getBootstrapJdbcConnectionAccess().obtainConnection(); stmnt = connection.createStatement(); stmnt.execute( "drop table SANDBOX_JDBC_TST if exists" ); } finally { if ( stmnt != null ) { try { stmnt.close(); } catch ( SQLException ignore ) { } } if ( connection != null ) { try { services.getBootstrapJdbcConnectionAccess().releaseConnection( connection ); } catch ( SQLException ignore ) { } } } services.release(); } @Test public void testBasicRelease() { // Session session = openSession(); // SessionImplementor sessionImpl = (SessionImplementor) session; // // LogicalConnectionImplementor logicalConnection = new LogicalConnectionImpl( null, // ConnectionReleaseMode.AFTER_STATEMENT, services, new JdbcConnectionAccessImpl( // services.getConnectionProvider() ) ); // // JdbcCoordinatorImpl jdbcCoord = new JdbcCoordinatorImpl( logicalConnection, // sessionImpl ); // JournalingConnectionObserver observer = new JournalingConnectionObserver(); // logicalConnection.addObserver( observer ); // // try { // PreparedStatement ps = jdbcCoord.getStatementPreparer().prepareStatement( "insert into SANDBOX_JDBC_TST( ID, NAME ) values ( ?, ? )" ); // ps.setLong( 1, 1 ); // ps.setString( 2, "name" ); // jdbcCoord.getResultSetReturn().execute( ps ); // assertTrue( jdbcCoord.hasRegisteredResources() ); // assertEquals( 1, observer.getPhysicalConnectionObtainedCount() ); // assertEquals( 0, observer.getPhysicalConnectionReleasedCount() ); // jdbcCoord.release( ps ); // assertFalse( jdbcCoord.hasRegisteredResources() ); // assertEquals( 1, observer.getPhysicalConnectionObtainedCount() ); // assertEquals( 1, observer.getPhysicalConnectionReleasedCount() ); // } // catch ( SQLException sqle ) { // fail( "incorrect exception type : sqlexception" ); // } // finally { // session.close(); // } // // assertFalse( jdbcCoord.hasRegisteredResources() ); } @Test public void testReleaseCircumventedByHeldResources() { // Session session = openSession(); // SessionImplementor sessionImpl = (SessionImplementor) session; // // LogicalConnectionImpl logicalConnection = new LogicalConnectionImpl( null, // ConnectionReleaseMode.AFTER_STATEMENT, services, new JdbcConnectionAccessImpl( // services.getConnectionProvider() ) ); // JdbcCoordinatorImpl jdbcCoord = new JdbcCoordinatorImpl( logicalConnection, // sessionImpl.getTransactionCoordinator() ); // JournalingConnectionObserver observer = new JournalingConnectionObserver(); // logicalConnection.addObserver( observer ); // // try { // PreparedStatement ps = jdbcCoord.getStatementPreparer().prepareStatement( "insert into SANDBOX_JDBC_TST( ID, NAME ) values ( ?, ? )" ); // ps.setLong( 1, 1 ); // ps.setString( 2, "name" ); // jdbcCoord.getResultSetReturn().execute( ps ); // assertTrue( jdbcCoord.hasRegisteredResources() ); // assertEquals( 1, observer.getPhysicalConnectionObtainedCount() ); // assertEquals( 0, observer.getPhysicalConnectionReleasedCount() ); // jdbcCoord.release( ps ); // assertFalse( jdbcCoord.hasRegisteredResources() ); // assertEquals( 1, observer.getPhysicalConnectionObtainedCount() ); // assertEquals( 1, observer.getPhysicalConnectionReleasedCount() ); // // // open a result set and hold it open... // ps = jdbcCoord.getStatementPreparer().prepareStatement( "select * from SANDBOX_JDBC_TST" ); // jdbcCoord.getResultSetReturn().extract( ps ); // assertTrue( jdbcCoord.hasRegisteredResources() ); // assertEquals( 2, observer.getPhysicalConnectionObtainedCount() ); // assertEquals( 1, observer.getPhysicalConnectionReleasedCount() ); // // // open a second result set // PreparedStatement ps2 = jdbcCoord.getStatementPreparer().prepareStatement( "select * from SANDBOX_JDBC_TST" ); // jdbcCoord.getResultSetReturn().execute( ps ); // assertTrue( jdbcCoord.hasRegisteredResources() ); // assertEquals( 2, observer.getPhysicalConnectionObtainedCount() ); // assertEquals( 1, observer.getPhysicalConnectionReleasedCount() ); // // and close it... // jdbcCoord.release( ps2 ); // // the release should be circumvented... // assertTrue( jdbcCoord.hasRegisteredResources() ); // assertEquals( 2, observer.getPhysicalConnectionObtainedCount() ); // assertEquals( 1, observer.getPhysicalConnectionReleasedCount() ); // // // let the close of the logical connection below release all resources (hopefully)... // } // catch ( SQLException sqle ) { // fail( "incorrect exception type : sqlexception" ); // } // finally { // jdbcCoord.close(); // session.close(); // } // // assertFalse( jdbcCoord.hasRegisteredResources() ); // assertEquals( 2, observer.getPhysicalConnectionObtainedCount() ); // assertEquals( 2, observer.getPhysicalConnectionReleasedCount() ); } @Test public void testReleaseCircumventedManually() { // Session session = openSession(); // SessionImplementor sessionImpl = (SessionImplementor) session; // // LogicalConnectionImpl logicalConnection = new LogicalConnectionImpl( null, // ConnectionReleaseMode.AFTER_STATEMENT, services, new JdbcConnectionAccessImpl( // services.getConnectionProvider() ) ); // JdbcCoordinatorImpl jdbcCoord = new JdbcCoordinatorImpl( logicalConnection, // sessionImpl.getTransactionCoordinator() ); // JournalingConnectionObserver observer = new JournalingConnectionObserver(); // logicalConnection.addObserver( observer ); // // try { // PreparedStatement ps = jdbcCoord.getStatementPreparer().prepareStatement( "insert into SANDBOX_JDBC_TST( ID, NAME ) values ( ?, ? )" ); // ps.setLong( 1, 1 ); // ps.setString( 2, "name" ); // jdbcCoord.getResultSetReturn().execute( ps ); // assertTrue( jdbcCoord.hasRegisteredResources() ); // assertEquals( 1, observer.getPhysicalConnectionObtainedCount() ); // assertEquals( 0, observer.getPhysicalConnectionReleasedCount() ); // jdbcCoord.release( ps ); // assertFalse( jdbcCoord.hasRegisteredResources() ); // assertEquals( 1, observer.getPhysicalConnectionObtainedCount() ); // assertEquals( 1, observer.getPhysicalConnectionReleasedCount() ); // // // disable releases... // jdbcCoord.disableReleases(); // // // open a result set... // ps = jdbcCoord.getStatementPreparer().prepareStatement( "select * from SANDBOX_JDBC_TST" ); // jdbcCoord.getResultSetReturn().extract( ps ); // assertTrue( jdbcCoord.hasRegisteredResources() ); // assertEquals( 2, observer.getPhysicalConnectionObtainedCount() ); // assertEquals( 1, observer.getPhysicalConnectionReleasedCount() ); // // and close it... // jdbcCoord.release( ps ); // // the release should be circumvented... // assertFalse( jdbcCoord.hasRegisteredResources() ); // assertEquals( 2, observer.getPhysicalConnectionObtainedCount() ); // assertEquals( 1, observer.getPhysicalConnectionReleasedCount() ); // // // let the close of the logical connection below release all resources (hopefully)... // } // catch ( SQLException sqle ) { // fail( "incorrect exception type : sqlexception" ); // } // finally { // jdbcCoord.close(); // session.close(); // } // // assertFalse( jdbcCoord.hasRegisteredResources() ); // assertEquals( 2, observer.getPhysicalConnectionObtainedCount() ); // assertEquals( 2, observer.getPhysicalConnectionReleasedCount() ); } }