先上配置文件:
<!--數據源信息 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-->
順利運行!