Hibernate 和 MySql 的 Hikaricp:必须指定 dataSource 或 dataSourceClassName 之一
Hikaricp with Hibernate and MySql: one of either dataSource or dataSourceClassName must be specified
我正在与:
- Spring 4.1.4.RELEASE
- 休眠 4.3.8.FINAL
- HikariCP 2.3.2
- MySQL 5.6.22 自制软件
HikariCP 页面有两个有趣的 documentation/blog 关于 MySQL 和 Hibernate
阅读以下有关 MySQL 的教程后:
我有以下关于数据源的配置:
Alpha(最好推荐,第一次尝试)
@Bean(name="dataSource", destroyMethod="close")
public DataSource dataSourceDevelopment() throws Exception{
HikariConfig hc = new HikariConfig();
hc.setDataSourceClassName("com.mysql.jdbc.jdbc2.optional.MysqlDataSource");
//hc.setDriverClassName("com.mysql.jdbc.Driver");
//hc.setJdbcUrl("jdbc:mysql://localhost:3306/manolodb_01");
hc.setUsername("user");
hc.setPassword("password");
hc.setPoolName("hikaricp-manolodb_01-pool");
hc.addDataSourceProperty("databaseName", "manolodb_01");
hc.addDataSourceProperty("cachePrepStmts", "true");
hc.addDataSourceProperty("prepStmtCacheSize", "250");
hc.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
hc.addDataSourceProperty("useServerPrepStmts", "true");
HikariDataSource hds = new HikariDataSource(hc);
return hds;
}
阅读以下有关 Hibernate 的教程后:
我有以下配置:
@Bean
public LocalSessionFactoryBean sessionFactory(DataSource dataSource){
LocalSessionFactoryBean localSessionFactoryBean = new LocalSessionFactoryBean();
localSessionFactoryBean.setDataSource(dataSource);
localSessionFactoryBean.setPackagesToScan("com.manuel.jordan.domain");
Properties hibernateProperties = new Properties();
hibernateProperties.setProperty("hibernate.dialect", environment.getRequiredProperty("database.hibernate.dialect", String.class));
hibernateProperties.setProperty("hibernate.connection.provider_class","com.zaxxer.hikari.hibernate.HikariConnectionProvider");
hibernateProperties.setProperty("hibernate.cache.provider_class","org.hibernate.cache.NoCacheProvider");
hibernateProperties.setProperty("hibernate.show_sql","true");
hibernateProperties.setProperty("hibernate.format_sql","true");
hibernateProperties.setProperty("hibernate.use_sql_comments","true");
hibernateProperties.setProperty("hibernate.max_fetch_depth","30");
hibernateProperties.setProperty("hibernate.default_batch_fetch_size","30");
hibernateProperties.setProperty("hibernate.jdbc.batch_size","30");//N + 1
hibernateProperties.setProperty("hibernate.order_updates", "true");
hibernateProperties.setProperty("org.hibernate.SQL","true");
hibernateProperties.setProperty("org.hibernate.type","true");
localSessionFactoryBean.setHibernateProperties(hibernateProperties);
return localSessionFactoryBean;
}
观察 我正在使用:
hibernateProperties.setProperty("hibernate.connection.provider_class","com.zaxxer.hikari.hibernate.HikariConnectionProvider");
但我总是收到:
Caused by: java.lang.IllegalArgumentException: one of either dataSource or dataSourceClassName must be specified
at com.zaxxer.hikari.AbstractHikariConfig.validate(AbstractHikariConfig.java:747)
at com.zaxxer.hikari.HikariDataSource.<init>(HikariDataSource.java:73)
at com.zaxxer.hikari.hibernate.HikariConnectionProvider.configure(HikariConnectionProvider.java:80)
... 54 more
即使使用 Beta
@Bean(name="dataSource", destroyMethod="close")
public DataSource dataSourceDevelopment() throws Exception{
HikariConfig hc = new HikariConfig();
//hc.setDataSourceClassName("com.mysql.jdbc.jdbc2.optional.MysqlDataSource");
hc.setDriverClassName("com.mysql.jdbc.Driver");
hc.setJdbcUrl("jdbc:mysql://localhost:3306/manolodb_01");
hc.setUsername("user");
hc.setPassword("password");
hc.setPoolName("hikaricp-manolodb_01-pool");
hc.addDataSourceProperty("databaseName", "manolodb_01");
hc.addDataSourceProperty("cachePrepStmts", "true");
hc.addDataSourceProperty("prepStmtCacheSize", "250");
hc.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
hc.addDataSourceProperty("useServerPrepStmts", "true");
HikariDataSource hds = new HikariDataSource(hc);
return hds;
}
我收到同样的错误信息:
如果我发表评论,我确实意识到了
hibernateProperties.setProperty("hibernate.connection.provider_class","com.zaxxer.hikari.hibernate.HikariConnectionProvider");
我没有错误。为什么会出现这种行为?
我认为我的配置是正确的,因为第二个 link 说:
In order to use the HikariConnectionProvider in Hibernate 4.x add the
following property to your hibernate.properties configuration file:
hibernate.connection.provider_class=com.zaxxer.hikari.hibernate.HikariConnectionProvider
这就是我所拥有的……
我不想在 hibernate.properties 中直接包含 HikariCP 配置属性,第二个 link 也提供了。
您有 2 个选项来配置 DataSource
以与休眠一起使用,或者您在 spring 中完全配置 DataSource
并将其注入 dataSource
属性 的 LocalSessionFactoryBean
或者您使用休眠属性来配置 DataSource
在这种情况下您必须设置 hibernate.connection.provider_class
。
我正在与:
- Spring 4.1.4.RELEASE
- 休眠 4.3.8.FINAL
- HikariCP 2.3.2
- MySQL 5.6.22 自制软件
HikariCP 页面有两个有趣的 documentation/blog 关于 MySQL 和 Hibernate
阅读以下有关 MySQL 的教程后:
我有以下关于数据源的配置:
Alpha(最好推荐,第一次尝试)
@Bean(name="dataSource", destroyMethod="close")
public DataSource dataSourceDevelopment() throws Exception{
HikariConfig hc = new HikariConfig();
hc.setDataSourceClassName("com.mysql.jdbc.jdbc2.optional.MysqlDataSource");
//hc.setDriverClassName("com.mysql.jdbc.Driver");
//hc.setJdbcUrl("jdbc:mysql://localhost:3306/manolodb_01");
hc.setUsername("user");
hc.setPassword("password");
hc.setPoolName("hikaricp-manolodb_01-pool");
hc.addDataSourceProperty("databaseName", "manolodb_01");
hc.addDataSourceProperty("cachePrepStmts", "true");
hc.addDataSourceProperty("prepStmtCacheSize", "250");
hc.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
hc.addDataSourceProperty("useServerPrepStmts", "true");
HikariDataSource hds = new HikariDataSource(hc);
return hds;
}
阅读以下有关 Hibernate 的教程后:
我有以下配置:
@Bean
public LocalSessionFactoryBean sessionFactory(DataSource dataSource){
LocalSessionFactoryBean localSessionFactoryBean = new LocalSessionFactoryBean();
localSessionFactoryBean.setDataSource(dataSource);
localSessionFactoryBean.setPackagesToScan("com.manuel.jordan.domain");
Properties hibernateProperties = new Properties();
hibernateProperties.setProperty("hibernate.dialect", environment.getRequiredProperty("database.hibernate.dialect", String.class));
hibernateProperties.setProperty("hibernate.connection.provider_class","com.zaxxer.hikari.hibernate.HikariConnectionProvider");
hibernateProperties.setProperty("hibernate.cache.provider_class","org.hibernate.cache.NoCacheProvider");
hibernateProperties.setProperty("hibernate.show_sql","true");
hibernateProperties.setProperty("hibernate.format_sql","true");
hibernateProperties.setProperty("hibernate.use_sql_comments","true");
hibernateProperties.setProperty("hibernate.max_fetch_depth","30");
hibernateProperties.setProperty("hibernate.default_batch_fetch_size","30");
hibernateProperties.setProperty("hibernate.jdbc.batch_size","30");//N + 1
hibernateProperties.setProperty("hibernate.order_updates", "true");
hibernateProperties.setProperty("org.hibernate.SQL","true");
hibernateProperties.setProperty("org.hibernate.type","true");
localSessionFactoryBean.setHibernateProperties(hibernateProperties);
return localSessionFactoryBean;
}
观察 我正在使用:
hibernateProperties.setProperty("hibernate.connection.provider_class","com.zaxxer.hikari.hibernate.HikariConnectionProvider");
但我总是收到:
Caused by: java.lang.IllegalArgumentException: one of either dataSource or dataSourceClassName must be specified
at com.zaxxer.hikari.AbstractHikariConfig.validate(AbstractHikariConfig.java:747)
at com.zaxxer.hikari.HikariDataSource.<init>(HikariDataSource.java:73)
at com.zaxxer.hikari.hibernate.HikariConnectionProvider.configure(HikariConnectionProvider.java:80)
... 54 more
即使使用 Beta
@Bean(name="dataSource", destroyMethod="close")
public DataSource dataSourceDevelopment() throws Exception{
HikariConfig hc = new HikariConfig();
//hc.setDataSourceClassName("com.mysql.jdbc.jdbc2.optional.MysqlDataSource");
hc.setDriverClassName("com.mysql.jdbc.Driver");
hc.setJdbcUrl("jdbc:mysql://localhost:3306/manolodb_01");
hc.setUsername("user");
hc.setPassword("password");
hc.setPoolName("hikaricp-manolodb_01-pool");
hc.addDataSourceProperty("databaseName", "manolodb_01");
hc.addDataSourceProperty("cachePrepStmts", "true");
hc.addDataSourceProperty("prepStmtCacheSize", "250");
hc.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
hc.addDataSourceProperty("useServerPrepStmts", "true");
HikariDataSource hds = new HikariDataSource(hc);
return hds;
}
我收到同样的错误信息:
如果我发表评论,我确实意识到了
hibernateProperties.setProperty("hibernate.connection.provider_class","com.zaxxer.hikari.hibernate.HikariConnectionProvider");
我没有错误。为什么会出现这种行为?
我认为我的配置是正确的,因为第二个 link 说:
In order to use the HikariConnectionProvider in Hibernate 4.x add the
following property to your hibernate.properties configuration file:
hibernate.connection.provider_class=com.zaxxer.hikari.hibernate.HikariConnectionProvider
这就是我所拥有的……
我不想在 hibernate.properties 中直接包含 HikariCP 配置属性,第二个 link 也提供了。
您有 2 个选项来配置 DataSource
以与休眠一起使用,或者您在 spring 中完全配置 DataSource
并将其注入 dataSource
属性 的 LocalSessionFactoryBean
或者您使用休眠属性来配置 DataSource
在这种情况下您必须设置 hibernate.connection.provider_class
。