xiaoguozi's Blog
Pay it forword - 我并不觉的自豪,我所尝试的事情都失败了······习惯原本生活的人不容易改变,就算现状很糟,他们也很难改变,在过程中,他们还是放弃了······他们一放弃,大家就都是输家······让爱传出去,很困难,也无法预料,人们需要更细心的观察别人,要随时注意才能保护别人,因为他们未必知道自己要什么·····

Hibernate文档笔记共分为三个部分,此处是第二部分,讲述了Contextual Sessions、Configuration、获取SessionFactory和JDBC Connections(Session是对JDBC连接的封装)。

五、Contextual Sessions

许多应用程序需要一种和上下文有关联Hibernate session,这样的session是指贯穿于给定环境的上下文中都有效的session。无论如何,贯穿于应用程序应用上下文由什么组成的清晰度不同,不同的上下文针对当前的概念有不同的范围。

使用Hibernate 3.0以前版本的应用程序,趋于使用自已实现的基于ThreadLocal来维护前后关系的session、诸如HibernateUtil的帮助类;或使用基于代理或拦截机制的第三方的框架(Spring或Pico)。

从Hibernate 3.0.1,Hibernate加入了SessionFactory.getCurrentSession()方法。最初,假定使用JTA事务定义了当前session的scope和context。Hibernate团队维护时,给定了成熟的卓越的JTA TransactionManager的实现方式,多数(但不是所有)应用程序应该使JTA transaction management,不论它是否发布到一个JEE容器中。基于这一点,基于用JTA来维护上下文关系中的session应该是必须的。

无论如何,在Hibernate 3.1,SessionFactory.getCurrentSession()之后的处理,是可以被插拔的,也就是说可以session的范围和上下文。新扩展接口(org.hibernate.context.CurrentSessionContext)和新的配置参数(hibernate.current_session_context_class)被加入,允许插拔,也就是说可以定义session的范围和上下文。

细节可以查看org.hibernate.context.CurrentSessionContext的文档。它定义了一个currentSession()方法,负责跟踪与当前上下文相关联的session。Hibernate提供了这个接口的三种实现方式。

1.org.hibernate.context.JTASessionContext

当前session,通过JTA事务跟踪和标识生命周期。这里的处理过程在处理方法上和老JTA是相似的。

2.org.hibernate.context.ThreadLocalSessionContext

当前session,通过当前执行的线程来跟踪。

3.org.hibernate.context.ManagedSessionContext

当前session,通过当前执行的线程来跟踪。你是负责绑定和解除当前session到执行线程通过使用这个类的静态方法。该类不会open、flush、close session。

前两个实现类,提供了“一个session对应一个数据库事务”的编程模式,也就是众所周知的“session-per-request”模式。Hibernate session的开始和结束,是以数据库中事务的执行时间为依据的。如果你使用编程方式划分事务,用简单的JSE需不是JTA,你应该考虑使用Hibernate事务APIs来隐藏低层的事务代码。如果你使用的是JTA,使用JTA的接口来划分事务。如果你在一个支持CMT(Container Management Transaction)的容器运行程序,事务是通过声明定义,在你程序中不需要任何的代码来划分事务。

Hibernate.current_session_context_class参数应该指定,一个org.hibernate.context.CurrentSessionContext的实现类。如果配置参数没有被设置,而是配置了一个org.hibernate.transaction.TransactionManagerLookup被设置,Hibernate将使用org.hibernate.context.JTASessionContext,这里要考虑向后兼容。典型的情况下,这个参数是使用的类的名字。对于Hibernate提供的三个实现类,有对应的三个简短名,“jta”、“thread”、“managed”。

六、Configuration

1.编程配置

一个org.hibernate.cfg.Configuration的实例表示一个应用程序的所有Java类型到数据库类型的映射。org.hibernate.cfg.Configuration是用来建造一个org.hibernate.SessionFactory。被编译的映射是来自所有的XML映射文件。

片断1.

  1. Configuration cfg = new Configuration().addResource(“test.hbm.xml”); 

片断2.

  1. Configuration cfg = new Configuration().addClass(com.test.class); 

片断3.

  1. Configuration cfg = new Configuration().setProperty(“hibernate.dialect”, “org.hibernate.dialect.DB2Dialect”); 

Configuration可以接收的选项:

(1)传递一个java.util.Properties到Configuration.setProperties()。

(2)放一个hibernate.properties文件到类路径的根目录。

(3)设置系统properties,通过java –Dproperty=value。

(4)包含<:property>标签指定值在hibernate.cfg.xml文件。

org.hibernate.cfg.Configuration对象是有意作为一个开始时间生成的对象的,一旦SessionFactory被创建,他将被抛弃掉。

七、获取SessionFactory

当org.hibernate.cfg.Configuration解析完所有的映射文件后,应用程序应该获取一个org.hibernate.Session实例的工厂。这个工厂是被应用程序的所有线程共享的。

  1. SessionFactory sessionFactory = cfg.buildSessionFactory(); 

Hibernate允许应用程序实例多个SessionFactory。对于使用多个数据库的应用程序是非常有用的。

八、JDBC Connections(Session是对JDBC连接的封装)

通常,你应该使用org.hibernate.SessionFactory来创建或共享JDBC。如果这采用这种方法,是非常简单的。

  1. Session session = sessionFactory.openSession(); 

当你的操作需要访问数据库时,一个JDBC连接就会从连接池中被获取。

对于这个工作,我们应该给Hibernate提供一些JDBC连接属性。所有的Hibernate属性名和语义学都被定义在org.hibernate.cfg.Environment。我们现在描述对于JDBC连接配置的一些更重要的设置。

1.如果你设置以下属性,Hibernate将获取或共享连接使用java.sql.DriverManager:

  1. hibernate.connection.driver_class  
  2.  
  3. hibernate.connection.url  
  4.  
  5. hibernate.connection.username  
  6.  
  7. hibernate.connection.password  
  8.  
  9. hibernate.connection.pool_size 

Hibernate自己拥有的连接池算法是没有发展的。他是为了你的初始接触使用的,而不是为了你的产品使用的,甚至性能测试时使用。为了更好的性能和稳定性考虑,你应该使用第三方的连接池产品。只需要替换hibernate.connection.pool_size属性的设置用相应连接池的设置。这将关闭Hibernate内部的连接池。例如,可以使用C3P0。

C3P0是一个开源的JDBC连接池,被放置在Hibernate发布文件的lib目录下,随Hibernate一块发行。如果你设置hibernate.c3p0.*属性,Hibernate将会使用org.hibernate.connection.C3P0ConnectionProvider为共享连接。如果你想使用proxool作为连接池,你可以通过查阅hibernat.properties或Hibernate站点获取需要设置的属性名设置。

C3P0配置举例,属性文件片断:

  1. hibernate.connection.driver_class=  
  2.  
  3. hibernate.connection.url=  
  4.  
  5. hibernate.connection.username=  
  6.  
  7. hibernate.connection.password=  
  8.  
  9. hibernate.c3p0.min_size=  
  10.  
  11. hibernate.c3p0.max_size=  
  12.  
  13. hibernate.c3p0.timeout=  
  14.  
  15. hibernate.c3p0.max_statements=  
  16.  
  17. hibernate.dialect= 

2.对于在应用服务器内运行的程序,多数情况你应该配置Hibernate通过JNDI找到服务器的javax.sql.DataSource来获取连接。你需要设置以下属性。

  1. hibernate.connection.datasource  
  2.  
  3. hibernate.jndi.url  (可选)  
  4.  
  5. hibernate.jndi.class  (可选)  
  6.  
  7. hibernate.connection.username  (可选)  
  8.  
  9. hibernate.connection.password  (可选) 

你可以通过实现org.hibernate.connection.ConnectionProvider来定义自己的获得连接的策略。通过hibernate.connection.provider_class配置使用自己的定义起作用。

posted on 2009-07-17 17:18 小果子 阅读(159) 评论(0)  编辑 收藏 引用 所属分类: 学习笔记

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理