疯狂
STANDING ON THE SHOULDERS OF GIANTS
posts - 481, comments - 486, trackbacks - 0, articles - 1
BlogJava
::
首页
::
新随笔
::
联系
::
聚合
::
管理
hibernate,spring管理事务中(transaction,JDBC connection,Hibernate Session的使用研究)(一)
Posted on 2011-11-18 11:25
疯狂
阅读(18914)
评论(0)
编辑
收藏
所属分类:
database
、
spring
、
hibernate
、
方法论
、
架构
、
读代码
如果单独使用hibernate可参考上一篇文章
http://www.blogjava.net/freeman1984/archive/2011/08/04/355808.html
首先hibernate的Connection release mode有以下几种:
1 after_statement 2 after_transaction 3 on_close 其中after_statement 用在jta中 ,
on_close 是3.1之前遗留的(也许是为spring留的-_-),也就是3.1之前默认是on_close ,但3.1之后默认如果单独使用hibernate是after_transaction,
如果有第三方事务管理,就用第三方提供的默认值,spring就是默认使用了on_close。
在spring管理事务中我们看看系统启动后默认使用的配置:
1,ransaction strategy: org.springframework.orm.hibernate3.SpringTransactionFactory使用spring事务策略
2,hibernate内部 Automatic session close at end of transaction: disabled 因为已经交给spring了
3 Connection release mode: auto 默认,也就是没有配置hibernate.connection.release_mode的时候,但是这里有地方需要注意:也就是前面提到的使用第三方策略时的问题:看一下代码:
String releaseModeName
=
PropertiesHelper.getString( Environment.RELEASE_CONNECTIONS, properties,
"
auto
"
);
log.info(
"
Connection release mode:
"
+
releaseModeName );
ConnectionReleaseMode releaseMode;
if
(
"
auto
"
.equals(releaseModeName) )
{
releaseMode
=
transactionFactory.getDefaultReleaseMode(); }
else
{
releaseMode
=
ConnectionReleaseMode.parse( releaseModeName );
if
( releaseMode
==
ConnectionReleaseMode.AFTER_STATEMENT
&&
!
connections.supportsAggressiveRelease() )
{
log.warn(
"
Overriding release mode as connection provider does not support 'after_statement'
"
);
releaseMode
=
ConnectionReleaseMode.AFTER_TRANSACTION;
}
}
其中红色部分就是调用了spring提供的默认值,而spring的默认值:在jta和cmt中都默认使用的是after_statement
/** */
/**
* Sets connection release mode "on_close" as default.
* <p>This was the case for Hibernate 3.0; Hibernate 3.1 changed
* it to "auto" (i.e. "after_statement" or "after_transaction").
* However, for Spring's resource management (in particular for
* HibernateTransactionManager), "on_close" is the better default.
*/
public
ConnectionReleaseMode getDefaultReleaseMode()
{
return
ConnectionReleaseMode.ON_CLOSE;
}
而spring为什么要使用on_close ,而不是用after_transaction ,我们想想opensessioninview的原理也许能明白,session在view成还要使用,所以不能再transactio
n使用完后关闭JDBC connection,必须要在session之后,所以要使用on
_close
(
也就是在on session(flush.auto,或者flush.Eagerly) 关闭)。这种情况hibernate内部还会在spring关闭JDBC connection后提示(费解,因为after transaction之后session没有关闭,但是 Connection release mode配置的是on_close,session的关闭和 Connection 的关闭都由spring来管理,hibernate就不知道了),所以hibernate有好的提示如下(其实session,已经关闭。当然随着session的关闭jdbc链接释放回连接池):
transaction completed on session with on_close connection release mode; be sure to cl
ose the session to release JDBC resources!,
。当然我们也可以使用after_transaction ,这种情况对使用编程式事务非常适用。
新用户注册
刷新评论列表
只有注册用户
登录
后才能发表评论。
网站导航:
博客园
IT新闻
Chat2DB
C++博客
博问
管理
相关文章:
oracle 索引字段包含date类型,使用spring jdbc更新时不走索引,而是走table access full的问题
(转)Oracle数据库如何授权收费(Database Licensing)
ORA-06548错误
ora-01031:insufficient privileges
dbcp重连(转)
11g oracle 用户密码过期问题
ERROR 1049 (42000): Unknown database 'root' 处理
mysql 1130 错误 处理
oracle ORA-39212异常
Spring jdbc(java类型和oracle类型的转换)
Powered by:
BlogJava
Copyright © 疯狂
日历
<
2011年11月
>
日
一
二
三
四
五
六
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
6
7
8
9
10
公告
公众号:
QQjava交流群:
51374316
留言簿
(11)
给我留言
查看公开留言
查看私人留言
随笔分类
all 生活杂谈(16)
android(18)
apache项目(20)
chart(1)
concurrent(5)
database(70)
dwr(3)
flex(6)
hibernate(25)
java (135)
javafx(2)
javascript
java安全(8)
java性能(19)
jbpm(1)
jquery(4)
linux(17)
lucene(1)
netty(3)
nginx(1)
others(2)
questions(31)
questions_hander(28)
spring(32)
struts(9)
swing
UML(2)
unix(13)
web(45)
webservice(9)
xml(5)
敏捷(6)
方法论(28)
架构(21)
测试(1)
缓存
网络通讯(9)
读代码(6)
项目管理(19)
相册
我的相册
搜索
积分与排名
积分 - 2836048
排名 - 2
最新随笔
1. 后续内容请移步公众号“duomi88”
2. Netty百万级推送服务(转)
3. Netty 概述(转)
4. Netty优雅退出机制和原理(转)
5. 使用JavaMail SearchTerm 收取邮件
6. JAVA Thread Dump 分析综述
7. oracle 索引字段包含date类型,使用spring jdbc更新时不走索引,而是走table access full的问题
8. FTP主动模式和被动模式的比较(转载)
9. 关于java RMI在多网卡下(或者启动360,百度,腾讯等wifi共享下)无法连接问题(java.rmi.ConnectException: Connection refused to host: xx)
10. (转)Oracle数据库如何授权收费(Database Licensing)
11. 成功的 Web 应用系统性能测试 (转载)
12. It is indirectly referenced from required .class file异常
13. (转)svn cleanup failed–previous operation has not finished; run cleanup if it was interrupted
14. automation服务器不能创建对象 解决办法
15. ERROR: transport error 202: gethostbyname: unknown host 解决办法
16. JavaScript 跨浏览器事件处理(转)
17. 函数声明 VS 函数表达式(转)
18. ORA-06548错误
19. 项目规划与管理记录2
20. tmpFile.renameTo(classFile) failed
21. redhat6.4 64位安装rlwrap
22. ora-01031:insufficient privileges
23. mysql远程连接问题 Access denied for user 'root'@' ip ' (using password: YES)
24. dbcp重连(转)
25. 解决Vmware Workstation上安装Linux系统不能SSH远程连接的问题
26. URL最大长度限制(转)
27. 用MyEclipse测试发送email时报java.lang.NoClassDefFoundError: com/sun/mail/util/LineInputStream
28. 我应该采用哪一种 WSDL 样式?(转载)
29. linux 挂载ntfs usb 出现mount: unknown filesystem type 'ntfs'
30. 11g oracle 用户密码过期问题
最新评论
1. re: Oracle物化视图创建全过程(转)
评论内容较长,点击标题查看
--ya
2. re: Oracle物化视图创建全过程(转)
评论内容较长,点击标题查看
--ya
3. re: 11g oracle 用户密码过期问题
问问
--是是是
4. re: mysql远程连接问题 Access denied for user 'root'@' ip ' (using password: YES)
asdfsadf
--asdf
5. re: struts(il8n)实现国际化的一个例子
在啥地方
--正常