在使用Spring进行系统开发的时候,数据库链接通常都是配置在Spring的配置文件中,而且由Spring来管理的。在利用Spring + Hibernate进行开发时也是如此。下面是一个简单的Spring + Hibernate Dao的例子:
java
在上面的这个例子中,咱们并无关闭Session,但程序并无任何问题,那是由于Spring已经帮咱们关闭了。那么再看一个例子:
数据库
这个例子会不会有问题呢?的确,上面的例子中隐藏了一个问题,数据库链接并无被关闭,在咱们的印象中这件事彷佛应该是Spring的。程序执行后,好像也没有什么问题,可是连续执行该语句n次(n<=最大链接数,若是没有指定最大链接数,那么默认为10次)后,系统处于等待状态,不会继续执行了,控制台上并无输出任何信息。打开log文件,发现系统抛出java.lang.IllegalStateException: Pool not open的异常,没法打开链接。这说明系统链接池中全部的链接都在使用中。那么咱们手动关闭Session后,应该就没有问题了吧!是这样吗?修改咱们的例子,以下:
线程
执行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表示容许建立。生命周期