JDBC連線池學習

2021-09-12 04:23:13 字數 3507 閱讀 5190

如果不採用連線池技術,將導致不斷建立和銷毀資料庫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內建的連線池. 下面簡單的介紹以下前兩者的使用.

[color=red]1. dbcp連線池使用步驟:[/color]

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()方法獲得連線.

[color=red]2. c3p0連線池的使用步驟:[/color]

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連線池實現

jdbc connection pool 的注意事項有 1.有乙個簡單的函式從連線池中得到乙個 connection。2.close 函式必須將 connection 放回 資料庫連線池。3.當資料庫連線池中沒有空閒的 connection,資料庫連線池必須能夠自動增加 connection 個數。...

jdbc連線池引數

jdbc連線池引數 jdbc.initialsize 0 初始化連線 jdbc.maxactive 30 連線池的最大資料庫連線數,設為0表示無限制 jdbc.maxidle 20 沒有人用連線的時候,最大閒置的連線個數,設定為0時,表示沒有限制。jdbc.maxwait 1000 超時等待時間以毫...

JDBC原生連線與連線池介紹

class.forname 載入資料庫連線驅動。第一種 直接註冊資料庫驅動 drivermanager.registerdriver new driver 第二種 利用反射機制間接載入資料庫驅動,class.forname com.mysql.jdbc.driver 常用 負責管理jdbc驅動程式的...