Spring框架学习[JdbcTemplate封装Jdbc](十二)

2014-11-24 03:05:49 · 作者: · 浏览: 7
tic Connection getConnection(DataSource dataSource) throws CannotGetJdbcConnectionException { try { //通过doGetConnection方法来获取数据库连接 return doGetConnection(dataSource); } catch (SQLException ex) { throw new CannotGetJdbcConnectionException("Could not get JDBC Connection", ex); } }//获取数据库连接public static Connection doGetConnection(DataSource dataSource) throws SQLException { Assert.notNull(dataSource, "No DataSource specified"); //把数据库连接放到事务管理器中管理 //通过TransactionSynchronizationManager中定义的线程局部//变量(threadlocal)来和线程绑定数据库连接 ConnectionHolder conHolder = (ConnectionHolder) TransactionSynchronizationManager.getResource(dataSource); //如果TransactionSynchronizationManager中已有与当前线程绑定的数据库连接 if (conHolder != null && (conHolder.hasConnection() || conHolder.isSynchronizedWithTransaction())) { //从当前线程线程局部变量中获取数据库连接 conHolder.requested(); //如果当前线程局部变量中没有绑定数据库连接,则为当前线程局部变量设置数据库连接 if (!conHolder.hasConnection()) { logger.debug("Fetching resumed JDBC Connection from DataSource"); conHolder.setConnection(dataSource.getConnection()); } //直接返回TransactionSynchronizationManager线程局部变量中的数据库连接 return conHolder.getConnection(); } //如果TransactionSynchronizationManager中没有和当前线程绑定的数据//库连接,则从Spring配置文件配置的数据源对象中获取数据库连接 logger.debug("Fetching JDBC Connection from DataSource"); Connection con = dataSource.getConnection();//如果当前线程事务同步是Active的,即在注册之前可以直接使用,避免不必要//的实例对象创建 if (TransactionSynchronizationManager.isSynchronizationActive()) { logger.debug("Registering transaction synchronization for JDBC Connection"); //在事务中使用同一个数据库连接做jdbc操作,当事务结束后,线程绑定对象//将被同步移除 ConnectionHolder holderToUse = conHolder; //如果存放数据库连接的线程局部变量为null,则重新创建一个线程局部变量 if (holderToUse == null) { holderToUse = new ConnectionHolder(con); } //如果存放数据库连接的线程局部变量不为null,则将数据库连接存放到线程//局部变量中 else { holderToUse.setConnection(con); } //请求数据库连接 holderToUse.requested(); //为当前线程注册事务同步 TransactionSynchronizationManager.registerSynchronization( new ConnectionSynchronization(holderToUse, dataSource)); //标记当前数据库连接为事务同步 holderToUse.setSynchronizedWithTransaction(true); if (holderToUse != conHolder) { //将数据源绑定到当前线程局部变量 TransactionSynchronizationManager.bindResource(dataSource, holderToUse); } } return con; }

通过对JdbcTemplate的源码分析,我们看到Spring只是将jdbc的一些常用操作封装,将通用的获取数据库连接、创建创建Statement、关闭资源释放连接等操作封装在不同种类的execute方法中,同时调用不同的回调处理Action来具体执行jdbc操作,对jdbc熟悉的人很容易看懂这部分源码,当然Spring还对jdbc进行了一些高级的封装和扩展,例如RowMapper将结果集转换为指定对象等,这部分有兴趣可以自己研究。