gethibernatetemplate的find方法

来源:互联网 发布:张扬个性的句子 知乎 编辑:程序博客网 时间:2024/05/07 12:53

为什么使用gethibernatetemplatefind方法 ?  

一般我们 访问数据库  有两种选择 : 

getSession().createQuery("from Area");

getHibernateTemplate().find( "FROM Area);

   

通过测试:

分别循环调用getSession().createQuery("fromUsers");

                       getHibernateTemplate().find( "FROM Users);

1000次结果getSession()很快就报无法建立连接了。

这是因为getSession() 没有自动释放连接   数据库连接上线达到

getHibernateTemplate可以跑完。

通过后台观察,使用getSession会在数据库中留下很多client的连接,并且不会自动 释放 连接

而  getHibernateTemplate  每次连接之后 都会自动释放连接

测试步骤:(测试信息可能过大 因此需要将文件输入到一个文件中  才可以看到 效果)

首先配置:eclipce  配置

      将 log4j.properties中的  debug 调试 注释打开

      在RanAS找到 RunCofigurations  --- common -----file 指定路径

      将dubug信息输入到指定的文件中(方便查看)


数据库配置: (MYSQL

在安装mysql 的目录中找到 my.ini 的文件 将数据库的最大 默认连接量 修改成 10(测试用的)  默认是100 连接量(重新启动服务)


   

代码测试:(基于SSH1的测试环境)

使用getSession 做测试  并循环十二次 超过数据库连接的最大值

发现输出的信息中在 手动关闭session的情况下不会发生连接错误

在没有手动关闭的情况下会发生数据库打开错误在第十一次连接时发生 连接已达到上限  


而使用getgetHibernateTemplate() 做测试  并循环十二次 (超过数据连接的最大值)

查看log4j 输出的信息时:会报连接已释放正在获取第十一次连接

     

在提交数据时二者也有很大的区别(事务)

在相关配置都正确的情况下:

我们在代码中加上一个异常信息

  

然后我们分别使用getSession 和 getgetHibernateTemplate 进行测试 

结果发现:getSession  在没有 手动关闭的情况下 数据不会提交

但在使用  getsession.close(); 下 数据就会提交

所以我们知道 getsession.close(); 相当于  commit(关于为什么要使用 getsession.close() 前面已经测试过)  

在使用 getgetHibernateTemplate() 的情况下 

我们发现输出的信息中:

并且数据不会提交 !

结论:

(1)通过对getSession()getHibernateTemplate的比较我们发现getHibernateTemplate可以自动释放连接(当然你的配置要正确)

在没有使用 getSession().close 的情况下 getSession() 不会释放连接

(2)在事务的管理中  (自己写的一个异常信息)  getSession(),在没有使用 getSession().close  的情况下会 rollback  但在使用 getSession().close 的情况下 即使 抛出异常数据也不会回滚 。  

在测试 getHibernateTemplate()  时同样 写上 一个 运行时异常的代码   运行程序 我们发getetHibernateTemplate ()   不会自动提交  发生异常信息时 会 rollback  因此我们建议使用 getHibernateTemplate()   ; 

(3)如果有些语句无法用getHibernateTemplate实现,可以使用 getHibernateTemplate.execute使用 HibernateCallback回调接口

具体语法百度就有!

原创粉丝点击