一、TransactionCallback接口
Object doInTransaction(TransactionStatus status)
TransactionTemplate已经搭好了事务框架,我们只需将多条SQL语句放在doInTransaction中执行就可以了。但是SQL语句通过什么方法来执行呢?
二、方法一:获取Connection来执行
获取Connection又有两种方法
1.从TransactionStatus中索得,因为TransactionStatus含有Transaction对象,后者保存了Connection的句柄
-
private
static
Connection getConnection(TransactionStatus ts) {
-
JdbcTransactionObjectSupport transObj = (JdbcTransactionObjectSupport)((DefaultTransactionStatus)ts).getTransaction();
-
ConnectionHolder holder = transObj.getConnectionHolder();
-
Connection con = holder.getConnection();
-
return
con;
-
}
2.从TransactionSynchronizationManager的线程变量中获取
-
private
Connection getConnection() {
-
DataSourceTransactionManager manager = (DataSourceTransactionManager)transactionTemplate.getTransactionManager();
-
DataSource ds = manager.getDataSource();
-
return
DataSourceUtils.getConnection(ds);
-
}
这里贴出DataSourceUtils.getConnection(ds)的部分代码:
-
public
static
Connection getConnection(DataSource dataSource,
boolean
allowSynchronization)
-
throws
CannotGetJdbcConnectionException {
-
try
{
-
return
doGetConnection(dataSource, allowSynchronization);
-
}
-
catch
(SQLException ex) {
-
throw
new
CannotGetJdbcConnectionException(
"Could not get JDBC connection"
, ex);
-
}
-
}
-
-
protected
static
Connection doGetConnection(DataSource dataSource,
boolean
allowSynchronization)
-
throws
SQLException {
-
...
-
ConnectionHolder conHolder = (ConnectionHolder) TransactionSynchronizationManager.getResource(dataSource);
-
if
(conHolder !=
null
) {
-
return
conHolder.getConnection();
-
}
-
...
-
}
获取了Connection之后,就可以按照常规的方法来操作SQL语句了
-
public
void
addEmployee1(Employee employee)
throws
SQLException {
-
transactionTemplate.execute(new
TransactionCallback() {
-
public
Object doInTransaction(TransactionStatus ts) {
-
try
{
-
-
Connection con = getConnection();
-
Statement st = con.createStatement();
-
st.executeUpdate("INSERT INTO Employee (username,age) VALUES('lizi', 22)"
);
-
st.executeUpdate("INSERT INTO Employee (username,age) VALUES('lijun',55)"
);
-
st.close();
-
-
} catch
(Exception ex) {
-
System.out.println("更新失败"
);
-
ts.setRollbackOnly();
-
}
-
return
null
;
-
}
-
});
-
}
三、方法二:通过JdbcTemplate来操作
1.创建JdbcTemplate:
-
DataSourceTransactionManager manager = (DataSourceTransactionManager)transactionTemplate.getTransactionManager();
-
DataSource ds = manager.getDataSource();
-
JdbcTemplate jdbcTemplate = new
JdbcTemplate(ds);
2.创建之后,执行:
-
public
void
addEmployee(Employee employee)
throws
SQLException {
-
transactionTemplate.execute(new
TransactionCallback() {
-
public
Object doInTransaction(TransactionStatus ts) {
-
try
{
-
jdbcTemplate.update("INSERT INTO Employee (username,age) VALUES(?, ?)"
,
-
new
Object[]{
"lizi"
,
new
Integer(
22
)});
-
jdbcTemplate.update("INSERT INTO Employee (username,age) VALUES(?, ?)"
,
-
new
Object[]{
"lijun"
,
new
Integer(
55
)});
-
System.out.println("更新成功"
);
-
-
} catch
(Exception ex) {
-
System.out.println("更新失败"
);
-
ts.setRollbackOnly();
-
}
-
return
null
;
-
}
-
});
-
}
3.问题
- jdbcTemplate的Connection肯定是从DataSource获取的,但这个Connection是否和TransactionTemplate的事务框架中的已建立的连接是同一个?
- jdbcTemplate自已的框架也是try{..}catch{..}finally{..},每一个jdbcTemplate.update方法都在这个框架中,会不会执行完后将所用的连接关闭呢?如果关闭,后续方法如何采用同一个连接?
4.jdbcTemplate的连接来源:
-
Connection con = DataSourceUtils.getConnection(getDataSource());
是通过DataSourceUtils的getConnection方法来获取连接的,也就是TransactionSynchronizationManager的线程变量,与事务框架中的连接是同一个.
5.jdbcTemplate的finally会把连接关闭吗?
finally中的代码是:
-
DataSourceUtils.closeConnectionIfNecessary(con, getDataSource());
看看DataSourceUtils
-
public
static
void
closeConnectionIfNecessary(Connection con, DataSource dataSource) {
-
try
{
-
doCloseConnectionIfNecessary(con, dataSource);
-
}
-
catch
(SQLException ex) {
-
logger.error("Could not close JDBC connection"
, ex);
-
}
-
}
-
-
protected
static
void
doCloseConnectionIfNecessary(Connection con, DataSource ds)
throws
SQLException {
-
...
-
ConnectionHolder conHolder = (ConnectionHolder) TransactionSynchronizationManager.getResource(ds);
-
if
(conHolder !=
null
&& con == conHolder.getConnection()) {
-
-
return
;
-
}
-
-
-
if
(!(ds
instanceof
SmartDataSource) || ((SmartDataSource) ds).shouldClose(con)) {
-
logger.debug("Closing JDBC connection"
);
-
con.close();
-
}
-
}
分享到:
相关推荐
import javax.media.jai.JAI; import javax.media.jai.RenderedOp; jai_core-1.1.3.jar jai_codec-1.1.3.jar
import javax.media.jai.JAI; import javax.media.jai.RenderedOp; jai_core-1.1.3.jar jai_codec-1.1.3.jar
jai_codec-1.1.3.jar jai_core.jar jai_imageio.jar jimi-1.0.jar
`javax.media.jai` 包含了JAI的核心类和接口,是实现这些高级图像处理功能的基础。 标题中的"jai_core1.1.3.zip"是一个包含JAI Core 1.1.3版本的压缩文件。在Java开发中,`jar`文件是一种用于存储类文件和其他资源...
2017-2018学年高中政治1.1.3政治生活:自觉参与.pdf
总之,jai_core-1.1.3.jar、jai_imageio-1.1.jar和jai_codec-1.1.3.jar是Java Advanced Imaging的核心组件,它们构成了一个完整的图像处理工具集,可以满足各种图像操作需求,特别是对于需要处理多种格式和执行复杂...
离线安装包,亲测可用
1.1.3 对象数据库... 3 1.1.4 关系数据库服务器... 5 1.1.5 选择适用的数据库... 5 1.2 数据库访问技术... 6 1.2.1 概述... 6 1.2.2 ODBC API 7 1.2.3 ODBC的MFC类... 7 1.2.4 DAO与RDO.. 8 1.2.5 OLE DB与...
赠送jar包:jzlib-1.1.3.jar; 赠送原API文档:jzlib-1.1.3-javadoc.jar; 赠送源代码:jzlib-1.1.3-sources.jar; 赠送Maven依赖信息文件:jzlib-1.1.3.pom; 包含翻译后的API文档:jzlib-1.1.3-javadoc-API文档-...
标题提到的"jai_codec-1.1.3.jar"和"jai_core-1.1.3.jar"是JAI库的核心组件,用于图像编码和解码以及基本的图像操作。 `jai_codec-1.1.3.jar` 是JAI的编码模块,包含了多种图像格式的读取和写入支持。它提供了对...
commons-logging-1.1.3.jar ezmorph-1.0.6.jar jackson-all-1.7.4.jar ojdbc5.jar org.springframework.aop-3.0.0.RELEASE.jar org.springframework.asm-3.0.0.RELEASE.jar org.springframework.aspects-3.0.0....
LabVIEW..Toolkit.for.Microsoft.Office.v1.1.3.part1.rar office 文档生成工具 LabVIEW..Toolkit.for.Microsoft.Office.v1.1.3.part2.rar:http://download.csdn.net/source/2535907 LabVIEW..Toolkit.for....
nacis-server-1.1.3的免安装包,下载直接可以使用,Nacos 支持基于 DNS 和基于 RPC 的服务发现(可以作为springcloud的注册中心)、动态配置服务(可以做配置中心)、动态 DNS 服务。
赠送jar包:jzlib-1.1.3.jar; 赠送原API文档:jzlib-1.1.3-javadoc.jar; 赠送源代码:jzlib-1.1.3-sources.jar; 赠送Maven依赖信息文件:jzlib-1.1.3.pom; 包含翻译后的API文档:jzlib-1.1.3-javadoc-API文档-...
1.增加手机版,可以绑定二级域名访问。如http://m.qzqcw.com 绑定到m目录即可, 手机版模版位置:templates/default/m/ 2.修正车行商铺首页和车型图片路径不显示 3.修正车型中心图片路径不对。 4.修正用户注册CSS路径...
1.增加手机版,可以绑定二级域名访问。如http://m.qzqcw.com 绑定到m目录即可, 手机版模版位置:templates/default/m/ 2.修正车行商铺首页和车型图片路径不显示 3.修正车型中心图片路径不对。 4.修正用户注册CSS路径...
离线安装包,亲测可用
当你在linux中安装eclipse或者安装其他的包时遇到这样得问题:java: xcb_xlib.c:50: xcb_xlib_unlock: Assertion `c->xlib.lock' failed,可以按照下面步骤:第一:倒退回FC7的libx11. 卸载以下两个包的时候,可能有...
二、自定义词库加载 每个单位都有一套自己的地理词库,为了在使用中让程序使用自己标准地址词库可以在初始化时加载自定义词库。完成自定义词库后,不论是地址分词还是地址关联都是依据自定义词库进行计算,完美匹配...
* 同时查询到每个一级分类下所属的二级分类 1.1.3 商品模块: 查询热门商品: 1.查询热门商品:(限制个数10个) 查询最新商品: 1.查询最新商品:(限制个数10个) 查询某个分类商品: 1.根据分类的ID进行查询商品: 查询