对数据库的操作无外乎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 的事务管理功能。