本文共 1650 字,大约阅读时间需要 5 分钟。
1、在EasyDBO-0.6的事务处理中,默认在不使用事务的情况下并没有释放数据源,这样会造成数据源的浪费,导致系统死机。
需要在EasyJDBEngine引擎中JDBC相关操作的finally子句中加入释放数据源的代码,修改大致如下: finally { try { dba.close(); if(autoCommit)releaseConnection(); } catch (Exception e) { logger.error("释放数据库资源错误:" + e); } } 这种默认的情况下就像使用简单的JDBC一样,执行add,update,del等相关方法后,都会自动释放数据源。 2、在事务处理的JDBCContext上下文中,由于EasyJDBEngine是一作为一个工具类供EasyJDB调用的,以前的代码如下: public EasyJDBEngine(){ private JDBCContext jdbcContext; public Connection getConnection() { Connection conn = null; try { conn =jdbcContext.getConnection(); } catch (Exception e) { logger.error("无没取得数据源,请确认数据源配置是否正确!"); return null; } return conn; } } 在这个设计中,事务只能在单线程的情况下才起作用。在多线程中,将造成一个线程关闭另一个线程中的数据源,因此就会出错。 为了能让事务处理在多线程环境中也能正常工作,需要引入ThreadLocal静态变量,修改后的getConnection()方法如下: public Connection getConnection() { Connection conn = null; try { conn =JDBCContext.getJdbcContext(dataSource).getConnection(); } catch (Exception e) { logger.error("无没取得数据源,请确认数据源配置是否正确!"); return null; } return conn; } JDBCContext要作重大的调整,加入ThreadLocal,代码大致如下: public class JDBCContext{ private DataSource ds; protected Connection connection; private boolean isValid = true; private static ThreadLocal jdbcContext; /** * @param ds */ private JDBCContext(DataSource ds){ this.ds = ds; createConnection(); System.out.println("创建数据源访问上下文!"); } public static JDBCContext getJdbcContext(javax.sql.DataSource ds) { if(jdbcContext==null)jdbcContext=new JDBCContextThreadLocal(ds); JDBCContext context = (JDBCContext) jdbcContext.get(); if (context == null) { context = new JDBCContext(ds); } return context; } .... }Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1162142