Hibernate5下配置Druid連接池

先上配置文件:

<!--數據源信息 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-->

順利運行!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章