zoukankan      html  css  js  c++  java
  • 理解数据库连接池和ThreadLocal实现的事务控制

    我发现 不少人 误解了这两者。 csdn上也有人提出过这种疑问:

    http://bbs.csdn.net/topics/250061733

    经过查阅资料和认真分析,我特说明一下这两者概念上的区别。

    我只讲两个关键点,明白人一看就懂:

    1、两者有根本性的区别,用处不一样!

       1)连接池是缓存并托管数据库连接,主要是为了提高性能。

       2)而ThreadLocal缓存连接,是为了把同一个数据库连接“分享”给同一个线程的不同调用方法。(不管调用哪个方法,都是使用的同一个连接,方便进行“跨方法”的事务控制)

      举个例子: 

      如果一个请求中涉及多个 DAO 操作,而如果这些DAO中的Connection都是独立的话,就没有办法完成一个事务。但是如果DAO 中的 Connection 是从 ThreadLocal 中获得的(意味着都是同一个对象), 那么这些 DAO 就会被纳入到同一个 Connection 之下。

    2、重点要理解“连接池”。

     连接池里面有一定数量的连接资源,比如最大20个连接。

    题外话:如果直接通过 Java原生API 获取“直连”的话:

      (底层方法一般都是这样写的:

           java.sql.DriverManager.getConnection(url, props);

           java.sql.Driver.connect(url, props);

      特点是:要传入url、用户名和密码等信息)

      这种方式,肯定就没有使用数据库连接池。

    使用数据库连接池,通常都是得到一个所谓的javax.sql.DataSource[接口]的实例对象,它里面包含了Connection,并且数据库连接池工具类(比如C3P0、JNDI、DBCP等),肯定是重新定义了getConnection、closeConnection等方法,所以你每次得到的Connection,几乎都不是新建立的连接(而是已经建立好并放到缓存里面的连接),你调用closeConnection方法,也不是真正的关闭连接(一般都是起到一个标识作用,标识当前连接已经使用完毕,归还给连接池,让这个连接处于待分配状态)【PS:所以说:使用数据库连接池时,还是要显式的调用数据库连接池API提供的关闭连接的方法】。

           理解一下这句话:

        不同的线程在同一个时间( 或者 同一个线程在多个地方) 从连接池中拿到的Connection,肯定不是同一个连接。(反过来讲:不同时间的两个线程,一前一后,则有可能拿到同一个连接)。

  • 相关阅读:
    ffmpeg开发系列--av_read_frame()
    2013~2014
    javascript
    javascript
    javascript目录
    最长连续和与最大子矩阵
    成功者具备的十五种能力
    视频综合管理平台EasyNVS在实现代理时调用EasyDSS接口如何携带token?
    在线课堂Web无插件直播点播系统EasyDSS如何接入第三方视频管理平台EasyNVS?
    TSINGSEE青犀视频开发的EasyNTS上云网关网络穿透/远程运维在系统维护中的应用
  • 原文地址:https://www.cnblogs.com/zollty/p/3606151.html
Copyright © 2011-2022 走看看