日期:2014-05-16  浏览次数:20484 次

Hibernate数据库连接的设置及其配置文件的书写
Hibernate数据库连接的设置及其配置文件的书写
首先Hibernate的配置有两种情况1.管理环境中的配置。2.非管理环境中的配置。我们可以理解管理环境为它提供了自动的事务,资源管理和底层的安全结构。比如JBoss,BEA WebLogin或IBM Websphere都实现了标准的管理环境。而非管理环境与之相反没有提供自动的事务,资源管理和底层的安全结构。比如Jetty或Tomcat这样的servlet容器。

其次我们来看具体的数据库连接
在非管理环境中,我们的hibernate要去获得JDBC连接,如果我们为每个数据库的交互都去创建一个连接就比较浪费资源了,所以我们应该使用数据库连接池。而非管理环境又没有实现连接池,我们必须实现自己的池化算法或者依赖于第三方类库例如C3P0,因为Hibernate内置了对C3P0的支持,所以我们使用该连接池。不使用Hibernate时,应用代码通常直接调用连接池来获得JDBC连接并执行SQL语句。

在管理环境中,比如,J2EE应用服务器就是典型的管理环境。虽然应用服务器通常是为了支持EJB而设计的,但即使你不使用EJB实体Bean,你仍然可以利用它提供的其它服务。Hibernate经常与会话或消息驱动EJB一起使用,EJB调用相同的Hibernate API:Session(会话)、Transaction(事务)和Query(查询)。与Hibernate相关的代码在非管理与管理环境之间是完全可移植的,Hibernate透明地处理了不同的连接与事务策略。应用服务器将连接池对外显示为JNDI绑定数据源。它是javax.jdbc.Datasource类的一个实例。你需要提供一个JNDI全限定名来告诉Hibernate,到哪里去查找JNDI数据源。
比如:
hibernate.connection.datasource = java:/comp/env/jdbc/AuctionDB
hibernate.transaction.factory_class = \
net.sf.hibernate.transaction.JTATransactionFactory
hibernate.transaction.manager_lookup_class = \
net.sf.hibernate.transaction.JBossTransactionManagerLookup
hibernate.dialect = net.sf.hibernate.dialect.PostgreSQLDialect

但是我们要知道:引自《Hibernate in Action》
引用
Java早就有了一个标准的事务API:JTA,它用来在J2EE管理环境中控制事务。这被称作容器管理的事务(CMT)。如果存在JTA事务管理器,JDBC连接将被它支持并完全位于它的控制之下。这与非管理环境不同,在非管理环境中应用(或连接池)直接管理JDBC连接和JDBC事务。

因为Hibernate需要在这两种环境之间保证可移植性,因此它定义了一组控制事务的API。Hibernate的事务接口抽象了下层的JTA或JDBC 事务(或者 ,甚至潜在的CORBA事务) 这个下层的事务策略可以使用属 性。
hibernate. connection.factory_class来设置,它可以取下列两值之一:
引用
■ net.sf.hibernate.transaction.JDBCTransactionFactory代表了直接的JDBC事务。
这种策略应该与非管理环境中的连接池一起使用,并且如果没有指定任何策略时它就是缺省
值。
■ net.sf.hibernate.transaction.JTATransactionFactory代表了JTA。对于CMT这是正
确的策略,此时连接由JTA支持。注意如果调用beginTransaction()时已经有一个JTA事务在运行,随后的工作将发生在那个事务的上下文中(否则,将会开始一个新的JTA事务)


所以我们要记住使用J2EE服务器工作时必需的两个步骤:像前面描述的那样为Hibernate事
务API设置工厂类以支持JTA,并且声明你的应用服务器特定的事务管理器的查找策略。

配置文件
如果使用hibernate开发的话,对hibernate的配置了解清楚会很有帮助。下面是找资料总结的,如有错,请不吝指出,谢谢~

下面是关于JDBC连接配置中最重要的配置:

1. hibernate.connection.driver_class : 设置连接数据库的驱动.

2. hibernate.connection.url : 设置所需连接数据库服务的URL

3. hibernate.connection.username : 连接数据库的用户名

4. hibernate.connection.password : 连接数据库的密码

5. hibernate.connection.pool_size : 设置hibernate数据库连接池的最大并发连接数

6. hibernate.dialect : 设置连接数据库使用的方言

上面配置了Hibernate数据库连接池的最大连接并发数,但是Hibernate自带的连接池仅有测试价值。并不推荐在实际的项目中使用。实际项目中可以使用c3p0连接池。所以使用c3p0连接池配置代替hibernate.connection.poo_size即可。

c3p0配置如下:

1. hibernate.c3p0.max_size : c3p0连接池的最大连接数

2. hibernate.c3p0.min_size : c3p0连接池的最小连接数

3. hibernate.c3p0.timeout : c3p0连接池连接的超时时长,单位为秒

4. hibernate.c3p0.max_statements : c3p0缓存 Statement的数量数

故,完整的配置文件内容如下(使用MySQL数据库):
Xml代码
<!DOCTYPEhibernate-configurationPUBLIC
"-//Hibernate/HibernateConfigurationDTD3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!--设置数据库连接的驱动-->
<propertyname="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<!--设置所需连接数据库服务的URLlocalhost可以改成远程IP地址onlinestore为数据库名-->
<propertyname="hibernate.connection.url">jdbc:mysql://localhost/onlinestore</property>
<!--设置连接数据库的用户名-->
<propertyname="hibernate.connection.username">root</property>
<!--设置连接数据库的密码-->
<propertyname="hibernate.connection.password">root</property>
<!--设置显示sql语句方便调试-->
<propertyname="hibernate.show_sql">true</property>
<!--c3p0连接池的最大连接数-->
<propertyname="hibernate.c3p0.max_size">20</property>
<!--c3p0连接池的最小连接数-->
<propertyname="hibernate.c3p0