0

We are migrating C3P0 to HikarCP \o/, everything is going fine except the configuration of a property that we want to override which is date_string_format.

Here is a bit of our old C3P0 configuration:

<bean id="defaultDataSource" destroy-method="close" class="com.mchange.v2.c3p0.ComboPooledDataSource">
      <property name="driverClass" value="org.sqlite.SQLiteDataSource" />
      ...
      <property name="properties">
         <map value-type="java.lang.String" key-type="java.lang.String">
            <entry key="date_string_format" value="${datasource.date_string_format:''}" />
         </map>
      </property>
   </bean>

And a bit of our HikariCP configuration:

<bean id="merlinDataSourceConfig" class="com.zaxxer.hikari.HikariConfig">
      <property name="dataSourceClassName" value="org.sqlite.SQLiteDataSource" />
      ...
      <property name="registerMbeans" value="true"/>
      <property name="dataSourceProperties">
         <props>
            <prop key="date_string_format">${datasource.date_string_format:''}</prop>
         </props>
      </property>
   </bean>

We got this error:

Method not found: setDate_string_format
    java.beans.PropertyDescriptor.<init>(Unknown Source)
    com.zaxxer.hikari.util.PropertyBeanSetter.setProperty(PropertyBeanSetter.java:125)
    com.zaxxer.hikari.util.PropertyBeanSetter.setTargetFromProperties(PropertyBeanSetter.java:63)
    com.zaxxer.hikari.pool.PoolUtilities.initializeDataSource(PoolUtilities.java:111)
    com.zaxxer.hikari.pool.BaseHikariPool.<init>(BaseHikariPool.java:157)
    com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:60)
    com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:48)
    com.zaxxer.hikari.HikariDataSource.<init>(HikariDataSource.java:80)
    sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)

Any idea of how to fix this issue?

Thanks

Marouane Gazanayi
  • 5,063
  • 6
  • 39
  • 58

1 Answers1

1

No idea how C3P0 was working, but in HikariCP dataSourceProperties are going to map to method invocations against the DataSource class. So, a property like date_string_format is going to map to looking for a setter on SQLiteDataSource called setDate_string_format(). There is no such setter. Try something along these lines:

<bean id="sqliteConfig" class="org.sqlite.SQLiteConfig">
  <constructor-arg>
    <props>
      <prop key="date_string_format">${datasource.date_string_format:''}</prop>
    </props>
  <constructor-arg>
</bean>

<bean id="merlinDataSourceConfig" class="com.zaxxer.hikari.HikariConfig">
  <property name="dataSource">
    <bean id="sqlLiteDataSource" class="org.sqlite.SQLiteDataSource">
      <constructor-arg ref="sqliteConfig" />
    </bean>
  </property>
  ...
  <property name="registerMbeans" value="true"/>
</bean>

You can of course nest/unnest the <bean> declarations was desired and add/remove refs.

Feel free to continue to use dataSourceProperties for any "setter" exposed on the SQLiteDataSource (JavaDoc here).

brettw
  • 10,664
  • 2
  • 42
  • 59