HasorDB 資源同步

2022-01-10 14:23 更新

如果在同一個 ?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

高級別 API?

首先的方式是使用 HasorDB 數(shù)據(jù)庫操作 API,比如 ?DalSession?、?JdbcTemplate?、?LambdaTemplate?、?@Transactional?

這些 API 在執(zhí)行數(shù)據(jù)庫操作時會自動處理資源的創(chuàng)建、重用以及清理。我們無需關(guān)心這些具體過程。

低級別 API?

低級別 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 ?對象。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號