主要是机制问题,在一个系统中Session是否是单例?如何进行并发处理?
解决方案 »
- java 搜索文本内容 的问题
- servlet问题
- 求助:关于spring中aop的问题
- 请教各位高人一个JS的问题
- hibernate search整合spring
- tomcat服务器无法响应请求
- 为什么我在用Hibernate时一到Transaction.commit时报NullPointException
- 使用jdom获取元素属性的时候为什么会出现NullPointerException的异常(程序很短)
- weblogic配置问题
- JavaScript 基本运算综合 求助
- 为什么tomcat自带的jsp可以运行,但是其它的jsp就是运行不了呢?
- hibernate3 更新数据问题,大家有碰到过的没?
这个例子似乎有点问题.我试过访问经过一段时间后,如果没有动作会自动断开连接数据库,
而且网站也访问不了.
这种情况不用hibernate的项目遇到,一个是delphi的项目,一个是J2EE项目.后者是系统安全策略导致的.
public static Session currentSession() throws HibernateException {
Session s = (Session) session.get();既然每次取currentSession()都会取绑定在本地线程上的session,Session s = (Session) session.get();
session.set(null);如果每次都要求使用完关闭
也就会使以后再次使用session,通过
Session s = (Session) session.get();
取出来的s总是为null
是的,目前我是调用完Session之后就关闭它,所以才出现了后来取得的Session都是关闭的.TO CAYU:
<--
使用的是单例模式,但调用的 session 是多例的.并且是一个session 的多个实例
--> 呵呵,我不是很明白其中的含义,能解释清楚一点吗?大家多发表一下高见啊!
因为并没有调用HibernateUtil.closeSession(),所以也就没有调用ThreadLocal.set(null)去清除ThreadLocal内部hash中对应的session,因此当你下次调用HibernateUtil.currentSession()的时候返回的还是那条被你close掉的session。所以就会报出Session已关闭的错误!
不知道你是不是也分我犯了一样的错误 ^ ^
Session sn2 = HibernateUtil.currentSession();
System.out.println(sn1.hashCode()+", "+sn2.hashCode());大家看一下结果就明白是单例还是多例!
session 就是一个,没有多的,你关闭了就都关闭了.所以在使用的时候不要 closeSession() 就当它没有好了.只有在发生异常的时后建议关闭.延迟加载策略 在这种模式下就不能很好的使用了.
如果你真想使用延迟加载策略那得换个方法了. 比如使用页面过滤,在页面打开的时候打开session,
页面关闭的时候在关闭session.网上也有这个代码的.但对本人研究的结果来说速度最块的,还是ThreadLocal.其他的方法我测试了效果都不是很好.期待能有更好的方法.
Session s = (Session) session.get();
// Open a new Session, if this Thread has none yet
if (s == null) {
s = sessionFactory.openSession();//add here!
s.connection().setAutoCommit(true);session.set(s);
}
return s;
}在关闭时候再加入一句s.flush();应该就行了
我怎么结这个贴呀? ---------------------
最简单的办法是, 点管理->填写密码->找到我的名字(CAYU(中原)) ->然后填上100->在点给分
就ok了
:)