HikariCP 中 SQLite 的配置 date_string_format

Configuration date_string_format of SQLite in HikariCP

我们正在将 C3P0 迁移到 HikarCP \o/,除了我们要覆盖的 属性 配置 date_string_format 之外,一切都很好。

这是我们旧的 C3P0 配置的一部分:

<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>

还有一点我们的 HikariCP 配置:

<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>

我们收到此错误:

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)

知道如何解决这个问题吗?

谢谢

不知道 C3P0 是如何工作的,但在 HikariCP 中 dataSourceProperties 将映射到针对 DataSource class 的方法调用。因此,像 date_string_format 这样的 属性 将映射到在名为 setDate_string_format() 的 SQLiteDataSource 上寻找 setter。没有这样的setter。沿着这些方向尝试:

<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>

您当然可以 nest/unnest 需要 <bean> 声明并且 add/remove refs.

对于 SQLiteDataSource (JavaDoc here) 上公开的任何 "setter",请随意继续使用 dataSourceProperties