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