日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

c3p0获取连接Connection后的Close()---释疑

發布時間:2025/3/14 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c3p0获取连接Connection后的Close()---释疑 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
  • 論題:
    • 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()---释疑的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚欧洲精品在线视频 | 青青草国产成人av片免费 | 国产高清在线观看 | 久久精品视频在线 | 亚洲精品久久久中文字幕痴女 | 日韩一级一级 | 久久66热这里只有精品 | 欧美日韩亚洲一区二区三区 | 亚洲另类图区 | 伊人日日夜夜 | 美女啪啪无遮挡 | 成人动漫在线免费观看 | 国产精品1区2区3区4区 | 欧美人成在线 | 国产网站视频 | 国产中文欧美日韩在线 | 亚洲国产成人一区二区精品区 | 男人天堂综合网 | 国产又粗又深又猛又爽又在线观看 | 一级全黄裸体片 | 精品乱码一区二区三区四区 | 樱桃视频污污 | 欧美色综合网站 | 国产视频一区二区三区在线 | 亚洲欧美日韩精品久久 | 欧美黑人疯狂性受xxxxx喷水 | 亚洲第一天堂久久 | 久热精品视频在线播放 | 欧美午夜激情视频 | 国产农村熟妇videos | 免费看日产一区二区三区 | 91成人短视频 | 欧美9999| 亚洲不卡一区二区三区 | 日韩有码在线视频 | 国产又黄又粗又猛又爽视频 | 亚洲第一网址 | 秋霞成人| 爱插美女网 | av动态 | 日韩精品第一页 | 黑人黄色大片 | 中文字幕精品三级久久久 | 亚洲国产婷婷香蕉久久久久久99 | 国产成人在线电影 | 免费一级特黄特色大片 | 欧美久久一区二区 | 97色涩 | 国产不卡在线视频 | 欧美国产日本 | 18禁肉肉无遮挡无码网站 | 暖暖av| 青青草97国产精品免费观看 | 亚洲2022国产成人精品无码区 | 国产91视频在线 | 精品人妻一区二区三 | 波多野结衣av在线免费观看 | 九九热视 | 国产福利在线视频观看 | 日韩在线一二三 | av国产在线观看 | 污污在线观看视频 | 日韩精品欧美在线 | 欧美肉大捧一进一出免费视频 | 黄色美女片 | 欧美精品乱码 | 日韩不卡视频在线观看 | 男人天堂成人 | 欧美一区二区公司 | 亚洲精品影视 | 天天干天天色 | 国产国产精品 | 绯色av一区二区三区高清 | 女~淫辱の触手3d动漫 | 国产伦精品一区二区三区照片91 | 四虎新网站 | 日本一二三区在线 | 91资源在线播放 | 欧美成人高清在线 | 人人爽夜夜爽 | 欧美日韩视频在线观看一区 | 欧美三级午夜理伦三级中视频 | 国精产品一区二区 | 天天摸天天碰天天爽天天弄 | 亚洲国产视频一区二区 | 日本高潮视频 | 日韩在线播放一区 | 久久久久久久久久久久久久久久久久久 | 亚洲视频一区在线 | 国产色av | 动漫女被黄漫免费视频 | 男生操女生在线观看 | 俺去俺来也在线www色官网 | 日本69式三人交 | 中文字幕av高清片 | 美女考逼 | 人妻va精品va欧美va | 亚洲欲| 男女啪啪网站 |