JBoss, Datasources, Hibernate e C3P0

1 resposta
C

tudo bom pessoal

tenho uma aplicação rodando no JBoss 4.2.3 e notei que apenas setando os valores como min_size, max_statements ou max_size do C3P0 (c3p0-0.9.1.2.jar) não foram suficientes para ligá-lo (ele realmente é automaticamente ligado como diz a documentação do Hibernate?)
só quando eu ajustei a propriedade hibernate.connection.provider_class com o valor org.hibernate.connection.C3P0ConnectionProvider é que ví o C3P0 ser inicializado no log do JBoss

18:05:07,766 INFO  [ConnectionProviderFactory] Initializing connection provider: org.hibernate.connection.C3P0ConnectionProvider
18:05:07,775 INFO  [C3P0ConnectionProvider] C3P0 using driver: null at URL: null
18:05:07,776 INFO  [C3P0ConnectionProvider] Connection properties: {}
18:05:07,776 INFO  [C3P0ConnectionProvider] autocommit mode: false
18:05:07,776 WARN  [C3P0ConnectionProvider] No JDBC Driver class was specified by property hibernate.connection.driver_class
18:05:07,845 INFO  [MLog] MLog clients using log4j logging.
18:05:08,309 INFO  [C3P0Registry] Initializing c3p0-0.9.1.2 [built 21-May-2007 15:04:56; debug? true; trace: 10]
18:05:08,544 INFO  [AbstractPoolBackedDataSource] Initializing c3p0 pool... com.mchange.v2.c3p0.PoolBackedDataSource@817dc511 [ connectionPoolDataSource -> com.mchange.v2.c3p0.WrapperConnectionPoolDataSource@bdd4060f [ acquireIncrement -> 3, acquireRetryAttempts -> 30, acquireRetryDelay -> 1000, autoCommitOnClose -> false, automaticTestTable -> null, breakAfterAcquireFailure -> false, checkoutTimeout -> 0, connectionCustomizerClassName -> null, connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester, debugUnreturnedConnectionStackTraces -> false, factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, identityToken -> 1b60m8m88awxucurvdz4k|130b993, idleConnectionTestPeriod -> 0, initialPoolSize -> 3, maxAdministrativeTaskTime -> 0, maxConnectionAge -> 0, maxIdleTime -> 0, maxIdleTimeExcessConnections -> 0, maxPoolSize -> 15, maxStatements -> 0, maxStatementsPerConnection -> 0, minPoolSize -> 3, nestedDataSource -> com.mchange.v2.c3p0.DriverManagerDataSource@bcdc5afd [ description -> null, driverClass -> null, factoryClassLocation -> null, identityToken -> 1b60m8m88awxucurvdz4k|12b644f, jdbcUrl -> null, properties -> {} ], preferredTestQuery -> null, propertyCycle -> 0, testConnectionOnCheckin -> false, testConnectionOnCheckout -> false, unreturnedConnectionTimeout -> 0, usesTraditionalReflectiveProxies -> false; userOverrides: {} ], dataSourceName -> null, factoryClassLocation -> null, identityToken -> 1b60m8m88awxucurvdz4k|675ac5, numHelperThreads -> 3 ]
18:05:37,672 WARN  [BasicResourcePool] com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@bdbaa2 -- Acquisition Attempt Failed!!! Clearing pending acquires. While trying to acquire a needed new resource, we failed to succeed more than the maximum number of allowed acquisition attempts (30). Last acquisition attempt exception: 
java.lang.NullPointerException
	at sun.jdbc.odbc.JdbcOdbcDriver.getProtocol(Unknown Source)
	at sun.jdbc.odbc.JdbcOdbcDriver.knownURL(Unknown Source)
	at sun.jdbc.odbc.JdbcOdbcDriver.acceptsURL(Unknown Source)
	at java.sql.DriverManager.getDriver(Unknown Source)
	at com.mchange.v2.c3p0.DriverManagerDataSource.driver(DriverManagerDataSource.java:223)
	at com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:119)
	at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:143)
	at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:132)
	at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.acquireResource(C3P0PooledConnectionPool.java:137)
	at com.mchange.v2.resourcepool.BasicResourcePool.doAcquire(BasicResourcePool.java:1014)
	at com.mchange.v2.resourcepool.BasicResourcePool.access$800(BasicResourcePool.java:32)
	at com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask.run(BasicResourcePool.java:1810)
	at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547)
18:05:37,683 WARN  [BasicResourcePool] com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@2b34e5 -- Acquisition Attempt Failed!!! Clearing pending acquires. While trying to acquire a needed new resource, we failed to succeed more than the maximum number of allowed acquisition attempts (30). Last acquisition attempt exception:

mas o C3P0 nunca consegue montar o pool de conexão por que meus dados de conexão estão nos datasources do JBoss, e não nas propriedades de configuração do AnnotationConfiguration do Hibernate (onde ficam as configurações do C3P0)… como eu tenho muitos datasources, preciso deles pra saber em qual banco o usuário vai conectar via JNDI, por isso não posso colocar essas configurações hard coded nas propriedades do AnnotationConfiguration do Hibernate (nessa hora me veio a pergunta: “Se eu posso configurar os SessionFactory no Hibernate direto via código, pra que usar os datasources na pasta deploy do JBoss?”)

eu já ajustei a propriedade hibernate.connection.datasource com o respectivo datasource no JBoss mas mesmo assim, o C3P0 só liga se eu colocar os valores de conexão (URL JDBC, usuário, senha e etc) direto no AnnotationConfiguration

alguem conhece alguma solução pra isso? enfim, para que o C3P0 funcione perfeitamente com o Hibernate…
dia inteiro no Google :confused:
valew

1 Resposta

bsl.lacerda

Estou com o mesmo problema. JBoss + C3P0.
Alguém poderia dar uma luz?

Criado 22 de abril de 2010
Ultima resposta 6 de jun. de 2012
Respostas 1
Participantes 2