1

I'm experiencing a problem using hibernate 3.6.10.Final. My project uses struts2+hibernate, and I create persistent requests using

 <dependency>
    <groupId>com.googlecode.s2hibernate</groupId>
    <artifactId>struts2-fullhibernatecore-plugin</artifactId>
    <version>2.2.2-GA</version> 
</dependency>

I must use standard hibernate session within interceptor for login purposes or when I generate long term thread that stop to work after the end of the request.

I have no problem with struts2-fullhibernatecore-plugin generated session while I receive strange exception when I try to generate simple transaction within interceptor or separated thread that can't use standard struts2-fullhibernatecore-plugin logic.

One piece of code that gives me problem is this contained in the interceptor

public String intercept(ActionInvocation invocation) throws Exception {
... bla bla ...
userManager.setSession(HibernateUtil.getSessionFactory().openSession());
logger.info("Session status "+ userManager.getSession().isOpen() +" " +userManager.getSession().isDirty());
userManager.setTransaction(userManager.getSession().beginTransaction());
...

I close this session when I stop to use it

My code explodes when I try to generate the transaction

 2013-11-21 07:11:09,470 ajp-bio-8009-exec-2 ERROR
 (org.apache.struts2.dispatcher.Dispatcher:38) - Exception occurred
 during processing request: Cannot open connection
 org.hibernate.exception.GenericJDBCException: Cannot open connection
         at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:140)
         at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:128)
         at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
         at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:52)
         at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:449)
         at org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:167)
         at org.hibernate.jdbc.JDBCContext.connection(JDBCContext.java:142)
         at org.hibernate.transaction.JDBCTransaction.begin(JDBCTransaction.java:85)
         at org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1463)
         at videoshare.interceptor.usermanager.PossibleLoginIterceptor.intercept(PossibleLoginIterceptor.java:49)
         at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
         at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:54)
         at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:563)
         at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
         at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:99)
         at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
         at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
         at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
         at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
         at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
         at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
         at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
         at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
         at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
         at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
         at org.apache.coyote.ajp.AjpProcessor.process(AjpProcessor.java:200)
         at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603)
         at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
         at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
         at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
         at java.lang.Thread.run(Thread.java:662) Caused by: java.sql.SQLException:
 com.mchange.v2.c3p0.PoolBackedDataSource@1638fbc [
 connectionPoolDataSource ->
 com.mchange.v2.c3p0.WrapperConnectionPoolDataSource@a01f8a5c [
 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 ->
 z8kfsx8yxnfxily93r0u|f04d94, idleConnectionTestPeriod -> 100,
 initialPoolSize -> 10, maxAdministrativeTaskTime -> 0,
 maxConnectionAge -> 0, maxIdleTime -> 100,
 maxIdleTimeExcessConnections -> 0, maxPoolSize -> 100, maxStatements
 -> 10, maxStatementsPerConnection -> 0, minPoolSize -> 10, nestedDataSource ->
 com.mchange.v2.c3p0.DriverManagerDataSource@f2778985 [ description ->
 null, driverClass -> null, factoryClassLocation -> null, identityToken
 -> z8kfsx8yxnfxily93r0u|4f7bc2, jdbcUrl -> jdbc:mysql://localhost/youcabaret, properties -> {user=******,
 password=******} ], preferredTestQuery -> null, propertyCycle -> 0,
 testConnectionOnCheckin -> false, testConnectionOnCheckout -> true,
 unreturnedConnectionTimeout -> 0, usesTraditionalReflectiveProxies ->
 false; userOverrides: {} ], dataSourceName -> null,
 factoryClassLocation -> null, identityToken ->
 z8kfsx8yxnfxily93r0u|1aaf64d, numHelperThreads -> 3 ] has been
 closed() -- you can no longer use it.
         at com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.assertCpds(AbstractPoolBackedDataSource.java:447)
         at com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getPoolManager(AbstractPoolBackedDataSource.java:459)
         at com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getConnection(AbstractPoolBackedDataSource.java:128)
         at org.hibernate.connection.C3P0ConnectionProvider.getConnection(C3P0ConnectionProvider.java:78)
         at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:446)
         ... 26 more 2013-11-21 07:11:24,870 ajp-bio-8009-exec-2 ERROR (org.apache.struts2.dispatcher.Dispatcher:38) - Exception occurred
 during processing request: Cannot open connection
 org.hibernate.exception.GenericJDBCException: Cannot open connection
         at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:140)
         at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:128)
         at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
         at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:52)
         at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:449)
         at org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:167)
         at org.hibernate.jdbc.JDBCContext.connection(JDBCContext.java:142)
         at org.hibernate.transaction.JDBCTransaction.begin(JDBCTransaction.java:85)
         at org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1463)
         at videoshare.interceptor.usermanager.PossibleLoginIterceptor.intercept(PossibleLoginIterceptor.java:49)
         at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
         at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:54)
         at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:563)
         at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
         at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:99)
         at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
         at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
         at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
         at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
         at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
         at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
         at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
         at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
         at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
         at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
         at org.apache.coyote.ajp.AjpProcessor.process(AjpProcessor.java:200)
         at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603)
         at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
         at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
         at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
         at java.lang.Thread.run(Thread.java:662) Caused by: java.sql.SQLException:
 com.mchange.v2.c3p0.PoolBackedDataSource@1638fbc [
 connectionPoolDataSource ->
 com.mchange.v2.c3p0.WrapperConnectionPoolDataSource@a01f8a5c [
 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 ->
 z8kfsx8yxnfxily93r0u|f04d94, idleConnectionTestPeriod -> 100,
 initialPoolSize -> 10, maxAdministrativeTaskTime -> 0,
 maxConnectionAge -> 0, maxIdleTime -> 100,
 maxIdleTimeExcessConnections -> 0, maxPoolSize -> 100, maxStatements
 -> 10, maxStatementsPerConnection -> 0, minPoolSize -> 10, nestedDataSource ->
 com.mchange.v2.c3p0.DriverManagerDataSource@f2778985 [ description ->
 null, driverClass -> null, factoryClassLocation -> null, identityToken
 -> z8kfsx8yxnfxily93r0u|4f7bc2, jdbcUrl -> jdbc:mysql://localhost/youcabaret, properties -> user=******,
 password=******} ], preferredTestQuery -> null, propertyCycle -> 0,
 testConnectionOnCheckin -> false, testConnectionOnCheckout -> true,
 unreturnedConnectionTimeout -> 0, usesTraditionalReflectiveProxies ->
 false; userOverrides: {} ], dataSourceName -> null,
 factoryClassLocation -> null, identityToken ->
 z8kfsx8yxnfxily93r0u|1aaf64d, numHelperThreads -> 3 ] has been
 closed() -- you can no longer use it.
         at com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.assertCpds(AbstractPoolBackedDataSource.java:447)
         at com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getPoolManager(AbstractPoolBackedDataSource.java:459)
         at com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getConnection(AbstractPoolBackedDataSource.java:128)
         at org.hibernate.connection.C3P0ConnectionProvider.getConnection(C3P0ConnectionProvider.java:78)
         at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:446)
         ... 26 more

and the log says

2013-11-21 07:25:13,228 ajp-bio-8009-exec-1 INFO usermanager.PossibleLoginIterceptor intercept - Session status true false so the session seemto be open milliseconds before

My hibernate config is

    <property name="hibernate.connection.url">jdbc:mysql://localhost/*******</property>
     <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
     <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
     <property name="hibernate.connection.username">*******</property>
     <property name="hibernate.connection.password">*******</property>
     <property name="show_sql">false</property>
     <property name="connection.pool_size">10</property>

<!-- configuration pool via c3p0-->
    <property name="c3p0.max_size">100</property>
    <property name="c3p0.max_statements">10</property>
    <property name="c3p0.min_size">10</property>
    <property name="c3p0.idle_test_period">100</property><!-- seconds  -->   
    <property name="c3p0.timeout">100</property><!-- seconds  -->   
    <property name="c3p0.testConnectionOnCheckout">true</property>
        <property name="hibernate.hbm2ddl.auto">update</property>
        <property name="current_session_context_class">thread</property>

And I open connection from this Utility class

package hibernate.manager;

import org.apache.log4j.Logger;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;

import videoshare.manager.videomanager.VideoManager;

public class HibernateUtil {
    protected static Logger logger = Logger.getLogger(VideoManager.class
            .getName());

    private static final SessionFactory sessionFactory;
    static {
        try {
            // Create the SessionFactory from hibernate.cfg.xml
            sessionFactory = new AnnotationConfiguration().configure()
                    .buildSessionFactory();
        } catch (Throwable ex) {
            // Make sure you log the exception, as it might be swallowed
            logger.error("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }
    }

    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }

}

I obtain the same kind of exception with long term threads and sometimes everything goes well.

To complete informations I'm using Apache Tomcat/7.0.47 with

Java(TM) SE Runtime Environment (build 1.6.0_45-b06)
Java HotSpot(TM) Server VM (build 20.45-b01, mixed mode)

but I notice this problem also on other systems, so I think this is a config problem.

Andrea Ligios
  • 49,480
  • 26
  • 114
  • 243

1 Answers1

2

In intercept method, is userManager object defined at instance level? If yes, then try instantiating it at method level.

Since, interceptor are instantiated only once, it is possible that simultaneous request from multiple threads could lead to this issue. It all depends how long the DB operation is taking up in interceptor; from opening of session to closing of session. Risk of exception rises with the increase in time elapsed to complete DB operation.

Hope this helps.

Thanks.

ms03
  • 101
  • 4
  • 2
    +1, I didn't mention that, giving it for sure, while it is not. Feel free to include in your answer [this example of how to ensure Thread-Safetyness of an Interceptor](http://stackoverflow.com/a/13624381/1654265). – Andrea Ligios Nov 21 '13 at 23:38
  • Hi.what a long sight. My user manager was defined at instance level, now make a lot of test. I put it here when I tied if struts2-fullhibernatecore-plugin is able to set the Session also here As I said this problem appeared and disappeared without a reason, this is compatible with your analisys I think this can't explain why the problem appears also in the separate thread (implemented as Worker) because here I use one instance of manager for every task, but I see that when I had problem on interceptor I had it also on worker, so maybe a single event can put the system under a failure condition – Simone Buzzi Nov 22 '13 at 06:10
  • Thanks for the info Andrea. This will be much better implementation. Simon do checkout the thread in Andrea's comment. – ms03 Nov 22 '13 at 06:34
  • Hi, it's happened again with lower frequency. I usually hibernate the developement environment. Can this be the cause? Is there a way to properly react to this exception. Can I renew the connection pool to solve this problem trashing the sessionFactory generated in the HibernateUtil? Can this be a temporary solution? Pros, cons? – Simone Buzzi Nov 25 '13 at 06:24