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\">
2.C3P0连接配置
PUBLIC \"-//Hibernate/Hibernate Configuration DTD//EN\"
\"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd\">
3.proxool连接池
(1) 先写proxool的配置文件,文件名:proxool.xml(一般放在与hibernate.cfg.xml文件在同一个目录中)本例配置的是MYSQL数据库,数据库的名字为schoolproject
jdbc:mysql://localhost:3306/schoolproject?useUnicode=true&characterEncoding=UTF8
PUBLIC \"-//Hibernate/Hibernate Configuration DTD//EN\"
\"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd\">
(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' 而 注:其中${datasource.url}等为配置文件中的配置值 实现代码如下: 三、 Hibernate 与 Spring 多数据源的配置(连接池配置有误,建议参考第二部分说明) Spring2.0.1以后的版本已经支持配置多数据源,并且可以在运行的时候动态加载不同的数据源。通过继承AbstractRoutingDataSource就可以实现多数据源的动态转换。目前做的项目就是需要访问12个数据源,每个数据源的表结构都是相同的,所以要求数据源的变动对于编码人员来说是透明,也就是说同样SQL语句在不同的环境下操作的数据库是不一样的。具体的配置如下: 一、首先需要写一个静态的键值对照类: 这个类主要在使用的时候当作获得数据源的标志使用。 二、建立一个获得和设置上下文的类: 这个主要负责设置上下文环境和获得上下文环境。 三、建立动态数据源类,这个类必须继承AbstractRoutingDataSource: 这个类实现了determineCurrentLookupKey方法,该方法返回一个Object,一般是返回字符串,也可以是枚举类型。该方法中直接使用了 CustomerContextHolder.getCustomerType()方法获得上下文环境并直接返回。 四、编写spring的配置文件配置数据源 在这个配置中可以看到首先有个parentDataSource,这个主要配置一些数据源的公用信息,项目中都是链接DB2数据库;adminDataSource和yxhDataSource是根据不同需要配置的个性化信息,但都必须加parent属性,值为parentDataSource。这样就配置好了2个数据源信息。当然如果链接的多数据源是不同类型的两个数据库,那么parentDataSource就可以不要了,直接配置两个不同的数据源链接就可以了。 五、编写spring配置文件配置多数据源映射关系 在这个配置中第一个property属性配置目标数据源,