Hibernate5下配置Druid连接池

来源:互联网 发布:php rsa加密 编辑:程序博客网 时间:2024/06/06 08:35

先上配置文件:

<!--数据源信息 for Druid-->        <property name="driverClassName">com.mysql.jdbc.Driver</property>        <property name="url">jdbc:mysql:///hibernate?useSSL=false</property>        <property name="username">root</property>        <property name="password">root</property>        <property name="filter">stat,log4j</property>        <property name="initialSize">5</property>        <property name="maxActive">100</property>        <property name="maxWait">60000</property>        <property name="timeBetweenEvictionRunsMillis">60000</property>        <property name="minEvictableIdleTimeMillis">300000</property>        <property name="validationQuery">SELECT 1</property>        <property name="testWhileIdle">true</property>        <property name="testOnBorrow">false</property>        <property name="testOnReturn">false</property>        <property name="poolPreparedStatements">false</property>        <property name="maxPoolPreparedStatementPerConnectionSize">200</property>        <!--end-->        <property name="dialect">            org.hibernate.dialect.MySQL57Dialect        </property>        <property name="hbm2ddl.auto">update</property>        <property name="show_sql">true</property>        <property name="format_sql">true</property>        <!-- #hibernate.connection.provider_class org.hibernate.connection.C3P0ConnectionProvider -->        <property name="hibernate.connection.provider_class">            <!--org.hibernate.connection.C3P0ConnectionProvider-->            com.alibaba.druid.support.hibernate.DruidConnectionProvider        </property>        <property name="hibernate.current_session_context_class">thread</property>

以下是记录折腾的过程:
今天用Hibernate5配置Druid连接池,直接从网上复制粘贴别人的配置,发现报错:
网上的配置信息:

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-configuration PUBLIC        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"><hibernate-configuration>    <session-factory>        <!-- 数据源信息 for hibernate -->        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>        <property name="hibernate.connection.url">jdbc:mysql:///bookstore?useSSL=false</property>        <property name="hibernate.connection.username">root</property>        <property name="hibernate.connection.password">root</property>        <property name="dialect">            org.hibernate.dialect.MySQLDialect        </property>        <property name="hbm2ddl.auto">update</property>        <property name="show_sql">true</property>        <property name="format_sql">true</property>        <!-- #hibernate.connection.provider_class -->        <property name="hibernate.connection.provider_class">            com.alibaba.druid.support.hibernate.DruidConnectionProvider        </property>        <property name="hibernate.current_session_context_class">thread</property>        <mapping resource="com/fly/domain/books.hbm.xml" />    </session-factory></hibernate-configuration>

错误信息:

java.lang.NullPointerException    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:311)    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)    at com.alibaba.druid.util.JdbcUtils.createDriver(JdbcUtils.java:581)    at com.alibaba.druid.pool.DruidDataSource.init(DruidDataSource.java:807)    at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:1197)    at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:1193)    at com.alibaba.druid.support.hibernate.DruidConnectionProvider.getConnection(DruidConnectionProvider.java:52)    at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcEnvironmentInitiator.java:180)    at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:68)

开启debug:
发现DataSource中的参数全部为空!!!看来,Hibernate中的配置信息并未能配置进DataSource中!!!
下断点,跟到这个对象AbstractServiceRegistryImpl 中有这三句

//注入依赖(搞不懂干啥用的)serviceBinding.getLifecycleOwner().injectDependencies(serviceBinding);//配置(关键,DataSource的参数是在这里是配置,跟进)serviceBinding.getLifecycleOwner().configureService(serviceBinding);//启动serviceBinding.getLifecycleOwner().startService(serviceBinding);

跟进configureService(serviceBinding);后,看到了这个对象:
DruidConnectionProvider(com.alibaba.druid.support.hibernate),这下应该找对地方了,他执行了:
DruidDataSourceFactory.config(this.dataSource, configurationValues);
其中,configurationValues是一个Map,存放着Hibernate.cfg.xml中的“属性名—属性值”信息,dataSource就是我们喜闻乐见的DruidDataSource了。
继续跟进去,不出所料,全是赋值过程:

value = (String)properties.get("driverClassName");        if (value != null) {            dataSource.setDriverClassName(value);        }        value = (String)properties.get("maxActive");        if (value != null) {            dataSource.setMaxActive(Integer.parseInt(value));        }        value = (String)properties.get("maxIdle");        if (value != null) {            dataSource.setMaxIdle(Integer.parseInt(value));        }        …………

问题来了,这里的key似乎和我们配置的key不一致!
于是修改Hibernate配置:

<!--数据源信息 for Druid--><property name="driverClassName">com.mysql.jdbc.Driver</property><property name="url">jdbc:mysql:///bookstore?useSSL=false</property><property name="username">root</property><property name="password">root</property><property name="filter">stat</property><property name="initialSize">5</property><property name="maxActive">100</property><property name="maxWait">60000</property><property name="timeBetweenEvictionRunsMillis">60000</property><property name="minEvictableIdleTimeMillis">300000</property><property name="validationQuery">SELECT 1</property><property name="testWhileIdle">true</property><property name="testOnBorrow">false</property><property name="testOnReturn">false</property><property name="poolPreparedStatements">false</property><property name="maxPoolPreparedStatementPerConnectionSize">200</property><!--end-->

顺利运行!