• 论题:

    • java c3p0获取连接Connnection 之后, 调用 con.close( ) 是否真的关闭了物理连接 ?
  • 简答:
    • c3p0采用连接池, 目的就是提前预置一定数量的连接, 在使用时候重复利用这些连接, 所以, con.close() 之后, 物理连接当然是被放回了连接池, 而没有真正的关闭 .
    • c3p0中的池连接(指:Connection) 是实现了PooledConnection接口的, PooledConnection为连接池管理提供钩子 (hook) 的对象, 它会在connnection被操作时接收到消息, 从而对该操作加以干涉,将Connection连接放回连接池.
  • 疑问:

    • 一些童鞋经过试验,发现如下问题,于是发出路上疑问, con.close()真的关闭了连接吗...
    •  1 public class MyTest {
       2     /**
       3     * 开启了20个线程,返回的hashcode,如下:没有重复的
       4     *1730967171    1122742512    156948859    1210106945    1217158489
       5     *1868341939    1595154849    1873764403    1937202425    1629470861
       6     */
       7     public static void main(String[] args) {
       8         for (int i = 0; i < 10; i++) {
       9             new Thread(new Runnable() {
      10                 @Override
      11                 public void run() {
      12
      13                     Connection con = JDBCUtil.getConnection();
      14                     System.out.println(con.hashCode());
      15                     // ....
      16                     con.close();
      17                     } catch (SQLException e) {
      18                         e.printStackTrace();
      19                     }
      20                 }
      21             }).start();
      22         }
      23     }
      24 }
      25 public class JDBCUtil {
      26     /**
      27     * <!-- 最大空闲时间设置为0 , 即永不过期 -->
      28     * <property name="maxIdleTime">0</property>
      29     * <!-- 最多有多少个连接 -->
      30     * <property name="maxPoolSize">5</property>
      31     * <!-- 最少几个连接 -->
      32     * <property name="minPoolSize">2</property>
      33     */
      34     private static Connection conn;
      35     private static ComboPooledDataSource ds = new ComboPooledDataSource();
      36
      37     public static Connection getConnection() {
      38             try {
      39                 conn = ds.getConnection();
      40             } catch (SQLException e) {
      41                 e.printStackTrace();
      42             }
      43         return conn;
      44     }
      45 }

      View Code

    • c3p0源码跟踪 [ps : 水平有限,以下未解释java事件注册相关原理 ]

    •  1 abstract class AbstractPoolBackedDataSource
       2         extends PoolBackedDataSourceBase
       3             implements PooledDataSource{
       4 //.....
       5
       6     // dataSource.getConnection()所调用的就是该方法
       7     //implementation of javax.sql.DataSource
       8     public Connection getConnection() throws SQLException{
       9
      10         PooledConnection pc =
      11                 getPoolManager(). // 返回 C3P0PooledConnectionPoolManager
      12                 getPool(). // 返回 C3P0PooledConnectionPool
      13                 checkoutPooledConnection(); // 返回PooledConnection
      14         return pc.getConnection();
      15     }
      16
      17 //.....
      18 }
      19
      20
      21
      22 class C3P0PooledConnectionPool{
      23     // ....
      24      public PooledConnection checkoutPooledConnection() throws SQLException{
      25         //System.err.println(this + " -- CHECKOUT");
      26         try
      27         {
      28         PooledConnection pc = (PooledConnection) this.checkoutAndMarkConnectionInUse();
      29         pc.addConnectionEventListener( cl );
      30         return pc;
      31         }
      32         catch (TimeoutException e)
      33         { throw SqlUtils.toSQLException("An attempt by a client to checkout a Connection has timed out.", e); }
      34         catch (CannotAcquireResourceException e)
      35         { throw SqlUtils.toSQLException("Connections could not be acquired from the underlying database!", "08001", e); }
      36         catch (Exception e)
      37         { throw SqlUtils.toSQLException(e); }
      38     }
      39
      40     private Object checkoutAndMarkConnectionInUse() throws TimeoutException, CannotAcquireResourceException, ResourcePoolException, InterruptedException
      41     {
      42         Object out = null;
      43     boolean success = false;
      44     while (! success)
      45         {
      46         try
      47             {
      48             out = rp.checkoutResource( checkoutTimeout );
      49             if (out instanceof AbstractC3P0PooledConnection)
      50                 {
      51                 // cast should succeed, because effectiveStatementCache implies c3p0 pooled Connections
      52                 AbstractC3P0PooledConnection acpc = (AbstractC3P0PooledConnection) out;
      53                 /*
      54                  *以下在获取物理连接的时候,PooledcConnection中注册的事件监听器会收到消息
      55                  *无论每次对connection的何种操作,PooledConnection都会收到来自驱动的消息,
      56                  *其中的钩子(hook)对象就会完成对Connection的回收
      57                  */
      58                 Connection physicalConnection = acpc.getPhysicalConnection();
      59                 success = tryMarkPhysicalConnectionInUse(physicalConnection);
      60                 }
      61             else
      62                 success = true; //we don't pool statements from non-c3p0 PooledConnections
      63             }
      64         finally
      65             {
      66             try { if (!success && out != null) rp.checkinResource( out );}
      67             catch (Exception e) { logger.log(MLevel.WARNING, "Failed to check in a Connection that was unusable due to pending Statement closes.", e); }
      68             }
      69             }
      70         return out;
      71     }
      72     //....
      73
      74 }

      View Code

  • 综述:
    • 当应用程序关闭连接时,它调用 Connection 方法 close。完成连接池时,连接池管理器将得到通知;因为它曾使用 ConnectionPool 方法 addConnectionEventListener 作为 ConnectionEventListener 对象注册它自身。连接池管理器释放到 PooledConnection 对象的句柄,并将 PooledConnection 对象返回到连接池,以便再次使用。因此,当应用程序关闭其连接时,基础物理连接会被回收而不是被关闭。
    • 知识水平有限,难免错误,模糊, 请多批评指正,谢谢.

转载于:https://www.cnblogs.com/murthy/p/6495196.html

c3p0获取连接Connection后的Close()---释疑相关推荐

  1. c3p0 服务启动获取连接超时_c3p0获取连接Connection后的Close()---释疑

    abstract class AbstractPoolBackedDataSource extends PoolBackedDataSourceBase implements PooledDataSo ...

  2. DBCP和C3P0实现连接池技术

    DBCP和C3P0实现连接池技术 本文是基于Windows 10系统环境,学习和使用连接池技术: Windows 10 MyEclipse 10 DCBP C3P0 一.连接池技术的基本概念 (1) ...

  3. C3P0 连接池获取的connection执行close() 方法是销毁连接还是释放资源归还连接至连接池?

    C3P0 连接池获取的connection执行close() 方法是释放资源销毁连接还是释放资源归还连接至连接池? 如果你只是想要一个答案的话,可以很明确的说: 连接池的连接对象在执行clos()方法 ...

  4. c3p0 服务启动获取连接超时_JDBC数据库连接池

    连接池的本质是构建一个容器,容器是用来存创建好的线程,http连接.数据库连接.netty连接等 各个连接池的使用大致分为三个部分 1.首先是初始化连接池,根据设置相应的参数.连接池的大小.核心连接数 ...

  5. c3p0 服务启动获取连接超时_微服务架构中的熔断、降级

    微服务架构中熔断和降级是保证服务高可用的一项重要功能点,微服务区别于一体化项目的最大区别也再于熔断和降级,很多微服务项目的开发人员对熔断的理解就是当服务不可用的时候,为了让整体服务可以正常运行,需要让 ...

  6. hessian无法获取连接_PPPoE拨号设置完成后无法上网解决方法【详解】

    问题分析 设置好路由器WAN口PPPoE拨号后,如果上不了网,请登录路由器的管理界面,点击 运行状态 >> WAN口状态,如果WAN口状态一直处于正在连接,无法连接成功.如下图所示: 请参 ...

  7. Java Web(十) JDBC的增删改查,C3P0等连接池,dbutils框架的使用

    前面做了一个非常垃圾的小demo,真的无法直面它,菜的抠脚啊,真的菜,好好努力把.菜鸡. --WZY 一.JDBC是什么? Java Data Base Connectivity,java数据库连接, ...

  8. 但是尚未从池中获取连接_SQLServer超时时间已到,但是尚未从池中获取连接

    小编最近开发了一个项目,数据库是SQLServer2008R2,在WinForm程序通过API接口短时间大批量上传数据时,出现了错误"超时时间已到,但是尚未从池中获取连接",数据是 ...

  9. [bug]超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小。...

    引言 自己弄了一个小项目--日程管理系统,在初始化日期时,查询了数据库,每个日期就会查询一次数据库,就导致了这个问题. 问题 出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小. Desc ...

最新文章

  1. 组件化开发,制作Cocoapods Git库
  2. UESTC_摩天轮 2015 UESTC Training for Dynamic ProgrammingProblem K
  3. Python 技术篇-用base64库对音频、图片等文件进行base64编码和解码实例演示
  4. 居然之家忍“刮骨疗伤”之痛拥抱新零售
  5. SpringBoot中操作spring redis的工具类
  6. 资深美术分享:游戏开发如何确定画风?
  7. 在xml文件的Preference标签中,用extra给intent标签加参数
  8. 侍魂服务器维修,侍魂胧月传说合服活动开启 4月15日更新内容预告
  9. flutter BottomAppBar 实现不规则底部导航栏
  10. 计算机视觉基础:图像处理Task 02 几何变换
  11. vue源码学习:Object.defineProperty 对数组监听
  12. java常用类objet,Java基础-常用API-Object类
  13. Pytorch优化器全总结(二)Adadelta、RMSprop、Adam、Adamax、AdamW、NAdam、SparseAdam(重置版)
  14. 想做合格的产品经理,你需要这个证书
  15. 越狱后如何添加cydia源及cydia源大全
  16. 中文用户名改为英文只要3步复制黏贴
  17. 数字信号处理7——点到向量的距离
  18. 1.基于深度学习的知识追踪研究进展_刘铁园
  19. 批处理脚本学习笔记——程序员版
  20. 《学习opencv》笔记——矩阵和图像操作——cvMax,cvMaxS,cvMerge,cvMin and cvMinS

热门文章

  1. Ubuntu 14 配置Android Studio的快捷启动方式
  2. 导出oracle sequences,CSS_oracle导出序列方法分析,方法一:SELECT ' CREATE SEQUEN - phpStudy...
  3. JZOJ 5637. 【NOI2018模拟4.8】一双木棋
  4. JZOJ 5048. 【GDOI2017模拟一试4.11】IQ测试
  5. todo文件说明已停止工作_番茄ToDo,一款颜值功能兼备的番茄钟。
  6. python 求两条曲线的交点_这几种问法都是考察张角问题,高考数学圆锥曲线的焦点弦张角定理...
  7. ECCV 2018 MemTrack:《Learning Dynamic Memory Networks for Object Tracking》论文笔记
  8. CVPR 2010 MOSSE:《Visual Object Tracking using Adaptive Correlation Filters.》论文笔记
  9. [USACO1.3]混合牛奶 Mixing Milk
  10. 用python爬取淘宝用户数据的单位是_国内有没有数据爬取方面的公司?