0

I didn't expect to see this even using the latest version of Hibernate. I am using Hibernate version 5.1.0.Final

I am using it with spring and here is the config:

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"
          p:dataSource-ref="mySQLDataSource">
        <property name="packagesToScan" value="package.to.scan"/>
        <property name="hibernateProperties">
            <props>
                <prop key="showSql">true</prop>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
                <prop key="hibernate.current_session_context_class">thread</prop>
            </props>
        </property>
    </bean>

The mySQLDataSource bean:

<bean id="mySQLDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="java:comp/env/jdbc/dbResource"/>
</bean>

The JNDI resource:

<Resource name="jdbc/dbResource" 
    auth="Container"
    type="javax.sql.DataSource"
    maxActive="50"
    username="root"
    password=""
    driverClassName="com.mysql.jdbc.Driver"
    url="jdbc:mysql://localhost:3306/dbname"
    />

There is probably a workaround this but I am really interested in knowing what is the standard approach to resolve this problem?

Stacktrace:

SEVERE: Servlet.service() for servlet [spring-mvc] in context with path [] threw exception [Request processing failed; nested exception is org.hibernate.TransactionException: JDBC begin transaction failed: ] with root cause
java.net.SocketException: Broken pipe
    at java.net.SocketOutputStream.socketWrite0(Native Method)
    at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:113)
    at java.net.SocketOutputStream.write(SocketOutputStream.java:159)
    at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82)
    at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140)
    at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3333)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1971)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2151)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2619)
    at com.mysql.jdbc.ConnectionImpl.setAutoCommit(ConnectionImpl.java:4997)
    at sun.reflect.GeneratedMethodAccessor49.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.apache.tomcat.jdbc.pool.ProxyConnection.invoke(ProxyConnection.java:126)
    at org.apache.tomcat.jdbc.pool.JdbcInterceptor.invoke(JdbcInterceptor.java:109)
    at org.apache.tomcat.jdbc.pool.DisposableConnectionFacade.invoke(DisposableConnectionFacade.java:80)
    at com.sun.proxy.$Proxy20.setAutoCommit(Unknown Source)
    at org.hibernate.resource.jdbc.internal.AbstractLogicalConnectionImplementor.begin(AbstractLogicalConnectionImplementor.java:67)
    at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.begin(LogicalConnectionManagedImpl.java:235)
    at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.begin(JdbcResourceLocalTransactionCoordinatorImpl.java:214)
    at org.hibernate.engine.transaction.internal.TransactionImpl.begin(TransactionImpl.java:52)
    at org.hibernate.internal.SessionImpl.beginTransaction(SessionImpl.java:1525)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.hibernate.context.internal.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:338)
    at com.sun.proxy.$Proxy61.beginTransaction(Unknown Source)
    at com.adism.dao.AdDaoImpl.beginTransaction(AdDaoImpl.java:59)
    at com.adism.dao.AdDaoImpl.getAll(AdDaoImpl.java:69)
    at com.adism.web.controllers.AdController.indexPage(AdController.java:57)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:222)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:814)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:737)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:969)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:860)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:620)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:845)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:315)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)
Toseef Zafar
  • 1,601
  • 4
  • 28
  • 46

1 Answers1

1

Looks like this issue is happening if the application has no activity with the database for a considerable amount of time (say 12 hours in your case). So it could be an issue related to expired or stale connection issue.

As per this link, MySQL by defaults assumes any connection that has been idle for a longer period, say 8 hours, marks it as inactive and closes it. But the connection pooling mechanism on application end may not be aware of this connection close and results in broken pipe exception at a later point when the app actually uses it.

As suggested in the link please set up with testOnBorrow=true and validationQuery=SELECT 1.

Apart from that, your sessionFactory is still using hibernate4 specific one.

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"

I believe that could be the issue.

Can you try with hibernate5 specific LocalSessionFactoryBean.

<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"
  • sure, i will try this, but I will have to come back after some time because this issue happens after some time after the tomcat is restarted – Toseef Zafar Feb 14 '16 at 13:06
  • Hi Madhusudana, I still got this issue! – Toseef Zafar Feb 15 '16 at 10:51
  • @Tefa Looks like you are getting this issue not every time but intermittently. How frequently are you getting this issue? And what is happening to subsequent requests or connections? – Madhusudana Reddy Sunnapu Feb 15 '16 at 10:57
  • I am getting this problem every time, basically what happens is when I do a fresh deployment or restart tomcat all works fine, this issue happens when there is no hit to site in say e.g. 12 hours and after 12 hours when I hit the site I see that issue. – Toseef Zafar Feb 15 '16 at 11:03
  • @Tefa I suspect it could be an issue related to expired or stale connection issue. Can you please check this URL if that relates to your issue [http://stackoverflow.com/questions/17046815/connection-pool-issue](http://stackoverflow.com/questions/17046815/connection-pool-issue) – Madhusudana Reddy Sunnapu Feb 15 '16 at 11:14
  • @Tefa Another more related link that indicates that MySQL by defaults assumes any connection that is idle for more than 8 hours as inactive and closes it. But the connection pooling mechanism on application end isn't aware of this connection close and results in broken pipe exception at a later point when it is actually used by the application. Please have a look at [http://amitcodes.com/2008/07/26/16/](http://amitcodes.com/2008/07/26/16/). This looks more relevant, please check. – Madhusudana Reddy Sunnapu Feb 15 '16 at 11:51
  • Thanks, for now, I have put autoReconnect=true in the url, I already have validationQuery, let me test this and if this doesn't work too then I will try 'testOnBorrow' property to see if that fixes the issue. I will reply after 8 hours lol – Toseef Zafar Feb 15 '16 at 12:06
  • @Tefa hmm I know :) Fingers crossed. – Madhusudana Reddy Sunnapu Feb 15 '16 at 12:11
  • Let us [continue this discussion in chat](http://chat.stackoverflow.com/rooms/103545/discussion-between-tefa-and-madhusudana-reddy-sunnapu). – Toseef Zafar Feb 15 '16 at 23:10
  • @Tefa updated the answer as per the working solution. Glad it worked. – Madhusudana Reddy Sunnapu Feb 16 '16 at 13:34
  • Thanks for your help Madhu, nice talking to you. – Toseef Zafar Feb 16 '16 at 14:46