配置HikariCP + Spring4 + Hibernate [英] Configuration HikariCP + Spring4 + Hibernate

查看:1482
本文介绍了配置HikariCP + Spring4 + Hibernate的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想用Spring4 Java配置来配置HinkariCP数据源。
我的配置如下所示:

  @Configuration 
@EnableJpaRepositories(com.app.dao.repository )
@EnableTransactionManagement
public class DataAccessConfig {
private static final String PROPERTY_NAME_HIBERNATE_DIALECT =hibernate.dialect;
private static final String PROPERTY_NAME_HIBERNATE_FORMAT_SQL =hibernate.format_sql;
private static final String PROPERTY_NAME_HIBERNATE_SHOW_SQL =hibernate.show_sql;
private static final String PROPERTY_NAME_HIBERNATE_HBM2DDL_AUTO =hibernate.hbm2ddl.auto;
private static final String PROPERTY_NAME_H_CONNECTION_PROVIDER =hibernate.connection.provider_class;

@Autowired
private环境env;

@Bean(destroyMethod =close)
public HikariDataSource dataSource(){
HikariDataSource ds = new HikariDataSource();
ds.setMaximumPoolSize(100);
ds.setDataSourceClassName(com.mysql.jdbc.jdbc2.optional.MysqlDataSource);
ds.addDataSourceProperty(url,jdbc:mysql://127.0.0.1:3306 / mydb?useUnicode = true& characterEncoding = UTF-8& transformedBitIsBoolean = true);
ds.addDataSourceProperty(user,usr);
ds.addDataSourceProperty(password,pwd);
ds.addDataSourceProperty(cachePrepStmts,true);
ds.addDataSourceProperty(prepStmtCacheSize,250);
ds.addDataSourceProperty(prepStmtCacheSqlLimit,2048);
ds.addDataSourceProperty(useServerPrepStmts,true);
return ds;
}

$Be
@Autowired
public PlatformTransactionManager transactionManager()throws ClassNotFoundException {
return new JpaTransactionManager(entityManagerFactory()。getObject());



public LocalContainerEntityManagerFactoryBean entityManagerFactory()抛出ClassNotFoundException {
LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();

entityManagerFactoryBean.setDataSource(dataSource());
entityManagerFactoryBean.setPackagesToScan(com.app.dao.entity);
entityManagerFactoryBean.setPersistenceProviderClass(HibernatePersistenceProvider.class);
entityManagerFactoryBean.setJpaVendorAdapter(jpaVendorAdapter());
entityManagerFactoryBean.setJpaDialect(new FlushModeCommitHibernateJpaDialect(FlushMode.COMMIT));
属性jpaProperties = new Properties();
jpaProperties.put(PROPERTY_NAME_HIBERNATE_DIALECT,
env.getRequiredProperty(PROPERTY_NAME_HIBERNATE_DIALECT));
jpaProperties.put(PROPERTY_NAME_HIBERNATE_FORMAT_SQL,
env.getRequiredProperty(PROPERTY_NAME_HIBERNATE_FORMAT_SQL));
jpaProperties.put(PROPERTY_NAME_HIBERNATE_SHOW_SQL,
env.getRequiredProperty(PROPERTY_NAME_HIBERNATE_SHOW_SQL));
jpaProperties.put(PROPERTY_NAME_HIBERNATE_HBM2DDL_AUTO,
env.getRequiredProperty(PROPERTY_NAME_HIBERNATE_HBM2DDL_AUTO));
jpaProperties.put(PROPERTY_NAME_H_CONNECTION_PROVIDER,
env.getRequiredProperty(PROPERTY_NAME_H_CONNECTION_PROVIDER));
entityManagerFactoryBean.setJpaProperties(jpaProperties);
entityManagerFactoryBean.afterPropertiesSet();
返回entityManagerFactoryBean;
}

@Bean
public SharedEntityManagerBean sharedEntityManager()throws ClassNotFoundException {
SharedEntityManagerBean sharedEntityManagerBean = new SharedEntityManagerBean();
sharedEntityManagerBean.setEntityManagerFactory(entityManagerFactory()。getObject());
返回新的SharedEntityManagerBean();

@Bean
public JpaVendorAdapter jpaVendorAdapter(){
AbstractJpaVendorAdapter jpaVendorAdapter = new HibernateJpaVendorAdapter();

jpaVendorAdapter.setDatabasePlatform(env.getRequiredProperty(PROPERTY_NAME_HIBERNATE_DIALECT));
jpaVendorAdapter.setShowSql(env.getRequiredProperty(PROPERTY_NAME_HIBERNATE_SHOW_SQL,Boolean.class));

返回jpaVendorAdapter;
}

但我收到了一个异常:

 引发:java.lang.IllegalArgumentException:必须在com.zaxxer.hikari.HikariConfig.validate中指定dataSource或dataSourceClassName之一
(HikariConfig.java :683)
at com.zaxxer.hikari.HikariDataSource。< init>(HikariDataSource.java:75)
at com.zaxxer.hikari.hibernate.HikariConnectionProvider.configure(HikariConnectionProvider.java:80)
... 86 more

有人可以帮助我用Spring4配置HikariCP,Hibernate和MySql
使用的技术:Java 8,Spring 4.1.0.RELEASE,Hibernate 4.3.6.Final,HikariCP 2.0.1

解决方案

你调用 entityManagerFactoryBean.setDataSource(dataSource())的事实应该意味着你不需要调用 jpaProperties.put( PROPERTY_NAME_H_CONNECTION_PROVIDER,env.getRequiredProperty(PROPERTY_NAME_H_CONNECTION_PROVIDER))。您正在混合两种类型的初始化。源自以下内容的堆栈跟踪:

  com.zaxxer.hikari.hibernate.HikariConnectionProvider.configure(HikariConnectionProvider.java:80)

来自 jpaProperties 初始化HikariCP本身(忽略您明确设置的DataSource)。连接提供程序期望HikariCP属性已在 hibernate.properties 中设置,如文档

顺便提一下,Hibernate 4.3.6现在包含它自己的HikariCP ConnectionProvider,所以如果你使用它,它应该优先于HikariCP提供的。


I want to configure HinkariCP data source with Spring4 Java config. My config looks like:

@Configuration
@EnableJpaRepositories("com.app.dao.repository")
@EnableTransactionManagement
public class DataAccessConfig {
private static final String PROPERTY_NAME_HIBERNATE_DIALECT = "hibernate.dialect";
private static final String PROPERTY_NAME_HIBERNATE_FORMAT_SQL =    "hibernate.format_sql";
private static final String PROPERTY_NAME_HIBERNATE_SHOW_SQL = "hibernate.show_sql";
private static final String PROPERTY_NAME_HIBERNATE_HBM2DDL_AUTO = "hibernate.hbm2ddl.auto";
private static final String PROPERTY_NAME_H_CONNECTION_PROVIDER = "hibernate.connection.provider_class";

@Autowired
private Environment env;

@Bean(destroyMethod = "close")
public HikariDataSource dataSource() {
    HikariDataSource ds = new HikariDataSource();
    ds.setMaximumPoolSize(100);
    ds.setDataSourceClassName("com.mysql.jdbc.jdbc2.optional.MysqlDataSource");
    ds.addDataSourceProperty("url", "jdbc:mysql://127.0.0.1:3306/mydb?useUnicode=true&characterEncoding=UTF-8&transformedBitIsBoolean=true");
    ds.addDataSourceProperty("user", "usr");
    ds.addDataSourceProperty("password", "pwd");
    ds.addDataSourceProperty("cachePrepStmts", true);
    ds.addDataSourceProperty("prepStmtCacheSize", 250);
    ds.addDataSourceProperty("prepStmtCacheSqlLimit", 2048);
    ds.addDataSourceProperty("useServerPrepStmts", true);
    return ds;
}

@Bean
@Autowired
public PlatformTransactionManager transactionManager() throws ClassNotFoundException {
    return new JpaTransactionManager(entityManagerFactory().getObject());
}

@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() throws ClassNotFoundException {
    LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();

    entityManagerFactoryBean.setDataSource(dataSource());
    entityManagerFactoryBean.setPackagesToScan("com.app.dao.entity");
    entityManagerFactoryBean.setPersistenceProviderClass(HibernatePersistenceProvider.class);
    entityManagerFactoryBean.setJpaVendorAdapter(jpaVendorAdapter());
    entityManagerFactoryBean.setJpaDialect(new FlushModeCommitHibernateJpaDialect(FlushMode.COMMIT));
    Properties jpaProperties = new Properties();
    jpaProperties.put(PROPERTY_NAME_HIBERNATE_DIALECT,
            env.getRequiredProperty(PROPERTY_NAME_HIBERNATE_DIALECT));
    jpaProperties.put(PROPERTY_NAME_HIBERNATE_FORMAT_SQL,
            env.getRequiredProperty(PROPERTY_NAME_HIBERNATE_FORMAT_SQL));
    jpaProperties.put(PROPERTY_NAME_HIBERNATE_SHOW_SQL,
            env.getRequiredProperty(PROPERTY_NAME_HIBERNATE_SHOW_SQL));
    jpaProperties.put(PROPERTY_NAME_HIBERNATE_HBM2DDL_AUTO,
            env.getRequiredProperty(PROPERTY_NAME_HIBERNATE_HBM2DDL_AUTO));
    jpaProperties.put(PROPERTY_NAME_H_CONNECTION_PROVIDER,
            env.getRequiredProperty(PROPERTY_NAME_H_CONNECTION_PROVIDER));
    entityManagerFactoryBean.setJpaProperties(jpaProperties);
    entityManagerFactoryBean.afterPropertiesSet();
    return entityManagerFactoryBean;
}

@Bean
public SharedEntityManagerBean sharedEntityManager() throws ClassNotFoundException {
    SharedEntityManagerBean sharedEntityManagerBean = new SharedEntityManagerBean();
    sharedEntityManagerBean.setEntityManagerFactory(entityManagerFactory().getObject());
    return new SharedEntityManagerBean();
}
@Bean
public JpaVendorAdapter jpaVendorAdapter() {
    AbstractJpaVendorAdapter jpaVendorAdapter = new HibernateJpaVendorAdapter();

    jpaVendorAdapter.setDatabasePlatform(env.getRequiredProperty(PROPERTY_NAME_HIBERNATE_DIALECT));
    jpaVendorAdapter.setShowSql(env.getRequiredProperty(PROPERTY_NAME_HIBERNATE_SHOW_SQL, Boolean.class));

    return jpaVendorAdapter;
}

but i get an exception:

Caused by: java.lang.IllegalArgumentException: one of either dataSource or dataSourceClassName must be specified
at com.zaxxer.hikari.HikariConfig.validate(HikariConfig.java:683)
at com.zaxxer.hikari.HikariDataSource.<init>(HikariDataSource.java:75)
at com.zaxxer.hikari.hibernate.HikariConnectionProvider.configure(HikariConnectionProvider.java:80)
... 86 more

Can someone help my to configure HikariCP with Spring4, Hibernate and MySql Tech used: Java 8, Spring 4.1.0.RELEASE, Hibernate 4.3.6.Final, HikariCP 2.0.1

解决方案

The fact that you are calling entityManagerFactoryBean.setDataSource(dataSource()) should mean that you do not need to call jpaProperties.put(PROPERTY_NAME_H_CONNECTION_PROVIDER, env.getRequiredProperty(PROPERTY_NAME_H_CONNECTION_PROVIDER)). You are mixing two styles of initialization. The stacktrace that originates with:

com.zaxxer.hikari.hibernate.HikariConnectionProvider.configure(HikariConnectionProvider.java:80)

is coming from the jpaProperties initializing HikariCP itself (ignoring the DataSource that you set explicitly). The connection provider expects that HikariCP properties have been set in hibernate.properties, as documented here.

By the way, Hibernate 4.3.6 now includes it own HikariCP ConnectionProvider, so if you use that it should be in preference to the one provided by HikariCP.

这篇关于配置HikariCP + Spring4 + Hibernate的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆