[hibernate-dev] Using AS7 prepared Statement caching and Hibernate 4.0.0.Beta4 + 4.0.0.Beta5

Scott Marlow smarlow at redhat.com
Tue Sep 20 10:22:57 EDT 2011


This went away for a while but Jeremy is now recreating this 
(http://pastie.org/2563226).

Can anyone tell us how long Hibernate 4.0.0 can hold onto a 
PreparedStatement?  And whether its possible that Hibernate may be 
holding onto a PreparedStatement for reuse after Hibernate has called 
the PreparedStatement.close method?

This problem goes away, if the AS7 PreparedStatement cache is disabled 
but for best performance, it would be nice to support using Hibernate 
with a PreparedStatement cache.

Its possible that the bug is also in the AS7 PreparedStatement cache and 
that we just haven't found it yet.

What do you think?

Thanks,
Scott

On 08/04/2011 03:41 PM, Scott Marlow wrote:
> Let me add, that in theory, the AS7 prepared statement cache, should not
> close the prepared statements while they are in use by Hibernate.
> Currently in AS7, if the cache fills up, the statement should be removed
> from the pool but not closed.
>
> I still would like to understand why the prepared statement is getting
> closed while its still being used.
>
> On 08/04/2011 10:00 AM, Scott Marlow wrote:
>> https://issues.jboss.org/browse/AS7-1461 reflects a problem reported by
>> two users.  One user reported, that in a transaction that included
>> multiple different entities being created, that Hibernate is trying to
>> use a closed prepared statement.
>>
>> My question at this point is, what would happen if the AS7 prepared
>> statement cache were to close a prepared statement during a transaction.
>>
>> For example, assuming that the prepared statement cache was configured
>> to a very low limit, like two.  After two unique sql statements are in
>> the prepared statement cache, when a third unique sql statement is
>> created, one of the two cached statements will be closed.  Could
>> Hibernate be holding onto one of these cached prepared statements (for
>> reuse in the transaction) that are closed?
>>
>> Example execution order from user report:
>>
>> 1.  insert into ASSEMBLIES (NAME, A_ID) values (?, ?)
>>
>> 2.  other sql statements are executed.
>>
>> 3.  insert into ASSEMBLIES (NAME, A_ID) values (?, ?)
>>
>> 4.  other sql statements are executed.
>>
>> 5.  At this point, I believe that "insert into ASSEMBLIES (NAME, A_ID)
>> values (?, ?)" could be aged out of the AS7 prepared statement cache.
>>
>> 6.  "insert into ASSEMBLIES (NAME, A_ID) values (?, ?)" fails to execute
>> because of error
>> "com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:
>> No operations allowed after statement closed"
>>
>> For my local testing, I'm using H2 and get error
>> "org.h2.jdbc.JdbcSQLException: The object is already closed [90007-145]"
>>
>> Does/should Hibernate check the prepared statement to see if its have
>> been closed before its reused in a transaction?  Or should users disable
>> the AS7 prepared statement cache (current workaround)?
>>
>> If Hibernate is currently checking if the prepared statement is closed
>> before reusing it, I must of missed that code in my inspection.
>>
>> At this point, I'm still trying to find the root cause and answer the
>> above question as well.
>>
>> Scott
>> _______________________________________________
>> hibernate-dev mailing list
>> hibernate-dev at lists.jboss.org
>> https://lists.jboss.org/mailman/listinfo/hibernate-dev
>
> _______________________________________________
> hibernate-dev mailing list
> hibernate-dev at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/hibernate-dev




More information about the hibernate-dev mailing list