session未关闭问题

mack1122 2011-09-06 10:15:54
java 中 用的hibernate 。在try外面 调用openSession方法打开session,在finally中关闭session。不知这样是否有session未关闭的风险?有风险能稍微说明下嘛?
...全文
341 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
mack1122 2011-09-10
  • 打赏
  • 举报
回复
学习中
惢随你动 2011-09-09
  • 打赏
  • 举报
回复
不关闭session的后果是,随着系统的运行,数据库连接数将逐渐增多,最终导致数据库拒绝连接。
数据库拒绝连接后,重新启动应用,原有连接将释放,此时应用又可正常运行。
如果发现应用存在连接未释放问题而一时半会又不能正确定位时,可通过定时触发的计划任务,重新启动应用,保证应用在一定程度上可用。
如果数据库是db2,那么可能还需要重新启动数据库所在的服务器(操作系统)。
daoledapp 2011-09-09
  • 打赏
  • 举报
回复
ok 既然你这样问的话,那就是没风险,finally就算是有异常抛出之后也会执行!
如果每次都是用显示session 是不是太过浪费,如果session的生命周期只在当前有效的话,希望多听听之前各位的建议!
雪花公子 2011-09-09
  • 打赏
  • 举报
回复
其实没什么风险,用当前的和重新打开session都是会被关闭的。只是重新打开session浪费点资源。getCurrentSession()会自己动被关闭的,而openSession()也会在try里面关关闭啊。
mack1122 2011-09-09
  • 打赏
  • 举报
回复
学习中
ucasliming 2011-09-09
  • 打赏
  • 举报
回复
还可以吧,不会浪费太多资源,就是需要每次都手动关闭session。
袭烽 2011-09-09
  • 打赏
  • 举报
回复
我一般把session交给spring来维护,spring利用线程管理事务,通过事务配置确保每次连接都能得到合理释放,解放精力,为什么不用它呢?
mack1122 2011-09-09
  • 打赏
  • 举报
回复
继续学习
bijanen19861113 2011-09-09
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 loudspeaker1987 的回复:]

当在finally关闭session的时候出现了异常,那么种种异常可以被忽略,并且该对象的终结过程也会终止,未被捕获的异常会是对象处于破坏的状态,如果另一个线程企图使用这种被破坏的对象,则可能发生任何不确定的行为。正常情况下,未被捕获的异常将会使线程终止,并打印出栈轨迹,但是,如果异常发生在终结方法中,则不会如此,甚至连警告都不会打印出来。,但是如果在finally方法中通过显示的终止方法就可以……
[/Quote]

牛啊,比较赞同这里。有没有风险,我只说我的理解,至于有没有你自己签定。

假设说你要在finally中关闭,如果此时关闭抛异常呢?那么你就有必要再次在finally中显式的try吗?如果你没有捕获的话,程序应该是会出问题的。
mack1122 2011-09-09
  • 打赏
  • 举报
回复
学习中
mack1122 2011-09-07
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 zengxianjunccccccccc 的回复:]

唉,不想说
[/Quote]

??不会吧!
仙人长 2011-09-07
  • 打赏
  • 举报
回复
唉,不想说
mack1122 2011-09-07
  • 打赏
  • 举报
回复
openSession 会不会已经打开session,即创建过session,然后某个过程抛出异常?
飞宁越 2011-09-07
  • 打赏
  • 举报
回复
呜~~刚学不懂,帮你顶下!
liuc0317 2011-09-07
  • 打赏
  • 举报
回复
要使用hibernate 最好配合上spring 让它来管理这一切。
dzr1990 2011-09-07
  • 打赏
  • 举报
回复
不关闭肯定是有内存溢出风险的,但是看你的业务大不大,如果不大的话就应该没事。

另外最好用getCurrentSession()啊,楼主……
clnlkw3 2011-09-07
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 mack1122 的回复:]

引用 5 楼 clnlkw3 的回复:

引用 4 楼 mack1122 的回复:

引用 3 楼 clnlkw3 的回复:

别用openSession
用getCurrentSession


兄弟,你跑题了!现在是讨论这个会不会又风险!

好吧,兄弟,用openSession是有风险的
因为这个方法每次都要打开一个session
而且要手动关闭
如果你忘记关闭……
[/Quote]
如果你每次都自觉手动关闭SESSION的话
应该是没有风险的
loudspeaker1987 2011-09-07
  • 打赏
  • 举报
回复
另外补上,你可以参考effective java 2的第七条:避免使用终结方法
loudspeaker1987 2011-09-07
  • 打赏
  • 举报
回复
当在finally关闭session的时候出现了异常,那么种种异常可以被忽略,并且该对象的终结过程也会终止,未被捕获的异常会是对象处于破坏的状态,如果另一个线程企图使用这种被破坏的对象,则可能发生任何不确定的行为。正常情况下,未被捕获的异常将会使线程终止,并打印出栈轨迹,但是,如果异常发生在终结方法中,则不会如此,甚至连警告都不会打印出来。,但是如果在finally方法中通过显示的终止方法就可以避免这个问题,session.close()我不太清楚是否是显式的终止方法,如果是,那么就不存在风险
mack1122 2011-09-06
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 clnlkw3 的回复:]

引用 4 楼 mack1122 的回复:

引用 3 楼 clnlkw3 的回复:

别用openSession
用getCurrentSession


兄弟,你跑题了!现在是讨论这个会不会又风险!

好吧,兄弟,用openSession是有风险的
因为这个方法每次都要打开一个session
而且要手动关闭
如果你忘记关闭了
就可能导致异常或者连接池溢出,最后崩溃
……
[/Quote]

你说的我知道,现在是我说的这样情况有没有风险。数据库的处理都在try中完成。
加载更多回复(5)

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧