亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

自定義一個簡單的JDBC連接池實現方法

2024-07-13 10:14:59
字體:
來源:轉載
供稿:網友

一、什么是JDBC連接池?

在傳統的JDBC連接中,每次獲得一個Connection連接都需要加載通過一些繁雜的代碼去獲取,例如以下代碼:

public static Connection getConn(){  Connection conn = null;  String url = "jdbc:mysql://localhost:3306/test";  String user = "root";  String password = "root";  try {   Class.forName("com.mysql.jdbc.Driver");   conn = DriverManager.getConnection(url, user, password);  } catch (ClassNotFoundException e) {   e.printStackTrace();  } catch (SQLException e) {   e.printStackTrace();  }  return conn; }

這樣繁雜的操作只為了獲取一次連接,當然,我們可以將其封裝成一個工具類來訪問(上圖以封裝好Connection的連接),但是每一次連接都需要取加載一次是不是很浪費性能,為了優化性能,那么就出現了連接池。

連接池在初始化的時候就創建了幾個連接供我們使用,當我們需要連接時只需要從連接池中獲取已存在的連接,當初始化的幾個連接都沒有時,會重新創建一個連接,使用完連接后不會去銷毀連接,而是歸還給連接池供后面需要連接的使用。(當然,連接池不僅僅只是這么簡單,這里就只做這些介紹)

常用的連接池有DBCP、C3P0,現在最主流是好像是阿里的Druid連接池,還有tomcat的自帶的JNDI連接池

二、自定義一個簡單的連接池

對自定義連接池的分析:

1.2.因為是連接池 ,我們需要實現DataSource接口,并實現其中的方法,基于我們的情況,我們關于與getConnection()方法;

2.既然要存放幾個連接對象,那么我們用一個集合來存放它,基于會經常操作增加和刪除那么選用LinkedList;

3.連接的銷毀并不是銷毀連接,而是將連接歸還給連接池

編碼:

1.創建一個類MyDataSource 并實現DataSource接口

當此類加載時它就需要有一個容器來存放Connection,所以定義一個靜態的屬性:

private static List<Connection> connectionList = new LinkedList<>();

2.因為需要取獲得數據庫連接,所以我們封裝一個獲取數據庫連接的方法

public Connection getOneConnection(){  Connection conn = null;  try{   //此處通過外部的properties文件來獲取的數據,這樣更加靈活。   InputStream in = MyDataSource.class.getClassLoader().     getResourceAsStream("jdbc/jdbc.properties");   Properties pro = new Properties();   pro.load(in);   driver = pro.getProperty("driver");   url = pro.getProperty("url");   username = pro.getProperty("user");   password = pro.getProperty("password");   Class.forName(driver);   conn = DriverManager.getConnection(url,username,password);  }catch (Exception e){   e.getStackTrace();  }  return conn; }

注意的是我這里通過propertie文件的獲取的數據,可根據實際情況來選擇

3.初始化幾個連接放入容器中。可以使用靜態代碼塊來實現,但是如果沒有使用此數據源那么就造成了資源的浪費,所以我考慮將初始化幾個連接的實現放到他的構造方法中,即當需要此連接池的時候他才會隨之創建幾個連接。如下:

public MyDataSource() {  for (int i = 0; i < 5; i++) {   Connection conn = getOneConnection();//調用創建連接的方法   connectionList.add(conn);  } }

4.現在開始重寫外部從此連接池中獲取連接的方法getConnection()

@Override public Connection getConnection() throws SQLException {  Connection conn = null;  if(connectionList == null || connectionList.size() <= 0){   Connection connection = getConnection();   connectionList.add(connection);  }  conn = connectionList.remove(0);  return conn; }

5.創建一個對象返回的方法,即將用完的連接放入歸還到連接池中

 

public void backConnection(Connection conn){  connectionList.add(conn); }

OK,這樣就完成了一個簡單的自定義連接池,測試代碼如下:

public static void main( String[] args ) throws SQLException {  MyDataSource dataSource = new MyDataSource();  Connection conn = dataSource.getConnection();  String sql = "select * from user where u_id = ?";  PreparedStatement ps = null;  ResultSet rs = null;  try {   ps = conn.prepareStatement(sql);   ps.setInt(1, 1);   rs = ps.executeQuery();   while (rs.next()) {    System.out.println("id="+rs.getInt(1));    System.out.println("username="+rs.getString(2));    System.out.println("password="+rs.getString(3));   }  } catch (SQLException e) {   e.printStackTrace();  } finally {   dataSource.backConnection(conn);  } }

因為忽略,我的代碼中沒有關閉其他兩個對象。

現在有一個小問題就是,我們的關閉連接是通過連接池的方法來實現的,但是,如果用戶調用Connection對象的close方法,那么連接時被銷毀了,并沒有返回給連接池,那么我們來優化它,讓用戶使用close()方法不會去銷毀連接,而是去歸還連接。

方案有很多中,這里采用裝飾著模式的一種。

優化:

1.新建一個類MyConnection來實現Connection接口,其中他有屬性類型為Connection conn和一個Liis<Connection>。

private Connection conn; private List<Connection> pool;  public MyConnection(Connection conn, List<Connection> pool) {  this.conn = conn;  this.pool = pool; }

2.然后實現接口的close方法

 @Override public void close() throws SQLException {  System.out.println("回收連接");  pool.add(conn); }

3.然后實現他獲取Statement的方法,如果不實現那么獲取此Statement會出現空指針錯誤,我這里就只實現了PreparedStatement的獲取方法

@Override public PreparedStatement prepareStatement(String sql) throws SQLException {  System.out.println("獲得Statement");  return conn.prepareStatement(sql); }

4.然后刪除掉MyDataSource類中歸還連接的方法backConnection,并將構造方法和獲取連接的方法做如下改造

public MyDataSource2() {  for (int i = 0; i < 5; i++) {   Connection conn = getOneConnection();   MyConnection myConn = new MyConnection(conn, connectionList);   connectionList.add(myConn);  } }
@Override public Connection getConnection() throws SQLException {  Connection conn = null;  if(connectionList == null || connectionList.size() <= 0){   Connection connection = getConnection();   MyConnection myConn = new MyConnection(connection, connectionList);   connectionList.add(myConn);  }  conn = connectionList.remove(0);  return conn; }

好了,這樣用戶直接調用我們的Connection的close方法就不會去銷毀連接了,會正確的歸還給了連接池了,對測試代碼稍做修改即可測試。

以上這篇自定義一個簡單的JDBC連接池實現方法就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产日产欧美精品| 国产精品爽爽ⅴa在线观看| 国产日韩精品在线观看| 国产在线一区二区三区| 国产精欧美一区二区三区| 成人精品在线视频| 国产精品久久久久久久久久尿| 国产精品久久久久免费a∨| 海角国产乱辈乱精品视频| 久久久免费电影| 久久久精品美女| 久久久久久高潮国产精品视| 人人澡人人澡人人看欧美| 国产美女扒开尿口久久久| 日韩毛片中文字幕| 欧美在线影院在线视频| 国产精品露脸av在线| 成人精品久久久| 欧美中文字幕在线观看| 欧美小视频在线| 久久久人成影片一区二区三区| 日韩毛片中文字幕| 欧美一级黄色网| 国内精品视频在线| 中国日韩欧美久久久久久久久| 欧美精品在线网站| 亚洲女人天堂成人av在线| 欧美黑人xxxⅹ高潮交| 午夜精品久久久久久久99黑人| 97在线免费观看视频| 精品magnet| 亚洲网站在线观看| 亚洲精品www久久久久久广东| 亚洲成年网站在线观看| 亚洲精品成人久久久| 国产精品一区久久久| 日韩免费在线视频| www.欧美精品一二三区| 91精品国产乱码久久久久久蜜臀| 国产日韩精品在线| 国产欧美精品xxxx另类| 亚洲精品有码在线| 欧美老少做受xxxx高潮| 国产精品久久久久影院日本| 国产精品嫩草影院一区二区| 国产在线98福利播放视频| 中文字幕在线国产精品| 亚洲男人天堂久| 日韩av男人的天堂| 国产精品丝袜白浆摸在线| 日韩av日韩在线观看| 欧美性xxxx极品高清hd直播| 欧美日韩亚洲系列| 亚洲欧洲一区二区三区久久| 亚洲精品国产综合区久久久久久久| 国产精品视频xxx| 精品呦交小u女在线| 日韩欧美亚洲范冰冰与中字| 国内揄拍国内精品少妇国语| 亚洲精品久久久久久久久久久| 国产美女搞久久| xxx一区二区| 久久成人一区二区| 欧美黄色三级网站| 国产精品入口夜色视频大尺度| 亚洲欧美精品伊人久久| 国产主播欧美精品| 91成人国产在线观看| 久久精品免费播放| 亚洲日本欧美中文幕| 国产国语刺激对白av不卡| 亚洲香蕉成人av网站在线观看| 深夜福利一区二区| 亚洲精品av在线播放| 中文字幕在线视频日韩| 久久人人爽人人爽人人片av高清| 亚洲qvod图片区电影| 亚洲国产精品小视频| 欧美日韩国产一中文字不卡| 亚洲国产精品福利| 欧美日韩国产精品一区二区三区四区| 狠狠色噜噜狠狠狠狠97| 91精品久久久久久久久中文字幕| 精品久久中文字幕久久av| 国产中文字幕亚洲| 成人免费在线网址| 欧美理论电影在线播放| 亚洲国内精品视频| 中文字幕在线成人| 午夜精品久久久久久久99黑人| 亚洲精品在线看| 精品国产鲁一鲁一区二区张丽| 日韩电影中文字幕在线观看| 国产欧美婷婷中文| 国产视频精品va久久久久久| 久久在线免费视频| 91色精品视频在线| 国内精品视频在线| 综合激情国产一区| 日韩av一区二区在线| 国产精品吹潮在线观看| 2021久久精品国产99国产精品| 亚洲国语精品自产拍在线观看| 2019中文字幕在线免费观看| 久久九九全国免费精品观看| 亚洲黄色www| 亚洲综合在线小说| 91亚洲精品视频| 亚洲国产精品va在线观看黑人| 国产精品久久av| 97精品国产97久久久久久| 亚洲综合大片69999| 欧美电影在线观看高清| 高清在线视频日韩欧美| 亚洲国产精品国自产拍av秋霞| 日韩乱码在线视频| 在线日韩日本国产亚洲| 欧美日韩一区二区三区| 欧美精品一区三区| 欧美视频中文字幕在线| 91国偷自产一区二区三区的观看方式| 91网站免费观看| 亚洲精品mp4| 日韩av在线影视| 久久久久久久久久久人体| 欧美激情视频播放| 久久久中文字幕| 国自产精品手机在线观看视频| 性视频1819p久久| 欧美视频在线免费| 欧美视频裸体精品| 欧美黄色免费网站| 91精品视频在线免费观看| 欧美国产视频一区二区| 欧美日韩国产999| 精品国产美女在线| 91九色在线视频| 91精品国产99久久久久久| 亚洲aⅴ日韩av电影在线观看| 日韩中文字幕在线精品| 欧美日韩国产精品一区二区不卡中文| 色妞久久福利网| 亚洲视频日韩精品| 久久中文字幕视频| 国产精品免费一区| 国产精品欧美激情| 国产精品露脸av在线| 日韩有码视频在线| 色综合色综合久久综合频道88| 久久精品久久久久久国产 免费| 高清欧美性猛交| 日韩精品电影网| 亚洲性生活视频| 亚洲国产成人久久综合一区| 日韩av影片在线观看| 日韩在线不卡视频| 中文字幕在线成人| 91麻豆国产语对白在线观看| 亚洲另类图片色| 亚洲护士老师的毛茸茸最新章节| 精品国偷自产在线视频99| 日韩中文字幕精品| 欧美一级在线亚洲天堂| 久久伊人91精品综合网站|