先上配置文件:
<!--数据源信息 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-->
顺利运行!