我正在使用tomcat-jdbc连接数据库。我正在使用以下PoolPropertiesp.setUrl(url); p.setDriverClassName(dirverClassName);//"mysqlDriver" p.setUsername(userName); p.setPassword(passWord); p.setJmxEnabled(true); p.setTestWhileIdle(false); p.setTestOnBorrow(true); p.setValidationQuery(validationQuery);//"select 1" p.setTestOnReturn(false); p.setValidationInterval(30000); p.setTimeBetweenEvictionRunsMillis(30000); p.setMaxActive(8); p.setInitialSize(1); p.setMaxWait(1000*60*1); p.setRemoveAbandonedTimeout(2000); p.setMinEvictableIdleTimeMillis(30000); p.setMinIdle(1); p.setMaxIdle(2); p.setLogAbandoned(true); p.setRemoveAbandoned(true);
我有两个问题
1>我经常从数据源获得连接。有时超过maxActive。同时,DB中的某些连接处于睡眠模式。 MinEvictableIdleTimeMillis之后,睡眠连接将关闭。所以我收到以下错误
`com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Data source rejected establishment of connection, message from server: "Too many connections"`
2>有时我需要保持长时间连接,因为我一次插入了凸起数据。因此,我为MinEvictableIdleTimeMillis设置了较大的值。将MinEvictableIdleTimeMillis时间设置为更大会增加连接睡眠时间。
我想我错误地使用了属性。请帮我解决问题。请指导我正确配置数据源。提前致谢
最佳答案
1)第一个问题似乎已经达到服务器中可用的最大连接数。我实际上不知道它是如何发生的(以防万一,请检查您的max_connections
MySQL变量)。您确定要从连接池获取所有连接吗?也许您在Java代码中获得了一些不是来自连接池的连接(因为应该对其进行检查)。还要确保返回使用的每个ResultSet
,Statement
和Connection
(在完成所有对象的调用后,在close()
块内调用finally
方法)
2)我不确定为什么您要在Web应用程序中将数据库连接保持空闲状态30秒钟;如果您长时间“占用”您的连接,可能会导致饥饿。请重新考虑这是否确实必要,或者是否可以重新设计您正在做的事情,以便减少对数据库连接的限制