`
还是你更好
  • 浏览: 54533 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

使用数据库连接池connection.close()不是真正关闭的疑问

    博客分类:
  • java
阅读更多
引发几个疑问啊。
问题1:
使用数据库连接池得到的connection是不用程序关闭,连接池自己会把一定时间内没有使用的connection拿回到池里。----然后,我不知道这句话对不对。如果对,那么在spring中,hibernate中,很多都用了ThreadLocal来控制多线程中的事务,这样不会就有问题了吗?---连接池把con分给这个线程使用,放在ThreadLocal中,而一回收后又交给其他线程使用,放在ThreadLocal中,要是这些线程同时要做事务,同一个connection那还如何事务?

问题2:
人家都说调用connection的close()方法没关系,不会被关,怎么不会被关啊?
sun api文档方法说明:
引用
void close()
          Releases this Connection object's database and JDBC resources immediately instead of waiting for them to be automatically released.

如果我没理解错,调用此方法是主动去释放这个连接的资源,以代替数据库或者jdbc自动释放,不就是关闭吗?
除非是从数据库连接池里get到的connection是经过包装的。
比如
class MyConnection extends java.sql.Connection
{
@override
 public void close()
 {
   //回收到连接池里
 }
}

而连接池的代码,得到connection实际是它的子类MyConnection
class ConnectionPool ..
{
 ...
 public Conncetion getConnection()
 {
   return new MyConnection(...);
  }
 ...
}
硬是把close方法重写了,这样调用close时就不会被真正关闭。
我懒人一个,没去看开源的数据库连接池代码。不知以上的观点对不对,或者还有其他机制,或者我想得根本不对!
有人知道其真正原理吗?能讨论下原理吗?
分享到:
评论
16 楼 还是你更好 2009-06-26  
嗯,这个主题可以结贴了.
15 楼 lioushuei 2009-06-26  
一个conn肯定只能同时被一个事务使用。
所谓的 共用一个conn 其实是:可被多个多个事务或者请求使用 但是不是同时。

还有,如果一个事务a 现在使用链接conna  ,在使用 conna.close() 显示的放回链接池  或者长时间不使用自动的被连接池 回收后, 当事务a 再次需要链接的时候调用的不一定再是conna 。 可以说是 连接池维持的等待链接的conn里面随机取得。
14 楼 airu 2009-04-24  
看看对象池模式你们就了解了。
什么时候回收对象(连接,或者线程或者其他什么东西)是取决于策略的。
就好比Java的垃圾回收,如果你实现不好,可能会出现很多问题。

我想如果是我实现,我肯定会用个守护线程来观察各个对象的状态。
如果对象被关闭了,或者超时了,那么守护线程就回收这个对象。所以很多
池都有个超时设置的。如果你的程序可能长时间使用一个对象,那么这个时间就最好设置长点。
第二个问题connection.close重写后只是设置某个连接的状态,而不是真正的去关闭这个连接。你要做的只是使用它。而管理它的任务就交给这个pool来吧。
13 楼 还是你更好 2009-04-23  
那我们交给其他网友,看看如何
12 楼 C_J 2009-04-22  
殊不知 我比你更懒!
11 楼 还是你更好 2009-04-22  
这个问题就交给楼上吧,呵呵。我比较懒。
10 楼 C_J 2009-04-22  
很多时候都是自问自答,呵呵


"spring或者hibernate或者其他什么的,在回收某个线程的Con时,同时会把ThreadLocal里与它对应的con变为空"

是这样的么?  能查到源码么? 因为最近也在接触这个~

9 楼 还是你更好 2009-04-20  
对不起,我对问题1没说得清楚。我再解释一下些问题:
线程ThreadA取得一个AConnection去做操作,因为要涉及事务,ThreadLocal保存了关于这个ThreadA的con,下次此线程再需要con去做操作时,ThreadLocal就直接把这个保存的con给ThreadA了。
一段时间过去了
连接池发现这个AConnection很久没用,就回收了。
现在有个线程ThreadB需要一个Connnection去做操作,连接池给它分配了刚刚回收的AConnection
ThreadB拿AConnection去做事情
此时ThreadA也醒来,采用AConnection去做事情
一个Connection被两个线程同时使用,事务就可能出问题了。因为同一个Connection是去执行事务的前提。

突然,我在描述问题时,想到了,其实spring或者hibernate或者其他什么的,在回收某个线程的Con时,同时会把ThreadLocal里与它对应的con变为空,此线程在下次取Con时发现con==null,它就又去连接池里取了。
于是问题1也有解决方案了。呵呵。
8 楼 iaimstar 2009-04-20  
看代理模式
7 楼 C_J 2009-04-20  
对于问题2,我的理解是:

    楼主有没有想过 其实连接池也就是对象池的一种,只不过是涉及到数据库操作而已,所谓“关闭”,也就是把暂时不用的“连接对象”放回“池子”里。当发生某些“事务”(比如很久不连接或者连接数达到上限)时,再做真正的关闭操作。

对于问题1,我的理解是:

引用
要是这些线程同时要做事务,同一个connection那还如何事务?

我没有完全明白是什么意思?
本来ThreadLocal就是轻量线程同步机制吧,只不过是对于某个成员变量(如这里的con),它让每个线程都拥有一个con的副本,这样为什么会出现问题呢?楼主能说详细点么?

引用
一回收后又交给其他线程使用


这里我有个模糊的地方,ThreadLocal是的con副本,这里还涉及不涉及回收的问题?

1,如果涉及,那么也应该是回收到池子里

2,我的理解是回收之后不会直接给其他线程使用,而是从“池中”拿一个con对象给其他线程使用。这里相当于有个“中介机构”
6 楼 还是你更好 2009-04-13  
问题1啊,等得好苦
5 楼 还是你更好 2009-04-10  
问题2,我想的那个是一个实现方式。
网上找到
使用JAVA中的动态代理实现数据库连接池
,它也是转自ibm的资料,估计这个是更标准的实现方式,采用了有人叫Business Delegate模式,也有人叫动态代理模式实现。
这种模式,在我blog上有介绍
代理模式
现在就问题1没找到答案了。
4 楼 还是你更好 2009-04-09  
metadmin 写道
连接池重写了Connectin.close()方法。

close方法,是将该Cnnection回收连接池,而不是关闭。

呵呵,我说的“通知”词语不恰当。

真和我想的一样啊?真是这样,就剩下不知道第一个问题的答案了。
3 楼 metadmin 2009-04-09  
连接池重写了Connectin.close()方法。

close方法,是将该Cnnection回收连接池,而不是关闭。

呵呵,我说的“通知”词语不恰当。
2 楼 还是你更好 2009-04-09  
metadmin 写道
如果使用连接池的话,
调用connection.close()是通知连接池回收该connection,不进行关闭操作。所以就回到池里了。关闭操作,由连接池在一定条件下执行的。
连接池自己维护创建新链接、关闭长期不用链接等等。

谢谢楼上的回答,不过我想知道的是你说的这个“通知连接池”是怎么样实现的?
1 楼 metadmin 2009-04-09  
如果使用连接池的话,
调用connection.close()是通知连接池回收该connection,不进行关闭操作。所以就回到池里了。关闭操作,由连接池在一定条件下执行的。
连接池自己维护创建新链接、关闭长期不用链接等等。

相关推荐

    HikariCP数据库连接池实战.docx

    HikariCP 数据库连接池实战 HikariCP 是一个高性能的 Java 数据库连接池,由 Zachary Tong 开发并维护。它基于 Apache Commons DBCP,并进行了许多优化和改进,以提供更好的性能和可扩展性。 HikariCP 的核心理念...

    Java实现数据库连接池..docx

    Java 实现数据库连接池主要涉及两个关键点:减少使用者与连接池之间的耦合度和接管 `Connection.close()` 方法。为了实现这两个目标,我们可以利用 Java 的动态代理机制。 首先,了解数据库连接池的作用。连接池是...

    java 数据库 连接池驱动.rar

    - 获取和释放连接:通过数据源对象的getConnection()方法获取连接,使用完毕后调用Connection的close()方法,实际上将连接返回给连接池,而非真正关闭。 4. **连接池的优缺点** 优点: - 资源复用,提高性能。 ...

    Java实现数据库连接池..pdf

    对于数据库连接池,我们可以通过动态代理来接管`java.sql.Connection`接口的方法,特别是`close()`方法。这样,当用户尝试关闭连接时,代理对象实际上不会立即关闭连接,而是将其返回到连接池中,供其他用户重复使用...

    DBCP数据库连接池借鉴.pdf

    数据库连接池(Database Connection Pool)是一种管理数据库连接的机制,它允许应用程序重复使用已经存在的数据库连接,而不是每次需要时都创建新的连接。这样可以显著提高性能,减少系统资源的消耗,尤其是在高并发...

    DBCP数据库连接池jar包.zip

    数据库连接池的出现解决了这个问题,它在应用程序启动时预创建一定数量的数据库连接,并存储在一个池中,当程序需要访问数据库时,可以从池中获取一个已经建立好的连接,使用完毕后再归还给池,而不是真正关闭连接。...

    数据库连接池简介.txt

    ### 数据库连接池知识点详解 #### 一、数据库连接池概念与作用 数据库连接池是一种管理数据库连接的技术,它的主要作用在于复用已创建的数据库连接,并通过优化连接的管理和分配来提高应用程序的整体性能。在实际...

    补充 数据库连接池.ppt

    然后,通过DataSource的getConnection()方法获取连接,使用完毕后调用Connection的close()方法,但实际上连接并未真正关闭,而是返回到连接池中。 **Apache DBUtils简介** Apache的DBUtils是一个简单的JDBC工具包...

    数据库连接池jar包.zip

    标题提到的"数据库连接池jar包.zip"显然包含了Druid数据库连接池的jar文件,供开发者在项目中使用。 `druid-1.0.15.jar` 是Druid连接池的核心库,包含了所有必需的类和方法,用于初始化、管理和维护数据库连接。这...

    C# 数据库连接池

    数据库连接池是一组预先初始化的数据库连接,当程序需要与数据库建立连接时,可以从池中获取一个已经存在的连接,而不是每次都创建新的连接。使用完毕后,连接不会立即关闭,而是返回到连接池中供后续使用。这样可以...

    JAVA 使用数据库连接池连接Oracle数据库全代码

    ### JAVA 使用数据库连接池连接Oracle数据库全代码解析 #### 一、概述 本文将详细介绍如何在Java项目中使用Apache DBCP(Database Connection Pool)来连接Oracle数据库,并提供完整的示例代码。通过这种方式,我们...

    java实现数据库连接池

    3. 连接池的实现: ConnectionPool 类使用 Java.sql.Connection 类来实现数据库连接池,该类提供了多个方法来管理数据库连接,包括获取连接、关闭连接、提交事务等。 三、Java 实现数据库连接池的实现代码 以下是 ...

    数据库连接池java代码实现

    本文将深入探讨如何使用Java代码来实现一个简单的数据库连接池,并解释其核心概念和工作原理。 连接池的基本思想是维护一组预初始化的数据库连接,当应用程序需要时,可以从池中获取一个连接,使用完毕后,再归还回...

    数据库连接池-连接的关闭内幕

    ### 数据库连接池-连接的关闭内幕 在深入探讨数据库连接池中连接关闭的问题之前,我们首先需要了解数据库连接池的基本概念以及它在现代应用程序中的重要性。数据库连接池是一种管理多个数据库连接的方法,旨在提高...

    ASP[1].NET与数据库连接池.doc

    ASP.NET数据库连接池是提高应用程序性能的关键特性,尤其对于基于Web的应用和客户端/服务器Web服务。连接池通过重用已建立的数据库连接,减少了创建和销毁连接所需的时间,从而提升了整体性能。当应用程序打开一个...

    数据库连接池相关 jar 包

    数据库连接池在Java开发中扮演着至关重要的角色,它能够有效地管理和优化数据库连接,提高应用程序的性能和资源利用率。在给定的标题和描述中,我们聚焦于两个关键的库——`commons-dbcp.jar`和`commons-pool.jar`,...

    JSP数据库连接池连接实例

    在IT行业中,数据库连接池是优化应用程序性能的关键技术之一,特别是在使用Java服务器页面(JSP)进行Web开发时。数据库连接池允许程序高效地管理与数据库的连接,减少了创建和销毁连接的开销,提高了系统资源利用率...

    数据库连接池使用范例

    本文将深入探讨数据库连接池的原理、作用,以及如何在Java Web环境中,特别是结合Tomcat服务器和JSP进行配置和使用。 首先,我们需要理解什么是数据库连接池。数据库连接池是一种管理数据库连接的技术,它预先创建...

    简单建立数据库连接池及JDK自带日志使用(真正)

    4. **获取和关闭连接**:通过`dataSource.getConnection()`方法获取数据库连接,使用完毕后调用`Connection.close()`,实际上连接会被放回连接池,而不是真正关闭。 ```java Connection conn = dataSource.get...

Global site tag (gtag.js) - Google Analytics