Jdbc 数据库轮询器:MySQLNonTransientConnectionException:连接太多

Jdbc 数据库轮询器:MySQLNonTransientConnectionException:连接太多,jdbc,Jdbc,我已经编写了一个Web服务,负责每3秒轮询一次数据库,并发送最新数据 不幸的是,一段时间后,我在控制台中遇到了这个异常 Connection Failed! Check output console com.mysql.jdbc.exceptions.MySQLNonTransientConnectionException: Too many connections at com.mysql.jdbc.SQLError.createSQLException(SQLError.ja

我已经编写了一个Web服务,负责每3秒轮询一次数据库,并发送最新数据

不幸的是,一段时间后,我在控制台中遇到了这个异常

Connection Failed! Check output console
com.mysql.jdbc.exceptions.MySQLNonTransientConnectionException: Too many connections
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:921)
        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2985)
        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:885)
        at com.mysql.jdbc.MysqlIO.secureAuth411(MysqlIO.java:3421)
        at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1247)
        at com.mysql.jdbc.Connection.createNewIO(Connection.java:2775)
        at com.mysql.jdbc.Connection.<init>(Connection.java:1555)
        at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:285)
        at java.sql.DriverManager.getConnection(DriverManager.java:579)
        at java.sql.DriverManager.getConnection(DriverManager.java:221)
        at com.serviceees.DBPollerService.getUpdates(DBPollerService.java:47)
        at sun.reflect.GeneratedMethodAccessor51.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:601)
        at com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$TypeOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:168)
        at com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:70)
        at com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:279)
        at com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:86)
        at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:136)
        at com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:74)
        at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1357)
        at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1289)
        at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1239)
        at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1229)
        at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:420)
        at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:497)
        at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:684)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
        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.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
        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:291)
        at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:877)
        at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:594)
        at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1675)
        at java.lang.Thread.run(Thread.java:722)
这是我的节目

注:这已被多次使用

您需要关闭jdbc连接、PreparedStatement和ResultSet对象。通过将finally块添加到try/catch块的末尾,包装对getConnection和prepareStatement的调用,最容易实现这一点:

在使用JDBC时,我通常会编写助手方法来处理结束任务。通过将它们放置在finally中,您可以确保无论您从try块中获得异常还是返回,它们都始终被执行

您可以使用try with resources功能来关闭连接

try(Connection con=DriverManager.getConnection()){
//sql queries
}
catch(SQLException ex){
//error handling code
}

我想你们也应该建议结束结果并准备好报表。
try {
    connection = DriverManager.getConnection(...)
    ...
} catch ...
...
} finally {
    // Each of these needs wrapped in a try / catch block
    if(resultSet != null) { resultSet.close() }
    if(preparedStatement != null) { preparedStatement.close() }
    if(connection != null) { connection.close() }
}
try(Connection con=DriverManager.getConnection()){
//sql queries
}
catch(SQLException ex){
//error handling code
}