如果不採用連線池技術,將導致不斷建立和銷毀資料庫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驅動程式的...