From 932d85ba26238cc73ef5cfb0874548c7e9abd31a Mon Sep 17 00:00:00 2001 From: Strong Liu Date: Thu, 25 Apr 2013 19:02:51 +0800 Subject: [PATCH] HHH-8203 HHH-8204 Hibernate 4.x can't work with proxool 0.9.1 --- .../internal/ProxoolConnectionProvider.java | 26 ++++++++---- .../ProxoolConnectionProviderTest.java | 40 +++++++++++------- .../src/test/resources/hibernate.properties | 42 +++++++++++++++++++ .../src/test/resources/log4j.properties | 10 +++++ 4 files changed, 95 insertions(+), 23 deletions(-) create mode 100644 hibernate-proxool/src/test/resources/hibernate.properties create mode 100644 hibernate-proxool/src/test/resources/log4j.properties diff --git a/hibernate-proxool/src/main/java/org/hibernate/service/jdbc/connections/internal/ProxoolConnectionProvider.java b/hibernate-proxool/src/main/java/org/hibernate/service/jdbc/connections/internal/ProxoolConnectionProvider.java index a4ac220c2c..9009ecb62a 100644 --- a/hibernate-proxool/src/main/java/org/hibernate/service/jdbc/connections/internal/ProxoolConnectionProvider.java +++ b/hibernate-proxool/src/main/java/org/hibernate/service/jdbc/connections/internal/ProxoolConnectionProvider.java @@ -26,6 +26,7 @@ package org.hibernate.service.jdbc.connections.internal; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; +import java.util.Map; import java.util.Properties; import org.jboss.logging.Logger; @@ -41,13 +42,15 @@ import org.hibernate.internal.util.StringHelper; import org.hibernate.internal.util.config.ConfigurationHelper; import org.hibernate.service.UnknownUnwrapTypeException; import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider; +import org.hibernate.service.spi.Configurable; +import org.hibernate.service.spi.Stoppable; /** * A connection provider that uses a Proxool connection pool. Hibernate will use this by * default if the hibernate.proxool.* properties are set. * @see ConnectionProvider */ -public class ProxoolConnectionProvider implements ConnectionProvider { +public class ProxoolConnectionProvider implements ConnectionProvider, Configurable, Stoppable { public static final ProxoolMessageLogger LOG = Logger.getMessageLogger(ProxoolMessageLogger.class, ProxoolConnectionProvider.class.getName()); @@ -69,12 +72,13 @@ public class ProxoolConnectionProvider implements ConnectionProvider { * @return a JDBC connection * @throws SQLException */ + @Override public Connection getConnection() throws SQLException { // get a connection from the pool (thru DriverManager, cfr. Proxool doc) Connection c = DriverManager.getConnection(proxoolAlias); // set the Transaction Isolation if defined - if (isolation!=null) c.setTransactionIsolation( isolation.intValue() ); + if (isolation!=null) c.setTransactionIsolation( isolation ); // toggle autoCommit to false if set if ( c.getAutoCommit()!=autocommit ) c.setAutoCommit(autocommit); @@ -106,6 +110,7 @@ public class ProxoolConnectionProvider implements ConnectionProvider { * @param conn a JDBC connection * @throws SQLException */ + @Override public void closeConnection(Connection conn) throws SQLException { conn.close(); } @@ -114,15 +119,16 @@ public class ProxoolConnectionProvider implements ConnectionProvider { * Initialize the connection provider from given properties. * @param props SessionFactory properties */ - public void configure(Properties props) throws HibernateException { + @Override + public void configure(Map props) { // Get the configurator files (if available) - String jaxpFile = props.getProperty(Environment.PROXOOL_XML); - String propFile = props.getProperty(Environment.PROXOOL_PROPERTIES); - String externalConfig = props.getProperty(Environment.PROXOOL_EXISTING_POOL); + String jaxpFile = (String)props.get(Environment.PROXOOL_XML); + String propFile = (String)props.get(Environment.PROXOOL_PROPERTIES); + String externalConfig = (String)props.get(Environment.PROXOOL_EXISTING_POOL); // Default the Proxool alias setting - proxoolAlias = props.getProperty(Environment.PROXOOL_POOL_ALIAS); + proxoolAlias = (String)props.get(Environment.PROXOOL_POOL_ALIAS); // Configured outside of Hibernate (i.e. Servlet container, or Java Bean Container // already has Proxool pools running, and this provider is to just borrow one of these @@ -235,8 +241,14 @@ public class ProxoolConnectionProvider implements ConnectionProvider { /** * @see ConnectionProvider#supportsAggressiveRelease() */ + @Override public boolean supportsAggressiveRelease() { return false; } + + @Override + public void stop() { + close(); + } } diff --git a/hibernate-proxool/src/test/java/org/hibernate/service/jdbc/connections/internal/ProxoolConnectionProviderTest.java b/hibernate-proxool/src/test/java/org/hibernate/service/jdbc/connections/internal/ProxoolConnectionProviderTest.java index 7eaf2a57c3..e0776328a3 100644 --- a/hibernate-proxool/src/test/java/org/hibernate/service/jdbc/connections/internal/ProxoolConnectionProviderTest.java +++ b/hibernate-proxool/src/test/java/org/hibernate/service/jdbc/connections/internal/ProxoolConnectionProviderTest.java @@ -25,12 +25,14 @@ package org.hibernate.service.jdbc.connections.internal; import java.util.Arrays; import java.util.List; -import java.util.Properties; import org.junit.Test; import org.logicalcobwebs.proxool.ProxoolFacade; +import org.hibernate.boot.registry.StandardServiceRegistry; +import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.cfg.Environment; +import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider; import org.hibernate.testing.junit4.BaseUnitTestCase; import static org.junit.Assert.assertEquals; @@ -42,22 +44,25 @@ import static org.junit.Assert.assertTrue; * @author Sanne Grinovero */ public class ProxoolConnectionProviderTest extends BaseUnitTestCase { + + + @Test public void testPoolsClosed() { assertDefinedPools(); // zero-length-vararg used as parameter - - ProxoolConnectionProvider providerOne = new ProxoolConnectionProvider(); - providerOne.configure( getPoolConfigurarion( "pool-one" ) ); + StandardServiceRegistry serviceRegistry = buildServiceRegistry( "pool-one" ); + ConnectionProvider providerOne = serviceRegistry.getService( ConnectionProvider.class ); assertDefinedPools( "pool-one" ); - - ProxoolConnectionProvider providerTwo = new ProxoolConnectionProvider(); - providerTwo.configure( getPoolConfigurarion( "pool-two" ) ); + + + StandardServiceRegistry serviceRegistryTwo = buildServiceRegistry( "pool-two" ); + ConnectionProvider providerTwo = serviceRegistryTwo.getService( ConnectionProvider.class ); assertDefinedPools( "pool-one", "pool-two" ); - providerOne.close(); + StandardServiceRegistryBuilder.destroy( serviceRegistry ); assertDefinedPools( "pool-two" ); - - providerTwo.close(); + + StandardServiceRegistryBuilder.destroy( serviceRegistryTwo ); assertDefinedPools(); } @@ -69,11 +74,14 @@ public class ProxoolConnectionProviderTest extends BaseUnitTestCase { } } - private Properties getPoolConfigurarion(String poolName) { - Properties cfg = new Properties(); - cfg.setProperty( Environment.PROXOOL_POOL_ALIAS, poolName ); - cfg.setProperty( Environment.PROXOOL_PROPERTIES, poolName + ".properties" ); - return cfg; + + private StandardServiceRegistry buildServiceRegistry(String poolName){ + + return new StandardServiceRegistryBuilder( ) + .applySetting( Environment.PROXOOL_POOL_ALIAS, poolName ) + .applySetting( Environment.PROXOOL_PROPERTIES, poolName + ".properties" ) + .applySetting( Environment.CONNECTION_PROVIDER, ProxoolConnectionProvider.class.getName() ) + .build(); + } - } diff --git a/hibernate-proxool/src/test/resources/hibernate.properties b/hibernate-proxool/src/test/resources/hibernate.properties new file mode 100644 index 0000000000..2303d8c135 --- /dev/null +++ b/hibernate-proxool/src/test/resources/hibernate.properties @@ -0,0 +1,42 @@ +# +# Hibernate, Relational Persistence for Idiomatic Java +# +# Copyright (c) 2010, Red Hat Inc. or third-party contributors as +# indicated by the @author tags or express copyright attribution +# statements applied by the authors. All third-party contributions are +# distributed under license by Red Hat Inc. +# +# This copyrighted material is made available to anyone wishing to use, modify, +# copy, or redistribute it subject to the terms and conditions of the GNU +# Lesser General Public License, as published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License +# for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this distribution; if not, write to: +# Free Software Foundation, Inc. +# 51 Franklin Street, Fifth Floor +# Boston, MA 02110-1301 USA +# +hibernate.dialect org.hibernate.dialect.H2Dialect +hibernate.connection.driver_class org.h2.Driver +hibernate.connection.url jdbc:h2:mem:db1;DB_CLOSE_DELAY=-1;MVCC=TRUE +hibernate.connection.username sa + +hibernate.connection.pool_size 5 +hibernate.jdbc.batch_size 10 +hibernate.connection.provider_class org.hibernate.connection.ProxoolConnectionProvider +hibernate.proxool.properties pool-one.properties + +hibernate.show_sql false + +hibernate.max_fetch_depth 5 + +hibernate.cache.region_prefix hibernate.test +hibernate.cache.region.factory_class org.hibernate.testing.cache.CachingRegionFactory + +# NOTE: hibernate.jdbc.batch_versioned_data should be set to false when testing with Oracle +hibernate.jdbc.batch_versioned_data true diff --git a/hibernate-proxool/src/test/resources/log4j.properties b/hibernate-proxool/src/test/resources/log4j.properties new file mode 100644 index 0000000000..1f7070d830 --- /dev/null +++ b/hibernate-proxool/src/test/resources/log4j.properties @@ -0,0 +1,10 @@ +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.Target=System.out +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n + + +log4j.rootLogger=info, stdout + +log4j.logger.org.hibernate.tool.hbm2ddl=debug +log4j.logger.org.hibernate.testing.cache=debug