Feb 1st, 2009, 04:23 PM
lazy Connection priming with HibernateTransactionManager possible?
I am looking for suggestions on how best to configure/extend HibernateTransactionManager to access a java.sql.Connection only when/if it is actually about to be used. Let me provide a use case first:
We have service methods annotated with @Transactional. We also use second-level cache (EhCache) and get into states when some service method invocations result in 100% cache hit rate (alright!) and do not go to DB at all. However, even in those cases a DB Connection is still checked out from the (c3p0) connection pool. Since cxn check-out/in methods in c3p0 are synchronized (and rightly so), these methods become hot spots under higher loads, causing a lot of thread blocking. So, I am looking for a way to ensure DB connection is NOT checked out until it is actually needed (ie some JDBC traffic is about to be sent).
As far as I can tell, connection is eagerly checked out in HibernateTransactionManager.doBegin() - regardless of whether it is subsequently used during given TX. (doBegin() calls deprecated session.connection())
What do you think is the best way to address the above problem?
Addl considerations: I need to pass readOnly flag value and TX iso level to the Connection, so seems that prepareConnection flag should remain enabled. Given that I am using a c3p0 cxn pool, seems like hibernate.connection.release_mode should be "after_transaction" - as I'd want the pool to manage a connection's lifecycle.
Feb 16th, 2009, 03:49 PM
Answering my own question:
proxy your dataSource bean using org.springframework.jdbc.datasource.LazyConnection DataSourceProxy
Tags for this Thread