對(duì)數(shù)據(jù)庫(kù)的操作無(wú)外乎CRUD,不管是多大規(guī)模的數(shù)據(jù)庫(kù),貫穿數(shù)據(jù)庫(kù)操作的全部過(guò)程的就是數(shù)據(jù)庫(kù)事務(wù)的管理。
一般情況下,我們對(duì)數(shù)據(jù)庫(kù)的操作基本上都是基于默認(rèn)的事務(wù)管理,就是說(shuō)每次執(zhí)行后都是自動(dòng)提交,當(dāng)然,
大部分的情況下這種操作可以正確執(zhí)行響應(yīng)的業(yè)務(wù)要求,但是對(duì)于一些業(yè)務(wù)數(shù)據(jù)要求比較嚴(yán)格的系統(tǒng)來(lái)說(shuō),處
理好程序中事務(wù)將是一個(gè)非常重要的內(nèi)容。

對(duì)于目前EasyDBO中事務(wù)處理的一些看法,不知道對(duì)不對(duì),對(duì)這個(gè)研究不是很深入。

首先我們可以看到EasyDBO是線程安全的,但是EasyJDBEngine是非線程安全的,每次實(shí)例話一個(gè)EasyDBO的時(shí)候,
都是重新實(shí)例化一個(gè)EasyJDBEngine。目前程序中通過(guò)EasyJDBEngine和DatabaseDAO實(shí)現(xiàn)的事務(wù)的支持,但是覺得
有一些地方欠妥,首先利用這個(gè)函數(shù)private void UpdateBatch(Vector vector)實(shí)現(xiàn)手動(dòng)事務(wù)的提交,個(gè)人覺得
是沒有真正利用到JDBC的事務(wù)管理功能,該函數(shù)只是簡(jiǎn)單的將所有的操作放到一起來(lái)統(tǒng)一執(zhí)行,當(dāng)一次要求執(zhí)行的
操作特別多的時(shí)候未免效率低下了。

另外一點(diǎn)我覺得在事務(wù)管理方面沒有真正利用JDBC的事務(wù)管理,JDBC事務(wù)管理實(shí)際上是在JDBC Connection中實(shí)現(xiàn)的,
事務(wù)周期僅限于Connection的生命周期內(nèi)(JTA才真正實(shí)現(xiàn)的夸Connection的事務(wù)管理),我們來(lái)看一個(gè)添加的函數(shù)

? ? public boolean add(DBObject obj) { // 添加一個(gè)對(duì)象
? ? ? ?DatabaseDAO dba = null; // 引入數(shù)據(jù)庫(kù)操作工具類
? ? ? ?String sql = sqlQuery.getInsertSql(obj);
? ? ? ?if (sql.equals("")) {
? ? ? ? ? ?logger.error("空的sql語(yǔ)句無(wú)法執(zhí)行!");
? ? ? ? ? ?return false;
? ? ? ?}
? ? ? ?boolean ret = false;
? ? ? ?try {
? ? ? ? ? ?dba = getDatabaseDAO();
? ? ? ? ? ?if (DBOConfig.getInstance().isShow_sql()) {
? ? ? ? ? ? ? ?System.out.println("EasyDBO:" + sql);
? ? ? ? ? ?}
? ? ? ? ? ?dba.prepare(sql);
? ? ? ? ? ?if (obj.getValue() != null) {
? ? ? ? ? ? ? ?dba.setQueryParams(obj.getValue().values());
? ? ? ? ? ?}
? ? ? ? ? ?// todo : add piginzoo 加入事務(wù)支持
? ? ? ? ? ?if (autoCommit == false) {
? ? ? ? ? ? ? ?vec.add(dba.getPreparedStatement());
? ? ? ? ? ?} else {
? ? ? ? ? ? ? ?// rs = dba.preparedQuery();
? ? ? ? ? ? ? ?ret = dba.isPreparedUpdate();
? ? ? ? ? ? ? ?// dba.close();
? ? ? ? ? ?}
? ? ? ?} catch (Exception e) {
? ? ? ? ? ?logger.error("添加數(shù)據(jù)錯(cuò)誤:" + e + ":sql=" + sql);
? ? ? ? ? ?e.printStackTrace();
? ? ? ? ? ?if (dba != null) {
? ? ? ? ? ? ? ?try {
? ? ? ? ? ? ? ? ? ?dba.rollback();
? ? ? ? ? ? ? ? ? ?// dba.close();
? ? ? ? ? ? ? ?} catch (SQLException sqle) {
? ? ? ? ? ? ? ?}
? ? ? ? ? ?}

? ? ? ?} finally {
? ? ? ? ? ?try {
? ? ? ? ? ? ? ?dba.close();
? ? ? ? ? ?} catch (Exception e) {
? ? ? ? ? ? ? ?logger.error("釋放數(shù)據(jù)庫(kù)資源錯(cuò)誤:" + e);
? ? ? ? ? ?}
? ? ? ?}
? ?
? ? ? ?return ret;
? ?}
? ?
? ? ? ?
? ? ? ?可以發(fā)現(xiàn)在一次的添加結(jié)束以后,連接被關(guān)掉了dba.close();雖然連接沒有被真正的關(guān)掉,只是返回了連接池當(dāng)中;
? ? ? ?但是你肯定不能確定如果同一次執(zhí)行多個(gè)操作的時(shí)候,能夠利用的同一個(gè)Connection,所以說(shuō)JDBC的事務(wù)也就無(wú)從
? ? ? ?說(shuō)起了。

? ? ? ?當(dāng)然我看到現(xiàn)在程序在實(shí)際應(yīng)用中可能還沒有真正利用到這個(gè)手動(dòng)事務(wù)管理的功能,但是我覺得這樣設(shè)計(jì)事務(wù)好像
? ? ? ?有點(diǎn)效率上的問題,當(dāng)然最重要的是沒有真正利用到JDBC 的事務(wù)管理功能。