?? 對數據庫的操作無外乎CRUD,不管是多大規模的數據庫,貫穿數據庫操作的全部過程的就是數據庫事務的管理。? 一般情況下,我們對數據庫的操作基本上都是基于默認的事務管理,就是說每次執行后都是自動提交,當然,大部分的情況下這種操作可以正確執行響應的業務要求,但是對于一些業務數據要求比較嚴格的系統來說,處理好程序中事務將是一個非常重要的內容。
對于目前EasyDBO中事務處理的一些看法,不知道對不對,對這個研究不是很深入。
首先我們可以看到EasyDBO是線程安全的,但是EasyJDBEngine是非線程安全的,每次實例話一個EasyDBO的時候,都是重新實例化一個EasyJDBEngine。目前程序中通過EasyJDBEngine和DatabaseDAO實現的事務的支持,但是覺得有一些地方欠妥,首先利用這個函數private void UpdateBatch(Vector vector)實現手動事務的提交,個人覺得是沒有真正利用到JDBC的事務管理功能,該函數只是簡單的將所有的操作放到一起來統一執行,當一次要求執行的操作特別多的時候未免效率低下了。
另外一點我覺得在事務管理方面沒有真正利用JDBC的事務管理,JDBC事務管理實際上是在JDBC Connection中實現的,事務周期僅限于Connection的生命周期內(JTA才真正實現的夸Connection的事務管理),我們來看一個添加的函數
? ? public boolean add(DBObject obj) { // 添加一個對象
? ? ? ?DatabaseDAO dba = null; // 引入數據庫操作工具類
? ? ? ?String sql = sqlQuery.getInsertSql(obj);
? ? ? ?if (sql.equals("")) {
? ? ? ? ? ?logger.error("空的sql語句無法執行!");
? ? ? ? ? ?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 加入事務支持
? ? ? ? ? ?if (autoCommit == false) {
? ? ? ? ? ? ? ?vec.add(dba.getPreparedStatement());
? ? ? ? ? ?} else {
? ? ? ? ? ? ? ?// rs = dba.preparedQuery();
? ? ? ? ? ? ? ?ret = dba.isPreparedUpdate();
? ? ? ? ? ? ? ?// dba.close();
? ? ? ? ? ?}
? ? ? ?} catch (Exception e) {
? ? ? ? ? ?logger.error("添加數據錯誤:" + 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("釋放數據庫資源錯誤:" + e);
? ? ? ? ? ?}
? ? ? ?}
? ?
? ? ? ?return ret;
? ?}???
???????
???????可以發現在一次的添加結束以后,連接被關掉了dba.close();雖然連接沒有被真正的關掉,只是返回了連接池當中;??但是你肯定不能確定如果同一次執行多個操作的時候,能夠利用的同一個Connection,所以說JDBC的事務也就無從?說起了。
? ? ? ?當然我看到現在程序在實際應用中可能還沒有真正利用到這個手動事務管理的功能,但是我覺得這樣設計事務好像??有點效率上的問題,當然最重要的是沒有真正利用到JDBC 的事務管理功能。
(本文作者:
EasyJF開源團隊? William 歡迎轉載,轉載請保留作者聲明,謝謝!)?
posted on 2006-07-03 09:04
簡易java框架 閱讀(960)
評論(0) 編輯 收藏