ITPub博客

首页 > 数据库 > Oracle > JDBC Connection Leak

JDBC Connection Leak

原创 Oracle 作者:pan_tian 时间:2014-07-03 11:54:09 0 删除 编辑

N年前的一篇笔记,转过来。

---------------------------------------------------------------------------------------------

数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出。对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标。数据库连接池正是针对这个问题提出来的。数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而再不是重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。


用完JDBC连接,一定要记得释放。否则后对性能的影响会很大,系统往往是刚开始还很快,但越往后边跑就越慢。一个凭证过账的程序,开始不到一秒跑完,到后来变成了30秒才能搞定。

连接池
任何应用程序都必须先访问活动的数据库连接,然后才能访问数据库。数据库连接是一个很占资源且 I/O 开销很大的操作,并且如果每次想使用数据库连接时都必须创建它,那么它将会成为您的性能瓶颈。

例如,如果您使用 Java servlet(Javaservlet 通过 init() 方法创建并在其生命周期结束时被销毁(通过 destroy() 方法))的方式,您是虽然避免了每次 servlet 被实例化时重新建立连接。这样一种方式会明显地降低应用程序的性能。完成相同功能的更好的途径是使用"连接池(Connection Pool)",您可以在连接池中初始化多个连接(并且参数可以从 XML 配置文件中读取)。

  连接本身由一组集合对象和一个在整个请求过程中使连接保持打开的用户请求组成。创建连接池的关键是在数据库访问代码中使用如下一些块:try{}.. catch{}... finally{}..。然后您使用 close()方法来确认连接确实被返回到了连接池而不是被彻底关闭了。在"finally{}"块中指定 close() 方法使得执行过程中发生的异常会被捕获到,并且该语句仍被执行 — 连接返回到连接池,这就防止了应用程序中"连接泄漏(connection leak)"的发生。

 以下是构建一个 JDBC 连接的示例:

Connection con = null;
try { ds = (DataSource)myContext.lookup("");
   pooledCon = ds.getConnection("scott","tiger");
   // Processing Code goes here
} catch (Exception ignored) {
  // catch JNDI or JDBC exceptions here
} finally {
  if(pooledCon != null)
  pooledCon.close();
}
--------------------------------------------------------------------------------------------- 
--没有释放Connection之前
[MipeTag]-------凭证已经过账,凭证编码为:0438-------[MipeTag]
eTag]:凭证处理耗时:14734ms,当前凭证分录数为:2
eTag]:构造凭证耗时:26234ms,当前凭证分录数为:2
 mapping to a column: entity: com.xxx.prod.fi.gl.app.VoucherEntry property: assistRecords
 mapping to a column: entity: com.xxx.prod.fi.gl.app.VoucherEntry property: assistRecords
PeriodEndFacadeControllerBean.updateBalance
[MipeTag]-------凭证已经过账,凭证编码为:0439-------[MipeTag]
eTag]:凭证处理耗时:14922ms,当前凭证分录数为:2
eTag]:构造凭证耗时:26266ms,当前凭证分录数为:2
 mapping to a column: entity: com.xxx.prod.fi.gl.app.VoucherEntry property: assistRecords
 mapping to a column: entity: com.xxx.prod.fi.gl.app.VoucherEntry property: assistRecords
PeriodEndFacadeControllerBean.updateBalance
[MipeTag]-------凭证已经过账,凭证编码为:0440-------[MipeTag]
eTag]:凭证处理耗时:14734ms,当前凭证分录数为:2
eTag]:构造凭证耗时:26219ms,当前凭证分录数为:2
 mapping to a column: entity: com.xxx.prod.fi.gl.app.VoucherEntry  property: assistRecords
 mapping to a column: entity: com.xxx.prod.fi.gl.app.VoucherEntry property: assistRecords
PeriodEndFacadeControllerBean.updateBalance
[MipeTag]-------凭证已经过账,凭证编码为:0441-------[MipeTag]
eTag]:凭证处理耗时:14734ms,当前凭证分录数为:2
eTag]:构造凭证耗时:26235ms,当前凭证分录数为:2
 mapping to a column: entity: com.xxx.prod.fi.gl.app.VoucherEntry property: assistRecords
 mapping to a column: entity: com.xxx.prod.fi.gl.app.VoucherEntry  property: assistRecords
PeriodEndFacadeControllerBean.updateBalance
[MipeTag]-------凭证已经过账,凭证编码为:0442-------[MipeTag]
eTag]:凭证处理耗时:14703ms,当前凭证分录数为:2
eTag]:构造凭证耗时:26203ms,当前凭证分录数为:2
 
 
--释放Connection之后
[MipeTag]:投资项目-确认收益--构造凭证耗时:94ms,当前凭证分录数为:2
erty mapping to a column: entity: com.xxx.prod.fi.gl.app.VoucherEntry property: assistRecords
erty mapping to a column: entity: com.xxx.prod.fi.gl.app.VoucherEntry  property: assistRecords
)]GLPeriodEndFacadeControllerBean.updateBalance
62)][MipeTag]-------凭证已经过账,凭证编码为:0517-------[MipeTag]
[MipeTag]:投资项目-确认收益--凭证处理耗时:671ms,当前凭证分录数为:2
[MipeTag]:投资项目-确认收益--构造凭证耗时:94ms,当前凭证分录数为:2
erty mapping to a column: entity: com.xxx.prod.fi.gl.app.VoucherEntry property: assistRecords
erty mapping to a column: entity: com.xxx.prod.fi.gl.app.VoucherEntry property: assistRecords
)]GLPeriodEndFacadeControllerBean.updateBalance
62)][MipeTag]-------凭证已经过账,凭证编码为:0518-------[MipeTag]
[MipeTag]:投资项目-确认收益--凭证处理耗时:625ms,当前凭证分录数为:2
[MipeTag]:投资项目-确认收益--构造凭证耗时:94ms,当前凭证分录数为:2
erty mapping to a column: entity: com.xxx.prod.fi.gl.app.VoucherEntry  property: assistRecords
erty mapping to a column: entity: com.xxx.prod.fi.gl.app.VoucherEntry property: assistRecords
)]GLPeriodEndFacadeControllerBean.updateBalance
62)][MipeTag]-------凭证已经过账,凭证编码为:0519-------[MipeTag]
[MipeTag]:投资项目-确认收益--凭证处理耗时:625ms,当前凭证分录数为:2
[MipeTag]:投资项目-确认收益--构造凭证耗时:109ms,当前凭证分录数为:2
erty mapping to a column: entity: com.xxx.prod.fi.gl.app.VoucherEntry property: assistRecords
erty mapping to a column: entity:  com.xxx.prod.fi.gl.app.VoucherEntry property: assistRecords
)]GLPeriodEndFacadeControllerBean.updateBalance
62)][MipeTag]-------凭证已经过账,凭证编码为:0520-------[MipeTag]
[MipeTag]:投资项目-确认收益--凭证处理耗时:672ms,当前凭证分录数为:2
[MipeTag]:投资项目-确认收益--构造凭证耗时:94ms,当前凭证分录数为:2
erty mapping to a column: entity: com.xxx.prod.fi.gl.app.VoucherEntry property: assistRecords
erty mapping to a column: entity: com.xxx.prod.fi.gl.app.VoucherEntry property: assistRecords
)]GLPeriodEndFacadeControllerBean.updateBalance
62)][MipeTag]-------凭证已经过账,凭证编码为:0521-------[MipeTag]
[MipeTag]:投资项目-确认收益--凭证处理耗时:640ms,当前凭证分录数为:2


<!-- Baidu Button BEGIN -->

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/26687597/viewspace-1207570/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: 《蛙》短评及书摘
下一篇: Webservice Timeout,HTTP Server Return "500 Internal Server Error"
请登录后发表评论 登录
全部评论
暂无介绍

注册时间:2012-02-18

最新文章