栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Tomcat连接池:几种不释放连接的方法

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Tomcat连接池:几种不释放连接的方法

这是对连接池的不正确使用。您永远不应调用

close()
未包装的连接。

使用池连接的正常流程是

  1. 获取
    Connection
    ,池获得物理连接并返回包装在其自己的包装器中的包装
  2. 您使用
    Connection
  3. 你叫
    close()
    Connection
    。这实际上并没有 关闭 任何内容,池的包装程序拦截了该
    close()
    调用,并仅将(仍处于活动状态的)连接返回到池。

之所以有效,是因为该池具有包装器类,

PoolableConnection
即that
implementsConnection
PoolableConnection
委托底层连接来执行实际工作,但是(除其他事项外)实现方式
close()
有所不同。这将破坏当前的
PoolableConnection
包装,并将底层组件返回
Connection
到连接池。例如。

这样,您的程序逻辑就可以从中获取连接,然后

DataSource
使用
Connection
close()
,就像正常的非池化一样
Connection

正是这种透明性使连接池易于使用。

现在,当您调用时

unwrap
PooledConnection
您就可以访问它的内部真实
Connection
委托。

什么 ,你 要做的就是调用

close()
的委托

这有两个效果:

  1. 它不叫
    close()
    PooledConnection
    ,所以在
    Connection
    没有得到返回到池中。
  2. 它关闭了池底的底层连接。这不应该成为问题,因为池本身将处理掉线的连接。

因此,您需要非常小心。 总是

close()
Connection
你已经从池中得到,将其返回到池中。 永远不要
调用
close()
基础连接。

因此,您的代码应为:

try (final Connection poolConn = DataSourceConnectionPool.getConnection()) {    final Connection conn = poolConn.unwrap(OracleConnection.class);    //do stuff with conn    //do not close conn!!}//poolConn is returned to the pool


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/417345.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号