设为首页 收藏本站
查看: 786|回复: 0

[经验分享] tomcat 连接池

[复制链接]

尚未签到

发表于 2017-1-16 08:30:58 | 显示全部楼层 |阅读模式
tomcat连接池, 被坑得很惨, 记录下来
主要是apache common dbcp和tomcat-jdbc之间的混乱
这是tomcat7,8的tomcat-jdbc

<Resource name="jdbc/DBPool"
auth="Container"
type="javax.sql.DataSource"
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
testWhileIdle="true"
testOnBorrow="true"
testOnReturn="false"
validationQuery="SELECT 1"
validationInterval="30000"
timeBetweenEvictionRunsMillis="30000"
maxActive="30"
minIdle="3"
maxWait="10000"
initialSize="10"
removeAbandonedTimeout="60"
removeAbandoned="true"
logAbandoned="true"
minEvictableIdleTimeMillis="30000"
jmxEnabled="true"
jdbcInterceptors="org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer"
username="******"
password="******"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/db"/>


这是tomcat 6,7的dbcp

<Resource
auth="Container"
driverClassName="com.mysql.jdbc.Driver"
maxActive="5"
maxIdle="3"
maxWait="15000"
minEvictableIdleTimeMillis="7200000"
name="jdbc/pjcenter"
password="******"
testOnBorrow="true"
testWhileIdle="true"
timeBetweenEvictionRunsMillis="3600000"
type="javax.sql.DataSource"
url="jdbc:mysql://localhost:3306/db"
useUnicode="true"
characterEncoding="utf-8"
username="******"
validationQuery="select 1"
removeAbandoned="true"
removeAbandonedTimeout="500"
logAbandoned="true"
/>


这是tomcat 8版本的dbcp

<Resource
name="jdbc/pjcenter"
auth="Container"
type="javax.sql.DataSource"
maxTotal="10"
maxIdle="3"
maxWaitMillis="10000"
username="******"
password="******"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/db" />


这是dbcp的属性
maxActive->maxTotal, maxWait->maxWaitMillis,
而jdbc的属性又跟dbcp的差不多, 有时候你都不知道你用的到底是dbcp还是tomcat-jdbc
我的惨痛经历是:
生产环境下, 开启一个程序, 在启动阶段一直不动, 把数据复制到开发环境, 一点问题都没有, 经过1整天的瞎猜, 查日志, 终于定位到了是数据库连接池的问题, 此问题非常坑人, 我的程序启动需要开13个数据库连接, 结果他是请求到5个, 然后后面的就一直在死循环, 也不报错, 5个正好是默认值, 然后又没有地方显式指定dbcp还是tomcat-jdbc
重点1: 查看你在使用的是dbcp还是tomcat-jdbc, 我最后发现, 我使用的是dbcp, 而maxActive在tomcat8下面没有产生作用, 所以造成获取数据库的死循环
重点2: 查看dbcp还是tomcat-jdbc
方法1: 在<context下面的 <resource里, 如果有
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
就是tomcat-jdbc, 否则就是dbcp
方法2: 控制台打印: System.out.println("con: "+con);
tomcat-jdbc: ProxyConnection[PooledConnection[com.mysql.jdbc.JDBC4Connection@1a36300]]
dbcp:15344435, URL=jdbc:mysql://localhost:3306/pjdemo, UserName=examcenter@localhost, MySQL-AB JDBC Driver

bug
采用tomcat-jdbc方式
maxActive="30"
minIdle="5"
一个线程, 开13个连接
开, 关 操作, 即开13个连接, 关闭13个连接
开/关, 操作前面6次没问题, 到第7次, 就获取不到连接了
改成
maxTotal="30"
minIdle="5"
开/关, 操作前面6次没问题, 到第20次, 仍然是很正常
但TMD官方文档里说, tomcat-jdbc是maxActive
dbcp 则改成 maxTotal
不带这么坑人的啊

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-328968-1-1.html 上篇帖子: tomcat内存修改 下篇帖子: ant启动和关闭tomcat
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表