自定義JDBC連線池及常用連線池介紹

2021-08-31 22:11:58 字數 3456 閱讀 7662

如果不採用連線池技術, 將導致不斷建立和銷毀資料庫connection, 造成效能上的損耗. 而資料庫連線池技術將在池中建立一定數量的connection, 當需要connection時就從池中取出乙個, 用完之後歸還給連線池, 而不是將其銷毀.

自定義資料庫連線池的具體步驟分析:

a. 定義mydatasource類, 實現datasource介面, 並提供介面中定義的方法. 其中, 核心方法為connection getconnection().

b. 可以在靜態**塊或建構函式中建立多個connection物件, 並將他們儲存在linkedlist中. 當呼叫mydatasource物件的getconnection()方法時, 從集合中取出乙個connection返回給呼叫者. 當呼叫者使用完connection並呼叫connection物件的close()方法時, 將該connection物件歸還給連線池.

c. 呼叫connection物件的close()方法時, 為阻止系統銷毀該連線, 而改為將連線歸還給連線池, 可以採用包裝設計模式. 此時包裝的目標類為connection, 因此需要定義myconnection類並實現connection介面. myconnection類應該存在2個成員: connection物件和linkedlist物件, 這2個成員可以通過建構函式存入. 同時需要覆寫close()方法, 在close()方法中實現將connection新增到集合中.

**如下:

public class mydatasource implements datasource 

} @override

public connection getconnection() throws sqlexception

private class myconnection implements connection

// 重寫close()方法, 實現呼叫該方法時將連線歸還給連線池

@override

public void close() throws sqlexception

// 對於其他方法, 直接呼叫conn物件的相應方法即可

@override

public void clearwarnings() throws sqlexception

@override

public void commit() throws sqlexception

// 省略了其餘connection介面中定義的方法...

} // 省略了其他datasource介面中定義的方法...

}

以下是測試**:

// create table person(id int primary key auto_increment, name varchar(40), age int);

public class jdbcpool

} catch (exception e) finally

} // 釋放資源

public void release(resultset rs, statement st, connection conn)

} catch (exception e) finally

} catch (sqlexception e) finally

} catch (sqlexception e)

}} }

}

程式的輸出為:

獲取連線之後, 連線池中的connection物件的數量為: 9

id = 6, name = min, age = 22

id = 7, name = coolxing, age = 24

將連線歸還給連線池後, 連線池中的connection物件的數量為: 10

可見這個自定義的連線池是可以工作的.

自定義資料庫連線池只是為了學習jdbc連線池的原理, 平時專案使用的時候, 還是應該以開源的資料庫連線池為主. 

常用的資料庫連線池為dbcp, c3p0, 以及tomcat內建的連線池. 下面簡單的介紹以下前兩者的使用.

1. dbcp連線池使用步驟:

a. 匯入commons-dbcp.jar和commons-pool.jar到project中.

b. 獲取資料源datasource物件. 可以直接建立basicdatasource物件後呼叫相應的set方法, 如:

datasource pool = new basicdatasource();

pool.seturl("jdbc:mysql://localhost:3306/exercise");

pool.setusername("root");

pool.setpassword("root");

pool.setdriverclassname("com.mysql.jdbc.driver");

pool.setinitialsize(10);

也可以通過工廠類載入配置檔案獲得datasource物件, 如:

properties prop = new properties();

inputstream in = jdbcpool.class.getclassloader().getresourceasstream("dbcp.properties");

prop.load(in);

datasource pool = basicdatasourcefactory.createdatasource(prop);

c. 呼叫datasource物件的getconnection()方法獲得連線.

2. c3p0連線池的使用步驟:

a. 匯入c3p0-0.9.1.2.jar和c3p0-0.9.1.2-jdk1.3.jar.

b. 獲取資料源datasource物件. 可以直接建立combopooleddatasource物件後呼叫相應的set方法, 如:

combopooleddatasource pool = new combopooleddatasource();

pool.setjdbcurl("jdbc:mysql://localhost:3306/exercise");

pool.setuser("root");

pool.setpassword("root");

pool.setdriverclass("com.mysql.jdbc.driver");

pool.setinitialpoolsize(10);

也可以在建立combopooleddatasource物件時傳入配置節點的名稱, 此時需要存在c3p0-config.xml檔案. 如:

// 建立連線池, 並從c3p0-config.xml檔案中的name屬性為mysql的named-config元素中讀取引數

combopooleddatasource pool = new combopooleddatasource("mysql");

c. 呼叫datasource物件的getconnection()方法獲得連線.

自定義實現jdbc資料庫連線池

有重複利用資料庫連線 實現思路 關鍵引數 空閒連線 活動連線,最大連線 1.初始化連線,連線安全問題 vector 2.實現獲取連線的方法 3.連線機制 資源 author xzb public class connectionpool implements iconnectionpool catc...

自定義資料庫連線池

在使用jdbc運算元據庫時,運算元據庫 1.先建立乙個連線物件2.執行操作 3.操作完畢,再把連線關閉。是否影響程式執行的效率?頻繁的的建立,關閉連線。所以就引入了連線池技術 自定義連線池 先定義引數資訊 1.定義儲存連線物件的集合 連線池 2.定義初始化連線數目 init count 3 3.最大...

簡單的自定義連線池 二

如何解決上面提出的問題呢?由於多了乙個addback 方法,所以使用這個連線池的地方,需要額外記住這個方法,並且還不能面向介面程式設計。我們打算修改介面中的那個close方法。原來的connection物件的close方法,是真的關閉連線。打算修改這個close方法,以後在呼叫close,並不是真的...