對數(shù)據(jù)庫的操作無外乎CRUD,不管是多大規(guī)模的數(shù)據(jù)庫,貫穿數(shù)據(jù)庫操作的全部過程的就是數(shù)據(jù)庫事務(wù)的管理。
一般情況下,我們對數(shù)據(jù)庫的操作基本上都是基于默認(rèn)的事務(wù)管理,就是說每次執(zhí)行后都是自動提交,當(dāng)然,
大部分的情況下這種操作可以正確執(zhí)行響應(yīng)的業(yè)務(wù)要求,但是對于一些業(yè)務(wù)數(shù)據(jù)要求比較嚴(yán)格的系統(tǒng)來說,處
理好程序中事務(wù)將是一個非常重要的內(nèi)容。
對于目前EasyDBO中事務(wù)處理的一些看法,不知道對不對,對這個研究不是很深入。
首先我們可以看到EasyDBO是線程安全的,但是EasyJDBEngine是非線程安全的,每次實(shí)例話一個EasyDBO的時(shí)候,
都是重新實(shí)例化一個EasyJDBEngine。目前程序中通過EasyJDBEngine和DatabaseDAO實(shí)現(xiàn)的事務(wù)的支持,但是覺得
有一些地方欠妥,首先利用這個函數(shù)private void UpdateBatch(Vector vector)實(shí)現(xiàn)手動事務(wù)的提交,個人覺得
是沒有真正利用到JDBC的事務(wù)管理功能,該函數(shù)只是簡單的將所有的操作放到一起來統(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ù)管理),我們來看一個添加的函數(shù)
? ? public boolean add(DBObject obj) { // 添加一個對象
? ? ? ?DatabaseDAO dba = null; // 引入數(shù)據(jù)庫操作工具類
? ? ? ?String sql = sqlQuery.getInsertSql(obj);
? ? ? ?if (sql.equals("")) {
? ? ? ? ? ?logger.error("空的sql語句無法執(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ù)錯誤:" + 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ù)庫資源錯誤:" + e);
? ? ? ? ? ?}
? ? ? ?}
? ?
? ? ? ?return ret;
? ?}
? ?
? ? ? ?
? ? ? ?可以發(fā)現(xiàn)在一次的添加結(jié)束以后,連接被關(guān)掉了dba.close();雖然連接沒有被真正的關(guān)掉,只是返回了連接池當(dāng)中;
? ? ? ?但是你肯定不能確定如果同一次執(zhí)行多個操作的時(shí)候,能夠利用的同一個Connection,所以說JDBC的事務(wù)也就無從
? ? ? ?說起了。
? ? ? ?當(dāng)然我看到現(xiàn)在程序在實(shí)際應(yīng)用中可能還沒有真正利用到這個手動事務(wù)管理的功能,但是我覺得這樣設(shè)計(jì)事務(wù)好像
? ? ? ?有點(diǎn)效率上的問題,當(dāng)然最重要的是沒有真正利用到JDBC 的事務(wù)管理功能。
一般情況下,我們對數(shù)據(jù)庫的操作基本上都是基于默認(rèn)的事務(wù)管理,就是說每次執(zhí)行后都是自動提交,當(dāng)然,
大部分的情況下這種操作可以正確執(zhí)行響應(yīng)的業(yè)務(wù)要求,但是對于一些業(yè)務(wù)數(shù)據(jù)要求比較嚴(yán)格的系統(tǒng)來說,處
理好程序中事務(wù)將是一個非常重要的內(nèi)容。
對于目前EasyDBO中事務(wù)處理的一些看法,不知道對不對,對這個研究不是很深入。
首先我們可以看到EasyDBO是線程安全的,但是EasyJDBEngine是非線程安全的,每次實(shí)例話一個EasyDBO的時(shí)候,
都是重新實(shí)例化一個EasyJDBEngine。目前程序中通過EasyJDBEngine和DatabaseDAO實(shí)現(xiàn)的事務(wù)的支持,但是覺得
有一些地方欠妥,首先利用這個函數(shù)private void UpdateBatch(Vector vector)實(shí)現(xiàn)手動事務(wù)的提交,個人覺得
是沒有真正利用到JDBC的事務(wù)管理功能,該函數(shù)只是簡單的將所有的操作放到一起來統(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ù)管理),我們來看一個添加的函數(shù)
? ? public boolean add(DBObject obj) { // 添加一個對象
? ? ? ?DatabaseDAO dba = null; // 引入數(shù)據(jù)庫操作工具類
? ? ? ?String sql = sqlQuery.getInsertSql(obj);
? ? ? ?if (sql.equals("")) {
? ? ? ? ? ?logger.error("空的sql語句無法執(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ù)錯誤:" + 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ù)庫資源錯誤:" + e);
? ? ? ? ? ?}
? ? ? ?}
? ?
? ? ? ?return ret;
? ?}
? ?
? ? ? ?
? ? ? ?可以發(fā)現(xiàn)在一次的添加結(jié)束以后,連接被關(guān)掉了dba.close();雖然連接沒有被真正的關(guān)掉,只是返回了連接池當(dāng)中;
? ? ? ?但是你肯定不能確定如果同一次執(zhí)行多個操作的時(shí)候,能夠利用的同一個Connection,所以說JDBC的事務(wù)也就無從
? ? ? ?說起了。
? ? ? ?當(dāng)然我看到現(xiàn)在程序在實(shí)際應(yīng)用中可能還沒有真正利用到這個手動事務(wù)管理的功能,但是我覺得這樣設(shè)計(jì)事務(wù)好像
? ? ? ?有點(diǎn)效率上的問題,當(dāng)然最重要的是沒有真正利用到JDBC 的事務(wù)管理功能。