Java 连接太多
我有一个Javaservlet,我想与jdbc(数据库:mysql)一起使用连接池 下面是我正在做的: (此类为公共最终类DBConnector) 当我想叫它的时候:Java 连接太多,java,mysql,hikaricp,Java,Mysql,Hikaricp,我有一个Javaservlet,我想与jdbc(数据库:mysql)一起使用连接池 下面是我正在做的: (此类为公共最终类DBConnector) 当我想叫它的时候: Connection con = null; PreparedStatement query = null; ResultSet result = null; try { con = DBConnector.getConnection(0); }catch(SQLException
Connection con = null;
PreparedStatement query = null;
ResultSet result = null;
try {
con = DBConnector.getConnection(0);
}catch(SQLException ex){
}finally{
if (result != null) {
try {
result.close();
} catch (SQLException logOrIgnore) {
}
}
if (query != null) {
try {
query.close();
} catch (SQLException logOrIgnore) {
}
}
if (con != null) {
try {
con.close();
} catch (SQLException logOrIgnore) {
}
}
}
但当我点击我的应用程序时,过了一段时间它开始挂起,我发现以下错误:
java.sql.SQLException: Timeout after 1001ms of waiting for a connection.
at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:208)
at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:108)
at main.java.db.DBConnector.getConnection(DBConnector.java:60)
at main.java.ressources.SingleItemData.getVotes(SingleItemData.java:1088)
at main.java.item.methods.GET.content.GetStreamContent.getStreamContent(GetStreamContent.java:126)
at main.java.RestService.doGet(RestService.java:254)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
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:99)
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.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
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:724)
原因:com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:通信链路故障
我将mysql最大连接数设置为1000。“showProcessList”查询向我显示了许多休眠进程。这些是闲置的吗
我真的被困在这里了。不知道是哪个设置导致了该问题。所以我的问题是-是什么导致了这个错误?我做错了什么?谢谢你的帮助
编辑:
安装Mysql(本地主机):
HikariCP:HikariCP-java6-2.2.5.jar
MySQL连接器:
MySQL-Connector-java-5.1.25-bin.jar
两件事。首先,HikariCP、Java和MySQL驱动程序的版本是什么
第二,一个池中有400个连接?在每个池中从10到20开始。你会惊讶于每秒可以处理几千个事务
第三,这是第二个问题。阅读答案和链接。您需要将maxLifetime
设置为比MySQL本机超时更短的时间(1分钟)
最后,打开调试日志记录,HikariCP没有噪音。管理线程每30秒运行一次,并记录池统计信息。是,这是正确的。所有休眠进程都是空闲进程。做一件事,在创建任何连接之前,您需要检查连接状态,如果有任何打开的连接,请关闭它,然后重新创建。感谢您的快速回答。哦,不,除了那张支票,没有别的支票了。我该怎么做我建议您减少代码中的超时时间<代码>数据源3.setConnectionTimeout(1000)代码>确定-我将按照另一个教程中的建议将其设置为34000。我很快会回信的;)不,这并没有改变它。相同错误:
java.sql.SQLException:等待连接3401ms后超时。在com.zaxxer.hikari.hikari.pool.HikariPool.getConnection(HikariPool.java:208)在com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:108)在main.java.db.DBConnector.getConnection(DBConnector.java:62)在main.java.item.methods.GET.content.GetCont.getContent(GetCont.java:58)在main.java.RestService.doGet(RestService.java:511)上
这是我现在的新值:dataSource2.setConnectionTimeout(34000);数据源2.setIdleTimeout(28740000);数据源2.setMaxLifetime(28740000)代码>好,它正在工作。我按照你说的调整了所有的设置。我还发现了一个小漏洞(我没有关闭连接-愚蠢…),但一个漏洞真的那么有害吗?因为在此之前,我没有使用连接池,泄漏也没有那么严重。啊。当然,谢谢你:)让我开心。没有池的未关闭连接通常是无害的,特别是如果你使用自动提交。连接对象将被垃圾收集,最终数据库将关闭其连接端。对于池,未关闭的连接将导致应用程序冻结,因为池具有最大大小,并且当连接未返回时,最终将清空所有连接。因此,getConnection()的下一个调用方将始终超时。这就是为什么几乎所有的池都支持泄漏检测。
java.sql.SQLException: Timeout after 1001ms of waiting for a connection.
at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:208)
at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:108)
at main.java.db.DBConnector.getConnection(DBConnector.java:60)
at main.java.ressources.SingleItemData.getVotes(SingleItemData.java:1088)
at main.java.item.methods.GET.content.GetStreamContent.getStreamContent(GetStreamContent.java:126)
at main.java.RestService.doGet(RestService.java:254)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
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:99)
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.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
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:724)
[mysqld]
user=mysql
port=3306
socket =/Applications/XAMPP/xamppfiles/var/mysql/mysql.sock
key_buffer=16M
max_allowed_packet=1M
table_open_cache=64
sort_buffer_size=512K
net_buffer_length=8K
read_buffer_size=256K
read_rnd_buffer_size=512K
myisam_sort_buffer_size=8M
max_connections = 1000
wait_timeout = 28800
interactive_timeout = 28800