bboss 持久層架構使用最佳實踐-帶連接配接(connection)參數接口和不帶連接配接參數接口的選擇
bboss項目下載下傳清單 在sourceforge通路位址為:
https://sourceforge.net/project/showfiles.php?group_id=238653bboss 持久層架構提供了兩類通路資料庫的接口:帶connection參數的接口和不帶connection參數的接口。這兩類接口在各種場合下面都可以使用,實作的功能都是一樣的,但是适用的場合還是不一樣的,下面分别描述。
- 帶連接配接connection參數的接口
帶連接配接connection參數的接口在通路資料庫時不再向bboss資料庫連接配接池申請連接配接而直接使用外部參數傳入的connection,這樣一個connection可以供多個資料庫操作使用,适用于資料庫操作比較密集的環境,這樣能夠大大地提升應用程式的性能;如果在這種情況下使用不帶connection參數的接口,意味着每次通路資料庫都要向bboss連接配接池申請connection,由于連接配接池是一種串行化的帶并發鎖定的元件,頻繁的申請和釋放将導緻嚴重的系統性能開銷,最終導緻系統性能緩慢。使用帶connection參數的方法時需要確定最後關閉connection,防止連接配接洩漏。使用的步驟如下:
a.調用DBUtil.getConnection()或者DBUtil.getConnection(String dbname)方法申請一個資料庫連接配接
b.通路DBUtil或者PreparedDBUtil或者CallableDBUtil的帶connection參數的方法傳入剛申請的connection對象進行資料庫操作
c.操作完畢後在finally塊中關閉連接配接
這裡以預編譯操作接口(其他接口都提供了類似功能不一一枚舉)為例,舉例如下:
PreparedDBUtil db = new PreparedDBUtil();
Connection con = null;
try {
con = DBUtil.getConection(); //申請連接配接
db.preparedDelete("delete from test");
db.executePrepared(con);//使用連接配接
db.preparedInsert("insert into test(id,name) values(?,?)");
db.setString(1, "1");
db.setString(2, "name");
db.preparedInsert("insert into test(name) values(?)");
db.setString(1, "name");
db.preparedInsert("insert into test(name,clobname,blobname) values(?,?,?)");
db.setClob(2, "content");
db.setBlob(3, "content".getBytes());
db.preparedSelect("select * from test where name=?");
//db.setString(1, "1");
for(int i = 0; i < db.size(); i ++)
{
System.out.println(i + " id=" + db.getString(i, "id"));
System.out.println(i + " name=" + db.getString(i, "name"));
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally
{
try {
if(con != null)
con.close();//關閉連接配接
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
2.不帶連接配接參數的接口
不帶connection參數的方法适用于以下場景:
單一的資料庫操作環境
事務環境中的資料庫操作接口
下面舉例說明:
- 單一的資料庫操作
try {
db.preparedDelete("delete from test");
db.executePrepared();//使用不帶連接配接的方法
} catch (Exception e) {
- 事務環境下的多次資料庫操作
TransactionManager tm = new TransactionManager();
tm.begin();
db.executePrepared();
db.setString(1, "test1");
db.setString(1, "name auto id");
db.setString(1, "name with clob and blob");
tm.commit();
tm.rollback();
} catch (RollbackException e1) {
e1.printStackTrace();