Как настроить Hikari CP для HSQL в контексте Spring(4)?

Я хочу использовать Hikari CP в моем контексте Spring 4.0.3, но, похоже, я что-то упускаю.

Моя конфигурация bean-компонента выглядит так:

<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource">
   <constructor-arg>
     <bean class="com.zaxxer.hikari.HikariConfig">
       <constructor-arg>
         <props>
           <prop key="dataSource.driverClassName">${database.driver}</prop>
           <prop key="dataSource.jdbcUrl">${database.database.jdbc.url}</prop>
           <prop key="dataSource.port">${database.port}</prop>
           <prop key="dataSource.databaseName">${database.name}</prop>
           <prop key="dataSource.user">${database.user}</prop>
           <prop key="dataSource.password">${database.password}</prop>
         </props>
       </constructor-arg>

     </bean>
   </constructor-arg>
</bean>

но я получаю исключение:

Caused by: java.lang.IllegalArgumentException: one of either dataSource or dataSourceClassName must be specified
    at com.zaxxer.hikari.HikariConfig.validate(HikariConfig.java:655)
    at com.zaxxer.hikari.HikariDataSource.<init>(HikariDataSource.java:66)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:408)
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:148)
    ... 15 more

Я пытался настроить dataSourceClassName с помощью HSQL org.hsqldb. jdbc.JDBCDataSource

туда:

<prop key="dataSourceClassName">org.hsqldb.jdbc.JDBCDataSource</prop>

тоже так:

<prop key="dataSource.ClassName">org.hsqldb.jdbc.JDBCDataSource</prop>

оба раза я получил следующее исключение:

Caused by: java.lang.RuntimeException: java.beans.IntrospectionException: Method not found: setPort
    at com.zaxxer.hikari.util.PropertyBeanSetter.setProperty(PropertyBeanSetter.java:109)
    at com.zaxxer.hikari.util.PropertyBeanSetter.setTargetFromProperties(PropertyBeanSetter.java:61)
    at com.zaxxer.hikari.pool.HikariPool.initializeDataSource(HikariPool.java:497)
    ... 23 more
Caused by: java.beans.IntrospectionException: Method not found: setPort
    at java.beans.PropertyDescriptor.<init>(PropertyDescriptor.java:110)
    at com.zaxxer.hikari.util.PropertyBeanSetter.setProperty(PropertyBeanSetter.java:97)
    ... 25 more

Может ли кто-нибудь показать мне рабочую конфигурацию компонента Hikari CP Spring 4, которая работает с базой данных HSQL?

Меня не интересуют MySql, PG и т. д., потому что я знаю, как заставить их работать. Но я не могу сделать это с помощью HSQL.

Спасибо,

Используемая технология: Java8, Spring 4.0.3, HSQL 2.3.2.


person cav    schedule 29.04.2014    source источник


Ответы (4)


один из способов выполнить работу — предоставить экземпляр объекта DataSource:

<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource">
  <constructor-arg>
    <bean class="com.zaxxer.hikari.HikariConfig">
      <property name="dataSource">
        <bean class="org.hsqldb.jdbc.JDBCDataSource">
          <property name="url" value="${database.database.jdbc.url}"/>
          <property name="databaseName" value="${database.name}"/>
          <property name="user" value="${database.user}"/>
          <property name="password" value="${database.password}"/>
        </bean>
      </property>
    </bean>
  </constructor-arg>
</bean>

наверняка есть и другие решения.

ХТХ,

person Chris    schedule 29.04.2014
comment
не уверен, что произойдет, если вы дублируете databaseName, используя его вместе с JDBC url (который уже содержит ссылку на базу данных). - person Giovanni Toraldo; 28.06.2015

Некоторым из ваших свойств в вашем примере не нужен префикс «источник данных», если вы используете класс драйвера.

<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource">
   <constructor-arg>
     <bean class="com.zaxxer.hikari.HikariConfig">
        <constructor-arg>
           <props>
              <prop key="driverClassName">${database.driver}</prop>
              <prop key="jdbcUrl">${database.database.jdbc.url}</prop>
              <prop key="username">${database.user}</prop>
              <prop key="password">${database.password}</prop>
          </props>
       </constructor-arg>
     </bean>
   </constructor-arg>
</bean>

А port и databaseName можно включить в jdbcUrl.

person brettw    schedule 30.04.2014

Для чистого решения Java-config я использовал следующее (в классе с аннотацией @Configuration и включенном в путь сканирования компонента):

...
@Bean
public DataSource dataSource() {
    return new HikariDataSource(hikariConfig());
}

private HikariConfig hikariConfig() {
    HikariConfig config = new HikariConfig();
    config.setDriverClassName(driverClassName);
    config.setJdbcUrl(jdbcUrl);
    config.setUsername(username);
    config.setPassword(password);
    return config;
}
...

ХТН

person Christof    schedule 07.04.2015
comment
как я уже упоминал, это работает нормально, проблема была в конфигурациях на основе xml - person Amey Jadiye; 24.06.2015

Протестировано под HikariCP 2.3.8 и Hibernate 4.3.8. Финал:

<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
    <constructor-arg>
        <props>
            <prop key="dataSourceClassName">org.postgresql.ds.PGSimpleDataSource</prop>
            <prop key="dataSource.user">${database.username}</prop>
            <prop key="dataSource.password">${database.password}</prop>
            <prop key="dataSource.databaseName">${database.databaseName}</prop>
            <prop key="dataSource.serverName">${database.serverName}</prop>
            <prop key="connectionTestQuery">SELECT 1</prop>
        </props>
    </constructor-arg>
</bean>

<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource">
    <constructor-arg ref="hikariConfig" />
</bean>

Для dataSourceClassName просмотрите таблицу популярных имен классов источников данных. .

ConnectionTestQuery требуется для postgresql в соответствии с https://github.com/brettwooldridge/HikariCP/issues/225 не требуется при использовании последней версии драйвера jdbc.

person Giovanni Toraldo    schedule 26.06.2015