alxe1528

          BlogJava 聯(lián)系 聚合 管理
            3 Posts :: 11 Stories :: 2 Comments :: 0 Trackbacks

          前段時(shí)間剛完成一個(gè)家教網(wǎng)項(xiàng)目,數(shù)據(jù)庫(kù)為MySQL5.0,持久層使用Hibernate 3.1,沒(méi)有使用額外的連接池,那么Hibernate會(huì)默認(rèn)使用它自帶的一個(gè)默認(rèn)連接池,也就是DriverManagerConnectionProvider。
            先在本機(jī)上調(diào)試都毫無(wú)問(wèn)題,于是部署到服務(wù)器上,也都沒(méi)什么問(wèn)題。由于這是新網(wǎng)站,根本還沒(méi)正式對(duì)外發(fā)布和宣傳,所以頭兩天根本沒(méi)人訪問(wèn)。等到第二天,我再次訪問(wèn)網(wǎng)站時(shí),問(wèn)題就出現(xiàn)了,錯(cuò)誤信息如下:

          root cause

          javax.servlet.ServletException: org.hibernate.exception.JDBCConnectionException: could not execute query
           org.apache.struts.action.RequestProcessor.processException(RequestProcessor.java:535)
           org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:433)
           org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
           org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
           org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
           javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
           javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
           org.apache.jsp.index_jsp._jspService(index_jsp.java:57)
           org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
           javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
           org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
           org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:337)
           org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
           javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
           com.lab1000.jcom.system.filter.RequestEncodingFilter.doFilter(RequestEncodingFilter.java:30)

          root cause

          org.hibernate.exception.JDBCConnectionException: could not execute query
           org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:74)
           org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
           org.hibernate.loader.Loader.doList(Loader.java:2148)
           org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2029)
           org.hibernate.loader.Loader.list(Loader.java:2024)
           org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:94)
           org.hibernate.impl.SessionImpl.list(SessionImpl.java:1533)
           org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:283)
           com.lab1000.jcom.dao.ArticleDAO.getArticlesUnder(ArticleDAO.java:163)
           com.lab1000.jcom.struts.action.HomeAction.execute(HomeAction.java:40)
           org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)
           org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
           org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
           org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
           javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
           javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
           org.apache.jsp.index_jsp._jspService(index_jsp.java:57)
           org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
           javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
           org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
           org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:337)
           org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
           javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
           com.lab1000.jcom.system.filter.RequestEncodingFilter.doFilter(RequestEncodingFilter.java:30)

          root cause

          com.mysql.jdbc.exceptions.MySQLNonTransientConnectionException: No operations allowed after connection closed.Connection was implicitly closed due to underlying exception/error:
          
          ** BEGIN NESTED EXCEPTION ** 
          
          com.mysql.jdbc.CommunicationsException
          MESSAGE: Communications link failure due to underlying exception: 
          
          ** BEGIN NESTED EXCEPTION ** 
          
          java.io.EOFException
          
          STACKTRACE:
          
          java.io.EOFException
           at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:1963)
           at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2375)
           at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2874)
           at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1623)
           at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1715)
           at com.mysql.jdbc.Connection.execSQL(Connection.java:3249)
           at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1268)
           at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1403)
           at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:139)
           at org.hibernate.loader.Loader.getResultSet(Loader.java:1669)
           at org.hibernate.loader.Loader.doQuery(Loader.java:662)
           at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)
           at org.hibernate.loader.Loader.doList(Loader.java:2145)
           at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2029)
           at org.hibernate.loader.Loader.list(Loader.java:2024)
           at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:94)
           at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1533)
           at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:283)
           at com.lab1000.jcom.dao.ArticleDAO.getArticlesUnder(ArticleDAO.java:163)
           at com.lab1000.jcom.struts.action.HomeAction.execute(HomeAction.java:40)
           at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)
           at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
           at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
           at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
           at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
           at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
           at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
           at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
           at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:630)
           at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:436)
           at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:374)
           at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:302)
           at org.apache.jsp.index_jsp._jspService(index_jsp.java:57)
           at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
           at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
           at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
           at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:337)
           at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
           at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
           at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
           at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
           at com.lab1000.jcom.system.filter.RequestEncodingFilter.doFilter(RequestEncodingFilter.java:30)
           at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
           at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
           at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
           at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
           at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
           at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
           at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
           at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
           at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:190)
           at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:283)
           at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:767)
           at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:697)
           at org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:889)
           at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:690)
           at java.lang.Thread.run(Unknown Source)
          
          ** END NESTED EXCEPTION **
          
          Last packet sent to the server was 15 ms ago.
          
          STACKTRACE:
          
          com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception: 
          
          ** BEGIN NESTED EXCEPTION ** 
          
          java.io.EOFException
          
          STACKTRACE:
          
          java.io.EOFException
           at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:1963)
           at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2375)
           at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2874)
           at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1623)
           at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1715)
           at com.mysql.jdbc.Connection.execSQL(Connection.java:3249)
           at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1268)
           at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1403)
           at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:139)
           at org.hibernate.loader.Loader.getResultSet(Loader.java:1669)
           at org.hibernate.loader.Loader.doQuery(Loader.java:662)
           at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)
           at org.hibernate.loader.Loader.doList(Loader.java:2145)
           at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2029)
           at org.hibernate.loader.Loader.list(Loader.java:2024)
           at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:94)
           at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1533)
           at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:283)
           at com.lab1000.jcom.dao.ArticleDAO.getArticlesUnder(ArticleDAO.java:163)
           at com.lab1000.jcom.struts.action.HomeAction.execute(HomeAction.java:40)
           at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)
           at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
           at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
           at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
           at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
           at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
           at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
           at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
           at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:630)
           at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:436)
           at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:374)
           at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:302)
           at org.apache.jsp.index_jsp._jspService(index_jsp.java:57)
           at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
           at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
           at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
           at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:337)
           at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
           at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
           at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
           at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
           at com.lab1000.jcom.system.filter.RequestEncodingFilter.doFilter(RequestEncodingFilter.java:30)
           at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
           at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
           at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
           at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
           at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
           at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
           at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
           at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
           at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:190)
           at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:283)
           at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:767)
           at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:697)
           at org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:889)
           at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:690)
           at java.lang.Thread.run(Unknown Source)
          
          ** END NESTED EXCEPTION **
          
          Last packet sent to the server was 15 ms ago.
           at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2586)
           at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2874)
           at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1623)
           at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1715)
           at com.mysql.jdbc.Connection.execSQL(Connection.java:3249)
           at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1268)
           at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1403)
           at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:139)
           at org.hibernate.loader.Loader.getResultSet(Loader.java:1669)
           at org.hibernate.loader.Loader.doQuery(Loader.java:662)
           at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)
           at org.hibernate.loader.Loader.doList(Loader.java:2145)
           at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2029)
           at org.hibernate.loader.Loader.list(Loader.java:2024)
           at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:94)
           at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1533)
           at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:283)
           at com.lab1000.jcom.dao.ArticleDAO.getArticlesUnder(ArticleDAO.java:163)
           at com.lab1000.jcom.struts.action.HomeAction.execute(HomeAction.java:40)
           at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)
           at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
           at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
           at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
           at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
           at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
           at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
           at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
           at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:630)
           at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:436)
           at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:374)
           at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:302)
           at org.apache.jsp.index_jsp._jspService(index_jsp.java:57)
           at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
           at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
           at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
           at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:337)
           at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
           at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
           at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
           at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
           at com.lab1000.jcom.system.filter.RequestEncodingFilter.doFilter(RequestEncodingFilter.java:30)
           at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
           at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
           at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
           at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
           at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
           at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
           at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
           at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
           at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:190)
           at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:283)
           at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:767)
           at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:697)
           at org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:889)
           at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:690)
           at java.lang.Thread.run(Unknown Source)
          
          ** END NESTED EXCEPTION **
          
           com.mysql.jdbc.SQLError.createSQLException(SQLError.java:888)
           com.mysql.jdbc.Connection.checkClosed(Connection.java:1931)
           com.mysql.jdbc.Connection.prepareStatement(Connection.java:4705)
           com.mysql.jdbc.Connection.prepareStatement(Connection.java:4671)
           org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:442)
           org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:368)
           org.hibernate.jdbc.AbstractBatcher.prepareQueryStatement(AbstractBatcher.java:105)
           org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1561)
           org.hibernate.loader.Loader.doQuery(Loader.java:661)
           org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)
           org.hibernate.loader.Loader.doList(Loader.java:2145)
           org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2029)
           org.hibernate.loader.Loader.list(Loader.java:2024)
           org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:94)
           org.hibernate.impl.SessionImpl.list(SessionImpl.java:1533)
           org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:283)
           com.lab1000.jcom.dao.ArticleDAO.getArticlesUnder(ArticleDAO.java:163)
           com.lab1000.jcom.struts.action.HomeAction.execute(HomeAction.java:40)
           org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)
           org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
           org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
           org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
           javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
           javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
           org.apache.jsp.index_jsp._jspService(index_jsp.java:57)
           org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
           javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
           org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
           org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:337)
           org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
           javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
           com.lab1000.jcom.system.filter.RequestEncodingFilter.doFilter(RequestEncodingFilter.java:30)

            當(dāng)時(shí)也搞不清楚為什么,但重啟Tomcat后就一切回復(fù)正常了,但是又過(guò)了一天,問(wèn)題再次出現(xiàn)。仔細(xì)分析錯(cuò)誤信息,問(wèn)題肯定出在數(shù)據(jù)庫(kù)連接部分,在網(wǎng)上查閱大量信息后,明確了問(wèn)題的原因:MySQL對(duì)所有連接的有效時(shí)間默認(rèn)為28800秒,正好8小時(shí),也就是說(shuō),如果一個(gè)連接8小時(shí)沒(méi)有請(qǐng)求和操作,就會(huì)自動(dòng)斷開;但是對(duì)于Hibernate來(lái)說(shuō),它的連接池并不知道它所管理的連接中是否有被MySQL斷開的。如果一個(gè)程序要使用數(shù)據(jù)庫(kù)連接,而Hibernte的連接池分配一個(gè)已經(jīng)被MySQL斷開了的給程序使用,那么便會(huì)出現(xiàn)錯(cuò)誤。

            為了證實(shí)確實(shí)是這個(gè)錯(cuò)誤,我在本機(jī)上做了如下測(cè)試:首先啟動(dòng)Tomcat,網(wǎng)站能夠正常打開;然后修改系統(tǒng)時(shí)間,往后調(diào)1天;然后再打開網(wǎng)站,同樣的問(wèn)題果然出現(xiàn)!MySQL + Hibernate架構(gòu)相當(dāng)普遍,所以這個(gè)問(wèn)題也相當(dāng)普遍,若讀者也有這樣的項(xiàng)目,建議做一下同樣的測(cè)試,看看是否存在此問(wèn)題!

            問(wèn)題找到了,怎么解決呢?
            思路1:增大MySQL的連接有效時(shí)間;
            思路2:從程序自身出發(fā),修改連接池的相關(guān)參數(shù)。
            顯然,思路1是不可行的,一方面這個(gè)思路不可能保證這個(gè)問(wèn)題絕對(duì)的解決,如果無(wú)訪問(wèn)時(shí)間夠長(zhǎng),還是大于MySQL的連接有效時(shí)間,問(wèn)題同樣會(huì)發(fā)生;另一方面,一般情況下,我們都是將程序部署在別人服務(wù)器上,我們不可能去修改MySQL配置。那么只能從思路2入手了。
            經(jīng)查資料發(fā)現(xiàn),Hibernate支持如下的連接池:
             DriverManagerConnectionProvider:代表由Hibernate提供的默認(rèn)的數(shù)據(jù)庫(kù)連接池
             C3P0ConnectionProvider:代表C3P0連接池
             ProxoolConnectionProvider:代表Proxool連接池
             DBCPConnectionProvider:代表DBCP連接池
             DatasourceConnectionProvider:代表在受管理環(huán)境中由容器提供的數(shù)據(jù)源
            其中,默認(rèn)連接池并不支持在分配一個(gè)連接時(shí),測(cè)試其有效與否的功能,而C3P0、Proxool、DBCP都提供了這樣的功能,正好可以解決上述問(wèn)題。綜合考慮各個(gè)連接池的效率、穩(wěn)定性、易用性,決定換用Proxool,它確實(shí)在各方面表現(xiàn)優(yōu)良,方便配置。
            下面就看看如何配置Proxool:
            1、Hibernate配置文件:

          <session-factory>
          <property name="hibernate.connection.provider_class">org.hibernate.connection.ProxoolConnectionProvider</property>
          <property name="hibernate.proxool.xml">proxool.xml</property>
          <property name="hibernate.proxool.pool_alias">mysql</property>

          <property name="show_sql">false</property>
          <property name="dialect">org.hibernate.dialect.MySQLDialect</property>

          <mapping resource="com/lab1000/jcom/pojo/Admin.hbm.xml" />
          ...
          </session-factory>

            其中各屬性含義如下:
          hibernate.connection.provider_class:指明使用Proxool連接池
          hibernate.proxool.xml:指明Proxool配置文件所在位置,這里與Hibernate的配置文件在同一目錄下
          hibernate.proxool.pool_alias:指明要使用的proxool.xml中定義的proxool別名。

            2、Proxool配置文件(proxool.xml):

          <?xml version="1.0" encoding="UTF-8"?> 
          <!-- the proxool configuration can be embedded within your own application's. 
          Anything outside the "proxool" tag is ignored. --> 
          <something-else-entirely> 
          <proxool>

          <!-- proxool別名 -->
          <alias>mysql</alias>

          <!-- 數(shù)據(jù)庫(kù)連接Url -->
          <driver-url> 
          jdbc:mysql://localhost/yourDatebase?useUnicode=true&characterEncoding=UTF-8
          </driver-url>

          <!-- JDBC驅(qū)動(dòng)名稱 -->
          <driver-class>com.mysql.jdbc.Driver</driver-class>

          <!-- 數(shù)據(jù)庫(kù)連接帳號(hào) -->
          <driver-properties> 
          <property name="user" value="root" /> 
          <property name="password" value="password" />
          </driver-properties>

          <!-- proxool自動(dòng)偵察各個(gè)連接狀態(tài)的時(shí)間間隔(毫秒),偵察到空閑的連接就馬上回收,超時(shí)的銷毀 -->
          <house-keeping-sleep-time>90000</house-keeping-sleep-time>

          <!-- 指因未有空閑連接可以分配而在隊(duì)列中等候的最大請(qǐng)求數(shù),超過(guò)這個(gè)請(qǐng)求數(shù)的用戶連接就不會(huì)被接受 --> 
          <maximum-new-connections>20</maximum-new-connections>

          <!-- 最少保持的空閑連接數(shù) -->
          <prototype-count>3</prototype-count>

          <!-- 允許最大連接數(shù),超過(guò)了這個(gè)連接,再有請(qǐng)求時(shí),就排在隊(duì)列中等候,最大的等待請(qǐng)求數(shù)由maximum-new-connections決定 -->
          <maximum-connection-count>20</maximum-connection-count>

          <!-- 最小連接數(shù) -->
          <minimum-connection-count>3</minimum-connection-count>

          <!-- 在分配連接前后是否進(jìn)行有效性測(cè)試,這個(gè)是解決本問(wèn)題的關(guān)鍵 -->
          <test-before-use>true</test-before-use>
          <test-after-use>true</test-after-use>

          <!-- 用于測(cè)試的SQL語(yǔ)句 -->
          <house-keeping-test-sql>SELECT CURRENT_USER</house-keeping-test-sql>

          </proxool> 
          </something-else-entirely>

            3、下載和安裝Proxool的包文件
            下載地址:http://proxool.sourceforge.net/download.html
            下載后并解壓后,將其中l(wèi)ib文件夾下的jar文件拷貝到你站點(diǎn)的WEB-INF/lib下

            自此,Proxool配置成功。重新啟動(dòng)Tomcat,再次做上述測(cè)試,問(wèn)題解決。
            此外,如果要使用C3P0或DHCP,可以參考以下資料:
            http://blog.csdn.net/lip8654/archive/2008/02/26/2121387.aspx
            http://azi.javaeye.com/blog/182146
            http://fishyych.javaeye.com/blog/90793

          posted on 2011-12-29 17:24 鄭健成 閱讀(1111) 評(píng)論(2)  編輯  收藏

          Feedback

          # re: MySQL+Hibernate下連接空閑8小時(shí)自動(dòng)斷開問(wèn)題解決方案 Proxool 2015-03-29 16:19 迷路的火星人
          2、Proxool配置文件(proxool.xml):
          <!-- 數(shù)據(jù)庫(kù)連接Url -->
          <driver-url>
          jdbc:mysql://localhost/yourDatebase?useUnicode=true&amp;characterEncoding=UTF-8
          </driver-url>

            回復(fù)  更多評(píng)論
            

          # re: MySQL+Hibernate下連接空閑8小時(shí)自動(dòng)斷開問(wèn)題解決方案 Proxool 2015-03-29 16:19 迷路的火星人
          @迷路的火星人
          注意&  回復(fù)  更多評(píng)論
            


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 阿荣旗| 宣武区| 兴城市| 白山市| 乐至县| 镇安县| 潢川县| 广灵县| 贵定县| 余姚市| 丰原市| 芦山县| 安国市| 永德县| 普洱| 武清区| 政和县| 南昌县| 五常市| 江西省| 安达市| 天镇县| 宁武县| 兰坪| 通江县| 新余市| 新和县| 三台县| 东宁县| 祁连县| 轮台县| 普陀区| 韶关市| 敖汉旗| 丘北县| 盐池县| 高邮市| 凤台县| 白玉县| 平利县| 日喀则市|