最近项目遇到棘手的问题,weblogic连接池不断增长导致连接爆满。
后来经过仔细查找发现weblogic连接池设置勾选了PinnedToThread 属性导致的,下面先看下官方对这个属性的介绍吧:
PinnedToThread 是一个能够改善性能的选项,它启用执行线程以保持已入池的数据库连接,即使在应用程序关闭逻辑连接之后。
启用 PinnedToThread 后,WebLogic Server 将在应用程序首次使用某个执行线程保留连接时将连接池中的一个数据库连接固定到此线程。当应用程序使用完此连接并调用 connection.close() (此方法在其他情况下会将连接返回到连接池) 时,WebLogic Server 会将该连接保留给执行线程,而不会将其返回连接池。当此后某个应用程序使用相同的执行线程请求连接时,WebLogic Server 将提供此线程已保留的这个连接。
使用 PinnedToThread,当多个线程尝试同时保留一个连接时,连接池上不会发生锁定冲突,对于试图在有限个数的数据库连接中保留同一个连接的线程,也没有冲突。
如果应用程序使用相同的执行线程同时保留连接池中的多个连接,WebLogic Server 将创建附加的数据库连接并同样将它们固定到此线程。
MBean 属性 (不适用于应用程序模块):
JDBCConnectionPoolParamsBean.PinnedToThread
上面的介绍的大体意思就是如果勾选了这个属性weblogic会为您应用里面的每一个线程够绑定一个连接池里面的链接。如果在应用中不断new新的线程而连接池就会不断增长。
这个属性对于一个线程重复利用很多次的应用来说确实效率带来了提高,但是如果应用不断new新的线程就会导致连接池连接不断增长。可能有人会问线程做完了事情会被gc销毁,这个属性还会为销毁的线程绑定链接吗?weblogic有线程管理。至于以上是为什么还需要继续探究,也希望高人看了。有知道的回答我下。嘿嘿!