【问题标题】:Tomcat connection pooling,idle connections,and connection creationTomcat 连接池、空闲连接和连接创建
【发布时间】:2011-11-13 15:44:01
【问题描述】:

我在 Web 应用程序中遇到以下问题。当我将服务器打开一段时间(例如 24 小时)时,我的应用程序停止工作。 我正在使用 tomcat 7 和连接池。我的数据库是 MySQL。

我收到以下异常:

  Communication link failure: java.io.EOFException, underlying cause: null ** BEGIN NESTED EXCEPTION ** java.io.EOFException STACKTRACE: java.io.EOFException at 
com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:1394) at 
com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:1538) at 
com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:1929) at 
com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1167) at 
com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1278) at 
com.mysql.jdbc.Connection.execSQL(Connection.java:2251) at 
com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1586) at 
org.apache.tomcat.dbcp.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStat
ement.java:96) at 
org.apache.tomcat.dbcp.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStat
ement.java:96) at configuration.Login.doPost(Login.java:104) at 
javax.servlet.http.HttpServlet.service(HttpServlet.java:641) at 
javax.servlet.http.HttpServlet.service(HttpServlet.java:722) at 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.jav
a:304) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
 at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240) at
 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164) at 
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462) at 
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164) at 
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) at 
org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:563) at 
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) at 
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:403) at 
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:301) at 
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java
:162) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java
:140) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:309) 
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) at 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at 
java.lang.Thread.run(Thread.java:662) ** END NESTED EXCEPTION **

我发现这个错误是在一段时间后由于某种原因而关闭的池连接可能由于时间限制或其他原因而发生的。 我的问题是,当没有连接到池中时,连接池不应该创建新连接?该错误不是由流量引起的,因为目前没有人使用该应用程序。我该如何解决这个错误?当应用程序是部署我开始使用应用程序,正在创建池连接。这些连接处于空闲状态?有没有办法不会关闭这些连接?但如果我能做到这一点,我不会浪费服务器上其他应用程序的连接吗?

此外,如果我在创建新连接一段时间后继续尝试使用该应用程序并且该应用程序开始工作。但这不正常.......

//如果我从 MYSQL Admin 手动关闭所有活动连接,则编辑此错误再次出现。

【问题讨论】:

    标签: java mysql tomcat jdbc connection-pooling


    【解决方案1】:

    有后台连接。

    你如何定义你的游泳池?

    这里有一些有用的选项。

    minEvictableIdleTimeMillis="60000"maxActive="100" minIdle="10" maxIdle="50" maxWait="10000"
        removeAbandoned="true" removeAbandonedTimeout="60" logAbandoned="true"
    

    并在网址中添加autoReconnect=true

    url="jdbc:mysql://localhost:3306/db?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8" />
    

    【讨论】:

    • 谢谢。我将尝试使用 autoReconnect。我将在 4 小时内完成此操作,因为我不在我的计算机上。我发现第一次访问数据库失败。然后连接已创建。也许在我的连接为空时使用 for 循环是个好主意?
    猜你喜欢
    • 2014-12-04
    • 1970-01-01
    • 2012-04-02
    • 1970-01-01
    • 2012-01-15
    • 2010-11-25
    • 1970-01-01
    • 2014-11-13
    • 1970-01-01
    相关资源
    最近更新 更多