一、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
2017-2018学年高中政治1.1.3政治生活:自觉参与.pdf
`javax.media.jai` 包含了JAI的核心类和接口,是实现这些高级图像处理功能的基础。 标题中的"jai_core1.1.3.zip"是一个包含JAI Core 1.1.3版本的压缩文件。在Java开发中,`jar`文件是一种用于存储类文件和其他资源...
jai_codec-1.1.3.jar jai_core.jar jai_imageio.jar jimi-1.0.jar
总之,jai_core-1.1.3.jar、jai_imageio-1.1.jar和jai_codec-1.1.3.jar是Java Advanced Imaging的核心组件,它们构成了一个完整的图像处理工具集,可以满足各种图像操作需求,特别是对于需要处理多种格式和执行复杂...
离线安装包,亲测可用
jai-codec-1.1.3 jai-codec
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文档-...
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....
赠送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文档-...
nacis-server-1.1.3的免安装包,下载直接可以使用,Nacos 支持基于 DNS 和基于 RPC 的服务发现(可以作为springcloud的注册中心)、动态配置服务(可以做配置中心)、动态 DNS 服务。
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路径...
<groupId>javax.media <artifactId>jai_core <version>1.1.3.1 备份一下
当你在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进行查询商品: 查询
在给定的标题和描述中提到的 "jai_codec.1.1.3" 和 "jai_core.1.1.3" 是JAI库中的两个关键组件。 1. **JAI Codec**: JAI Codec是Java Advanced Imaging的一部分,专门用于图像编码和解码。它支持多种图像格式,包括...