Spring如何管理Session RT 我不太了解SPRING 实际上HIBERNATE也不是很了解 拜托给偶讲讲 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我也搬个板凳坐下来听JAVA2000_NET讲 简单点说给个HIBERNATE整和SPRING的例子 抱歉 没上过几年学... 不过你们进来的时候都没看题目么?....就是问Spring是如何管理Hibernate Session的..... 最主要的思想,还是session跟threadlocal变量绑定。然后再根据spring的事务配置,再决定是否在session一打开的时候,就开启事务,或置身于一个已存在的事务中。 Spring如何管理Session :在使用Spring进行系统开发的时候,数据库连接一般都是配置在Spring的配置文件中,并且由Spring来管理的。在利用Spring + Hibernate进行开发时也是如此。下面是一个简单的Spring + Hibernate Dao的例子: 程序代码public class DaoReal extends HibernateDaoSupport implements Dao { public List<User> getAll() { return super.getHibernateTemplate().find("from User"); }} 在上面的这个例子中,我们并没有关闭Session,但程序并没有任何问题,那是因为Spring已经帮我们关闭了。那么再看一个例子: 程序代码public class DaoReal extends HibernateDaoSupport implements Dao { public List<User> getAll() { return super.getSession().createQuery("from User").list(); }} 这个例子会不会有问题呢?的确,上面的例子中隐藏了一个问题,数据库连接并没有被关闭,在我们的印象中这件事似乎应该是Spring的。程序执行后,好像也没有什么问题,但是连续执行该语句n次(n<=最大连接数,如果没有指定最大连接数,那么默认为10次)后,系统处于等待状态,不会继续执行了,控制台上并没有输出任何信息。打开log文件,发现系统抛出java.lang.IllegalStateException: Pool not open的异常,无法打开连接。这说明系统连接池中所有的连接都在使用中。那么我们手动关闭Session后,应该就没有问题了吧!是这样吗?修改我们的例子,如下: 程序代码public class DaoReal extends HibernateDaoSupport implements Dao { public List<User> getAll() { Session s = super.getSession(); try { return s.createQuery("from User").list(); } finally { s.close(); } }} 执行n遍后依然停止响应。问题出在哪里呢?其实Spring的Session总是与某个线程绑定的,而这个线程往往就是承载Servlet或Jsp的那个线程,也就是说,它的生命周期scope是request的。在上面的例子中,我们利用getSession强制获得了Hibernate的Session,这个Session可能是当前事务中之前使用过的,或者可能是一个新的,并不在当前事务中,Spring只对当前事务中的Session进行关闭。 要解决这个问题,方法有很多。可以使用我们之前讲到过的getHibernateTemplate().find()。也可以设定HibernateTemplate的AllowCreate为True,并在finally中关闭Session。也可以将true作为参数传递到super.getSession(..)方法中取得Session。这里的true表示允许创建。 我现在只是想明白 假设我用了延迟加载 或者我需要对QUERY进行一些操作(这样的话就不能用HibernateDaoSupport的查询方法了) 在这种情况下我要如何管理SESSION 比如什么时候开 什么时候关 是手动执行开关 还是自动执行开关 我基本上不会SPRING 只是稍微有些了解 看看你们都是怎么做的继续顶...奇怪 偶地帖咋木有人来捏? 其实,session还是hibernate的,只不过你不需要自己用代码启动而已,而是Spring自动替你注入了。没有Spring,Hibenate依然可以运行,而且很好。Spring就是一个粘合剂,它让你用多个东西时,看上去更好用而已。没别的。但这个理由已经很充分了。 我现在用getCurrentSession()获得SESSION 然后不用延迟加载了 怎样? hibernate 和structs 没有spring 也可以运行,不过有了它,他们会运行的更好,更有效率,这年头不就就讲究效率和节约吗....呵呵 挑战 spring 高手 对于MVC实际使用中的一点疑惑,各位大神赐教 数据库更新后,java怎么知道更新了哪些数据? valueChangeListener derby数据库开发问题 struts 的配置流程 分享 小发现 哈哈~~~~ struts的中文转码问题,非常急!!! 在编译useClass1时总是说找不到class1 学J2EE要有什么JAVA基础,麻烦给个J2EE学习路线,最好附推荐图书,谢谢 struts2 <s:property>取值??? Spring与Hibernate集成出错了,哪位大虾来帮下忙
public List<User> getAll() {
return super.getHibernateTemplate().find("from User");
}
}
在上面的这个例子中,我们并没有关闭Session,但程序并没有任何问题,那是因为Spring已经帮我们关闭了。那么再看一个例子: 程序代码public class DaoReal extends HibernateDaoSupport implements Dao {
public List<User> getAll() {
return super.getSession().createQuery("from User").list();
}
}
这个例子会不会有问题呢?的确,上面的例子中隐藏了一个问题,数据库连接并没有被关闭,在我们的印象中这件事似乎应该是Spring的。程序执行后,好像也没有什么问题,但是连续执行该语句n次(n<=最大连接数,如果没有指定最大连接数,那么默认为10次)后,系统处于等待状态,不会继续执行了,控制台上并没有输出任何信息。打开log文件,发现系统抛出java.lang.IllegalStateException: Pool not open的异常,无法打开连接。这说明系统连接池中所有的连接都在使用中。那么我们手动关闭Session后,应该就没有问题了吧!是这样吗?修改我们的例子,如下: 程序代码public class DaoReal extends HibernateDaoSupport implements Dao {
public List<User> getAll() {
Session s = super.getSession();
try {
return s.createQuery("from User").list();
} finally {
s.close();
}
}
}
执行n遍后依然停止响应。问题出在哪里呢?其实Spring的Session总是与某个线程绑定的,而这个线程往往就是承载Servlet或Jsp的那个线程,也就是说,它的生命周期scope是request的。在上面的例子中,我们利用getSession强制获得了Hibernate的Session,这个Session可能是当前事务中之前使用过的,或者可能是一个新的,并不在当前事务中,Spring只对当前事务中的Session进行关闭。 要解决这个问题,方法有很多。可以使用我们之前讲到过的getHibernateTemplate().find()。也可以设定HibernateTemplate的AllowCreate为True,并在finally中关闭Session。也可以将true作为参数传递到super.getSession(..)方法中取得Session。这里的true表示允许创建。
不过有了它,他们会运行的更好,更有效率,这年头不就
就讲究效率和节约吗....呵呵