您好,欢迎来到意榕旅游网。
搜索
您的当前位置:首页Hibernate的连接池和数据源配置

Hibernate的连接池和数据源配置

来源:意榕旅游网


Hibernate的三种连接池设置C3P0、Proxool和DBCP

一、 Hibernate连接池配置:

Hibernate支持第三方的连接池,官方推荐的连接池是C3P0,Proxool,以及DBCP。在配置连接池时需要注意的有三点:

一、Apche的DBCP在Hibernate2中受支持,但在Hibernate3中已经不再推荐使用,官方的解释是这个连接池存在缺陷。如果你因为某种原因需要在Hibernate3中使用DBCP,建议采用JNDI方式。

二、默认情况下(即没有配置连接池的情况下),Hibernate会采用内建的连接池。但这个连接池性能不佳,且存在诸多BUG(笔者就曾在Mysql环境下被八小时连接悬空问题困扰过),因此官方也只是建议仅在开发环境下使用。

三、Hibernate2和Hibernate3的命名空间有所变化。例如,配置C3P0时的provider_class有Hibernate2环境下使用net.sf.hibernate.connection.C3P0ConnectionProvider,在Hibernate3环境下使用org.hibernate.connection.C3P0ConnectionProvider。 下面是Hibernate环境下几种常见的连接池配置:

1.Hibernate默认连接池

PUBLIC \"-//Hibernate/Hibernate Configuration DTD//EN\"

\"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd\">

com.mysql.jdbc.Driver

jdbc:mysql://localhost:3306/schoolproject

true

UTF-8

root

true

org.hibernate.dialect.MySQLDialect

2.C3P0连接配置

PUBLIC \"-//Hibernate/Hibernate Configuration DTD//EN\"

\"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd\">

com.mysql.jdbc.Driver

jdbc:mysql://localhost:3306/schoolproject

true

UTF-8

root

org.hibernate.connection.C3P0ConnectionProvider

20 5 120

100 120 2

true

org.hibernate.dialect.MySQLDialect

3.proxool连接池

(1) 先写proxool的配置文件,文件名:proxool.xml(一般放在与hibernate.cfg.xml文件在同一个目录中)本例配置的是MYSQL数据库,数据库的名字为schoolproject

DBPool

jdbc:mysql://localhost:3306/schoolproject?useUnicode=true&characterEncoding=UTF8

com.mysql.jdbc.Driver

90000

20

5

100

10

(2)配置hibernate.cfg.xml文件

PUBLIC \"-//Hibernate/Hibernate Configuration DTD//EN\"

\"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd\">

org.hibernate.connection.ProxoolConnectionProvider

DBPool proxoolconf.xml true

org.hibernate.dialect.MySQLDialect

(1) hibernate.connection.provider_class定义Hibernate的连接加载类,这里Proxool连接池是用这个,不同的连接池有不同的加载类,可以查阅Hibernate文档获取相关信息 (2) hibernate.proxool.pool_alias这里就是用我们上面提到的连接池的别名

(3) hibernate.proxool.xml是向Hibernate声明连接池的配置文件位置,可以用相对或绝对路径,用相对路径时要注意一定在要Path范围内!不然会抛出异常。 (4) dialect是声明SQL语句的方言

(5) show_sql定义是否显示Hibernate生成的SQL语言,一般在调试阶段设为true,完成后再改成false,这样有利于调试。 (6) 资源文件映射

4.JNDI连接池,数据源已经由应用服务配置好(如Web服务器),Hibernate需要做的只是通过JNDI名查找到此数据源。应用服务器将连接池对外显示为JNDI绑定数据源,它是javax.jdbc.Datasource类的一个实例。只要配置一个Hibernate文件,如:

hibernate.connection.datasource=java:/comp/env/jdbc/schoolproject //JNDI名 hibernate.transaction.factory_class = org.hibernate.transaction.JTATransactionFactory

hibernate.transaction.manager_loopup_class =

org.hibernate.transaction.JBossTransactionManagerLookup hibernate.dialect=org.hibernate.dialect.MySQLDialect

二、 spring+hibernate的c0p3连接池配置

直接配置applicationContext.xml文件,配置内容参考如下:

在配置的时候 cp30的属性的名字必须是 ''driverClass','jdbcUrl','user','password'

的名字也必须是“properties”,另外cp30配置文件的属性名也都是诸如:\"c3p0.minPoolSize\"、\"hc3p0.maxPoolSize\"等等.

注:其中${datasource.url}等为配置文件中的配置值

实现代码如下:

classpath:init.properties

${datasource.driverClassName}

${datasource.url}

${hibernate.c3p0.minPoolSize} ${hibernate.c3p0.maxPoolSize} ${hibernate.c3p0.timeout}

${hibernate.c3p0.max_statement} true ${datasource.username} ${datasource.password}

com/cs2c/oa2/pojo/Testfile.hbm.xml

${hibernate.cglib.use_reflection_optimizer} key=\"hibernate.connection.provider_class\">org.hibernate.connection.C3P0ConnectionProvider

${hibernate.dialect}

${hibernate.default_schema} ${hibernate.show_sql}

三、 Hibernate 与 Spring 多数据源的配置(连接池配置有误,建议参考第二部分说明)

Spring2.0.1以后的版本已经支持配置多数据源,并且可以在运行的时候动态加载不同的数据源。通过继承AbstractRoutingDataSource就可以实现多数据源的动态转换。目前做的项目就是需要访问12个数据源,每个数据源的表结构都是相同的,所以要求数据源的变动对于编码人员来说是透明,也就是说同样SQL语句在不同的环境下操作的数据库是不一样的。具体的配置如下: 一、首先需要写一个静态的键值对照类:

这个类主要在使用的时候当作获得数据源的标志使用。

二、建立一个获得和设置上下文的类:

这个主要负责设置上下文环境和获得上下文环境。

三、建立动态数据源类,这个类必须继承AbstractRoutingDataSource:

这个类实现了determineCurrentLookupKey方法,该方法返回一个Object,一般是返回字符串,也可以是枚举类型。该方法中直接使用了

CustomerContextHolder.getCustomerType()方法获得上下文环境并直接返回。

四、编写spring的配置文件配置数据源

在这个配置中可以看到首先有个parentDataSource,这个主要配置一些数据源的公用信息,项目中都是链接DB2数据库;adminDataSource和yxhDataSource是根据不同需要配置的个性化信息,但都必须加parent属性,值为parentDataSource。这样就配置好了2个数据源信息。当然如果链接的多数据源是不同类型的两个数据库,那么parentDataSource就可以不要了,直接配置两个不同的数据源链接就可以了。

五、编写spring配置文件配置多数据源映射关系

在这个配置中第一个property属性配置目标数据源,

中的key-type必须要和静态键值对照类DataSourceMap中的值的类型相同;中key的值必须要和静态键值对照类中的值相同,如果有多个值,可以配置多个标签。第二个property属性配置默认的数据源。

六、配置hibernate。

Hibernate的配置和普通的hibernate、spring结合的配置一样

关于dao的代码这里就省略了。

七、配置结束,可以使用了。

在项目中对于编码人员对多数据源的切换可以做成透明的,操作同样的dao,就可以访问不同的数据库了。

Spring+Hibernate 配置和使用c3p0和proxool连接池

其实原理都是一样 就是用一个继承了实现javax.sql.DataSource的DataSource类在Spring中用bean来组装,管理 来配置其属性 提供给sessionFactory来组装API上可能属性没有写出来 但是可以看到方法 要想真正了解 还是要看源代码中的详细属性 比如在cp30中这个具体的DataSource是

com.mchange.v2.c3p0.ComboPooledDataSource 他的源代码中有以下片段: .............

public String getDriverClass() ...{ return dmds.getDriverClass(); }

public void setDriverClass( String driverClass ) throws PropertyVetoException ...{

dmds.setDriverClass( driverClass );

// System.err.println(\"setting driverClass: \" + driverClass); }

public String getJdbcUrl() ...{

// System.err.println(\"getting jdbcUrl: \" + dmds.getJdbcUrl()); return dmds.getJdbcUrl(); }

public void setJdbcUrl( String jdbcUrl ) ...{

dmds.setJdbcUrl( jdbcUrl ); this.resetPoolManager( false );

// System.err.println(\"setting jdbcUrl: \" + jdbcUrl + \" [dmds@\" + C3P0ImplUtils.identityToken( dmds ) + \"]\"); // if (jdbcUrl == null)

// new Exception(\"*** NULL SETTER ***\").printStackTrace(); }

public Properties getProperties() ...{

//System.err.println(\"getting properties: \" + dmds.getProperties()); return dmds.getProperties(); }

public void setProperties( Properties properties ) ...{

//System.err.println(\"setting properties: \" + properties); dmds.setProperties( properties ); this.resetPoolManager(false);

}

// DriverManagerDataSource \"virtual properties\" based on properties public String getUser() ...{ return dmds.getUser(); } public void setUser( String user ) ...{

dmds.setUser( user ); this.resetPoolManager( false ); }

public String getPassword() ...{ return dmds.getPassword(); }

public void setPassword( String password ) ...{

dmds.setPassword( password ); this.resetPoolManager( false ); ................

里面有个property属性的get和set方法

因此在bean中可以对其进行配置

组装到sessionFactory中之后 还可以通过hibernateProperties对Hibernate进行一些配置

一 c3p0

beas-config.xml

class=\"com.mchange.v2.c3p0.ComboPooledDataSource\" destroy-method=\"close\">

com.mysql.jdbc.Driver

jdbc:mysql://localhost:3306/shtest

2 200 1000 100

100 20

root

password

class=\"org.springframework.orm.hibernate3.LocalSessionFactoryBean\" destroy-method=\"close\">

/com/ergal/hibernate/User.hbm.xml

key=\"hibernate.dialect\">org.hibernate.dialect.MySQLDialect true key=\"hibernate.current_session_context_class\">thread

com.ergal.hibernate.IUserDao

id=\"userDaoProxy\"

class=\"org.springframework.transaction.interceptor.TransactionProxyFactoryBean\"

id=\"transactionManager\"

class=\"org.springframework.orm.hibernate3.HibernateTransactionManager\">

PROPAGATION_REQUIRED

这么一来在修改数据库连接的部分就变的非常简单 修改后也不用修改除sessionFactory的组装外的其他代码

二 proxool

这个可以通过对hibernateProperties的属性配置来设置

beans-config.xml

com/meagle/bo/Order.hbm.xml

com/meagle/bo/OrderLineItem.hbm.xml

key=\"hibernate.dialect\">net.sf.hibernate.dialect.MySQLDialect true key=\"hibernate.cglib.use_reflection_optimizer\">true key=\"hibernate.proxool.xml\">C:/....../WebContent/WEB-INF/proxool.xml spring

然后单独写一个proxool.xml

id=\"mySessionFactory\"

class=\"org.springframework.orm.hibernate.LocalSessionFactoryBean\">

spring

jdbc:mysql://localhost:3306/shtest com.mysql.jdbc.Driver

2 20

180000

values(current TimeStamp) 1m,15m,1d

INFO

Connection is closed,SQLSTATE=08003,Error opening socket. SQLSTATE=08S01,SQLSTATE=08S01

org.logicalcobwebs.proxool.FatalRuntimeException false

四、 C3P0连接池详细配置

3

30

1000

false

Test

false

100

null

false

60

3

60

15

100

3

root

password

select id from test where id=1

300

false

true

root

false

con_test 30000 30 10 30 25 10 0

200

300

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- yrrf.cn 版权所有

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务