当前位置:首页>开发>正文

Hibernate中Session什么意思 Hibernate session获得connection的时机

2023-05-23 04:48:39 互联网 未知 开发

 Hibernate中Session什么意思 Hibernate session获得connection的时机

Hibernate中Session什么意思?

Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。
Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。
Session:在计算机中,尤其是在网络应用中,称为"会话控制"。Session 对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。
当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。Session 对象最常见的一个用法就是存储用户的首选项。
例如,如果用户指明不喜欢查看图形,就可以将该信息存储在 Session 对象中。有关使用 Session 对象的详细信息,请参阅"ASP 应用程序"部分的"管理会话"。注意 会话状态仅在支持 cookie 的浏览器中保留。
HIBERNATE是 自然水公司
SESSION 是从自然水公司到你家里的管道。
要用水,你必须先造一个管道。
如果延迟加载的话,记得把水龙头开着。

Hibernate session获得connection的时机

connection是对数据库的连接,是在你使用hibernate时读取配置文件中的时建立的,由hibernate来管理对数据库的连接。
这是SessionFactory中定义的openSession():
public org.hibernate.classic.Session openSession() throws HibernateException
返回经典Session的引用。
这是经典Session的定义:
public interface Session extends org.hibernate.Session
继承hibernate3中的Session。
在hibernate3中的Session接口中你可以找到如下两个方法的声明:
public Connection connection() throws HibernateException
public Transaction beginTransaction() throws HibernateException
第一个方法使得你可以使用jdbc的方式操作数据库,通常用来调用存储过程等
第二个是在session中获得对事务进行操作。
所以整个过程应该是: 你先建立对数据库的连接,然后使用Session对数据库进行操作。白话就是先建立连接,然后进行一系列会话。如果涉及到并发、一致性等问题,要进行事务操作的时候先打开事务,然后在执行一系列session中的方法对数据库进行操作。

hibernate中的session问题?

opensession当然要关闭,getCurrentSession才会在commit,或rollback时会自动关闭,但需要在spring里配置声明式事物,opensessioninview延长session生命周期。

hibernate 中的session问题!

我刚学饿。

我认为 session无非在访问数据库的时候创建,也就是openSession
getCurrentSession的时候,结束数据库访问的时候关闭。

有时候要等到 jsp展现完成的时候才能关闭。

不关闭...getCurrentSession就不用关闭了。用了HibernateTempalte 对hibernate进行了封装,session的创建,和关闭也都不用了。
只有openSession才需要关闭,没有关闭无非占用着连接的资源。
不过一般不可能不关吧...

菜鸟。。共同探讨。

Spring是如何管理Hibernate Session的

在利用Spring Hibernate进行开发时也是如此。下面是一个简单的Spring Hibernate Dao的例子:
程序代码public class DaoReal extends HibernateDaoSupport implements Dao {
public List getAll() { return super.getHibernateTemplate().find("from User")}}在上面的这个例子中,我们并没有关闭Session,但程序并没有任何问题,那是因为Spring已经帮我们关闭了。那么再看一个例子: 程序代码public class DaoReal extends HibernateDaoSupport implements Dao { public List getAll() { return super.getSession().createQuery("from User").list()}}这个例子会不会有问题呢?的确,上面的例子中隐藏了一个问题,数据库连接并没有被关闭,在我们的印象中这件事似乎应该是Spring的。程序执行后,好像也没有什么问题,但是连续执行该语句n次(n <=最大连接数,如果没有指定最大连接数,那么默认为10次)后,系统处于等待状态,不会继续执行了,控制台上并没有输出任何信息。打开log文件,发现系统抛出java.lang.IllegalStateException: Pool not open的异常,无法打开连接。这说明系统连接池中所有的连接都在使用中。那么我们手动关闭Session后,应该就没有问题了吧!是这样吗?修改我们的例子,如下: 程序代码public class DaoReal extends HibernateDaoSupport implements Dao { public List getAll() { Session s = super.getSession()try {return s.createQuery("from User").list() } finally { s.close()}}}执行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表示允许创建。

最新文章