在使用ssh框架开发时,使用spring代替管理数据库的连接,一般的dao层格式为
先获取session,然后开事务,然后处理逻辑,然后关闭事务。
在开发中遇到一个问题。在dao层处逻辑时,需要跳到其他的层去处理逻辑,那么如果在这个其他逻辑的地方也是用了同样的方式
获取session,并且提交事务后,返回原逻辑中使用该session会报session is close的异常。
原因:查过资料发现getSessionFactory获取session一般有两种方法:
1.getCurrentSession();
2.openSession();
第一种方法会先去查询是否有已经打开的session,如果有,直接返回,如果没有,调用openSession打开一个新的返回。所以以上情况是 在原逻辑打开了一个session a,但是在中途处理的逻辑中,我再次使用方法1获取sesison,也就是获取到的session a,我使用完后commit,spring会自动关闭该session,所以在返回原逻辑继续执行时,报了session is close的异常。
第二种方法是直接打开一个新的session返回,算是非常规逻辑使用spring获取session的一种替代方法。只是需要方法2打开的session需要自己手动关闭,以免造成session无功占用。