W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
如果在同一個 ?DataSource
?上同時使用多個事務(wù)就需要涉及到 DataSource 資源同步問題。舉個簡單的例子:
DataSource dataSource = DsUtils.dsMySql();
Connection conn = dataSource.getConnection();
conn.setAutoCommit(false);
JdbcTemplate jdbcTemplate = new JdbcTemplate(conn);
// do something conn
conn.commit();
// do something conn
JdbcTemplate jdbcTemplate = new JdbcTemplate(conn);
conn.commit();
conn.close();
再比如在同一個 ?DataSource
?上開啟兩個相互獨立的事務(wù):
DataSource dataSource = DsUtils.dsMySql();
Connection tranA = dataSource.getConnection();
tranA.setAutoCommit(false);
JdbcTemplate jdbcTemplate = new JdbcTemplate(tranA);
// do something with tranA
Connection tranB = dataSource.getConnection();
tranB.setAutoCommit(false);
JdbcTemplate jdbcTemplate = new JdbcTemplate(tranB);
// do something with tranB
tranB.commit();
tranA.commit();
使用上面這種方式需要在整個調(diào)用鏈上傳遞 ?Connection
?以確保不同的業(yè)務(wù)處理邏輯用到相同的數(shù)據(jù)庫連接。 若 ?Connection
?維護不當(dāng)就會造成鏈接泄漏,而這種泄漏通常比較難以發(fā)現(xiàn)和定位的。
HasorDB 內(nèi)置了資源管理器,可以用來同步上述這種對 ?Connection
?的依賴,但同時又不需要將其作為參數(shù)傳遞,例如:上面兩個例子可以換成如下:
例1:
DataSource dataSource = DsUtils.dsMySql();
TransactionManager manager = DataSourceManager.getManager(dataSource);
manager.begin();
JdbcTemplate jdbcTemplate1 = new JdbcTemplate(dataSource);
// do something conn
manager.commit();
manager.begin();
JdbcTemplate jdbcTemplate2 = new JdbcTemplate(dataSource);
// do something conn
manager.commit();
例2:
DataSource dataSource = DsUtils.dsMySql();
TransactionManager manager = DataSourceManager.getManager(dataSource);
manager.begin(); // tranA
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
// do something with tranA
manager.begin(); // tranB
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
// do something with tranB
manager.commit(); // tranB
manager.commit(); // tranA
首先的方式是使用 HasorDB 數(shù)據(jù)庫操作 API,比如 ?DalSession
?、?JdbcTemplate
?、?LambdaTemplate
?、?@Transactional
?
這些 API 在執(zhí)行數(shù)據(jù)庫操作時會自動處理資源的創(chuàng)建、重用以及清理。我們無需關(guān)心這些具體過程。
低級別 API 的特點是缺少了那些自動化的管理工作,比如在使用數(shù)據(jù)庫連接時需要主動釋放它。
Connection conn = DataSourceManager.getConnection(dataSource);
// do something
conn.close();
連接復(fù)用是在低級別 API 上提供支持的能力,它讓 ?DataSource
?與當(dāng)前線程形成綁定,并提供一個連接復(fù)用的 ?Connection
?對象。
Connection conn1 = DataSourceManager.getConnection(dataSource); // new connection
Connection conn2 = DataSourceManager.getConnection(dataSource); // ref ++
Connection conn3 = DataSourceManager.getConnection(dataSource); // ref ++
// do something
conn3.close(); // ref --
conn2.close(); // ref --
conn1.close(); // real close connection
提示
上面 ?
conn1
?、?conn2
?、?conn3
?實際使用的是同一個 ?Connection
?對象。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: