Hibernate数据库连接的设置及其配置文件的书写
Hibernate数据库连接的设置及其配置文件的书写
首先Hibernate的配置有两种情况1.管理环境中的配置。2.非管理环境中的配置。我们可以理解管理环境为它提供了自动的事务,资源管理和底层的安全结构。比如JBoss,BEAWebLogin或IBMWebsphere都实现了标准的管理环境。而非管理环境与之相反没有提供自动的事务,资源管理和底层的安全结构。比如Jetty或Tomcat这样的servlet容器。
其次我们来看具体的数据库连接
在非管理环境中,我们的hibernate要去获得JDBC连接,如果我们为每个数据库的交互都去创建一个连接就比较浪费资源了,所以我们应该使用数据库连接池。而非管理环境又没有实现连接池,我们必须实现自己的池化算法或者依赖于第三方类库例如C3P0,因为Hibernate内置了对C3P0的支持,所以我们使用该连接池。不使用Hibernate时,应用代码通常直接调用连接池来获得JDBC连接并执行SQL语句。
在管理环境中,比如,J2EE应用服务器就是典型的管理环境。虽然应用服务器通常是为了支持EJB而设计的,但即使你不使用EJB实体Bean,你仍然可以利用它提供的其它服务。Hibernate经常与会话或消息驱动EJB一起使用,EJB调用相同的HibernateAPI: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
但是我们要知道:引自《HibernateinAction》
因为Hibernate需要在这两种环境之间保证可移植性,因此它定义了一组控制事务的API。Hibernate的事务接口抽象了下层的JTA或JDBC事务(或者,甚至潜在的CORBA事务)这个下层的事务策略可以使用属性。
hibernate.connection.factory_class来设置,它可以取下列两值之一:
这种策略应该与非管理环境中的连接池一起使用,并且如果没有指定任何策略时它就是缺省
值。
■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.min_size">1</property> <!--c3p0连接池连接的超时时长如果空闲连接的空闲超过了timeout,就会删除--> <propertyname="hibernate.c3p0.timeout">1800</property> <!--c3p0缓存Statement的数量数--> <propertyname="hibernate.c3p0.max_statements">50</property> <!--sql连接方言此处为MySQL--> <propertyname="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> </session-factory> </hibernate-configuration>