一、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
java jar包 javax.media:jai_core:1.1.3.jar 用于maven下载不下来。。。
3个jar包: jai_core-1.1.3.jar jai_imageio.jar jai-codec-1.1.3.jar
2017-2018学年高中政治1.1.3政治生活:自觉参与.pdf
离线安装包,亲测可用
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....
JAI核心代码,图像处理高手,包含很多图像处理技术,JAI 图片处理JAR包。包含jai_codec-1.1.3.jar与jai_core-1.1.3.jar的jar包
赠送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. 卸载以下两个包的时候,可能有...
<groupId>javax.media <artifactId>jai_core <version>1.1.3.1 备份一下
赠送jar包:hbase-server-1.1.3.jar; 赠送原API文档:hbase-server-1.1.3-javadoc.jar; 赠送源代码:hbase-server-1.1.3-sources.jar; 赠送Maven依赖信息文件:hbase-server-1.1.3.pom; 包含翻译后的API文档:...
龙芯LoongArch架构有支持二进制翻译的专用硬件指令,与配套的软件有机结合可以高效地翻译运行x86/arm等其它架构的应用程序。这是龙芯二进制翻译组件的软件部分,当前还是alpha版本,暂时只支持运行x86的应用程序。 ...
赠送jar包:hbase-procedure-1.1.3.jar; 赠送原API文档:hbase-procedure-1.1.3-javadoc.jar; 赠送源代码:hbase-procedure-1.1.3-sources.jar; 赠送Maven依赖信息文件:hbase-procedure-1.1.3.pom; 包含翻译后...