我有一个托管在亚马逊ElasticBeanstalk上的Tomcat7应用程序和一个托管在Amazon RDS上的MySQL 5.5数据库。数据库服务器仅为一个Tomcat应用程序提供服务,并将最大连接限制设置为10,000。
然而,在正常运行几个小时后,数据库连接发生了一些奇怪的事情。
MySQL服务器报告Tomcat JDBC连接池只创建了3个连接,它们都处于“休眠”状态(示例输出):
| 228 | root | ip-10-240-xx-xxx.ap-southeast-2.compute.internal:33270 | xxxxx | Sleep | 13 | | NULL |Tomcat线程转储建议所有3个连接都在从网络IO套接字读取(阻塞):
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:150)
at java.net.SocketInputStream.read(SocketInputStream.java:121)
at com.mysql.jdbc.util.ReadAheadInputStream.fill(ReadAheadInputStream.java:114)
at com.mysql.jdbc.util.ReadAheadInputStream.readFromUnderlyingStreamIfNecessary(ReadAheadInputStream.java:161)
at com.mysql.jdbc.util.ReadAheadInputStream.read(ReadAheadInputStream.java:189)
- locked <0x00000000bc349cc0> (a com.mysql.jdbc.util.ReadAheadInputStream)
at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:3036)因为连接池中只有3个数据库连接,而且它们都停留在IO读取上,所以Tomcat拒绝为任何需要数据库数据的HTTP请求提供服务。
Tomcat JDBC池设置已分配:
maxActive="500"
maxIdle="100"
minIdle="50"
initialSize="50"
maxWait="15000"
timeBetweenEvictionRunsMillis="10000"
minEvictableIdleTimeMillis="30000"
removeAbandoned="true"
removeAbandonedTimeout="120000"
logAbandoned="true"
testOnBorrow="true"
testWhileIdle="true"
validationQuery="select 1"
driverClassName="com.mysql.jdbc.Driver"
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"我仍然不确定为什么所有的3个数据库连接都停留在网络IO读取上,但是考虑到上面的配置,我希望Tomcat在所有现有连接都很忙的情况下创建额外的连接。
我还有其他8个Beanstalk应用程序使用相同的设置,但是只有这个特定的应用程序有如此奇怪的池化行为和网络IO问题。
你有什么建议?
非常感谢。
发布于 2013-03-21 08:14:20
正如http://bugs.mysql.com/bug.php?id=31353上所建议的,您可能会遇到不安全的线程问题。
https://stackoverflow.com/questions/15536518
复制相似问题