查看: 448|回复: 1

getHibernateTemplate和getSession 区别 getCurrentSession()和OpenSession ...

[复制链接]

47

主题

47

帖子

669

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
669
QQ
发表于 2019-3-6 17:27:01 | 显示全部楼层
getHibernateTemplate和getSession 区别, this.getHibernateTemplate().getSessionFactory().getCurrentSession()和OpenSession区别
SSH的项目中,使用getHibernateTemplate 与 getSession有什么的区别?
1.使用getSession()方法你只要继承 sessionFactory,而使用getHibernateTemplate()方法必须继承HibernateDaoSupport当然包括 sessionFactory,这点区别都不是特别重要的,下面这些区别就很重要了
2.getSession()方法是没有经过spring包装 的,spring会把最原始的session给你,在使用完之后必须自己调用相应的close方法,而且也不会对声明式事务进行相应的管理,一旦没有及时 关闭连接,就会导致数据库连接池的连接数溢出,getHibernateTemplate()方法是经过spring封装的,例如添加相应的声明式事务管 理,由spring管理相应的连接。


在实际的使用过程中发现的确getHibernateTemplate()比getSession()方法要好很多
这个是hibernate与spring整合开发,让DAO继承了spring的HibernateDaoSupport,这样的确能够提高开发效率 ,但是不够灵活,而且使DAO层依赖于spring的api,增加了耦合。但是不考虑复用的话还可以。
    下面一个一个的分析: this.getsession实际上是调用了父类中的方法获得session。使用spring管理hibernate的SessionFactory的时候,这个方法会从session池中拿出一session.这样做有可能有问题,就是超session池连接数的时候,spring无法自动的关闭session。 不推荐使用
     this.getHibernateTemplate().getSessionFactory().getCurrentSession()从spring管理的sessionFactory中创建一个绑定线程的session.spring会根据该线程的执行情况来自动判断是关闭session还是延迟关闭。这样做可以避免手动的管理实务,同时一个线程最多开启和关闭一次session又可以提高程序的性能。 极力推荐使用这种方法
     this.getHibernateTemplate().getSessionFactory().OpenSession。这种方法从spring管理的sessionFactory中创建一个session,此session不是线程绑定的。当执行完一个实务的时候自动关闭session.这种方法不用手动管理实务,但是同一个线程多次的开启和关闭session,浪费系统资源和影响执行效率,正常情况下还是不要用了。


回复 使用道具 举报

0

主题

5

帖子

32

积分

新手上路

Rank: 1

积分
32
发表于 2020-12-15 15:13:35 | 显示全部楼层

-

Yes, really. All above told the truth. We can communicate on this theme. Here or in PM.
回复 使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|SvipXP ( 黑ICP备17005533号-3 )

© 2001-2017 SvipXP

致! 世 界 上 所 有 的 美 好 !

快速回复 返回顶部 返回列表