HikariCP Lazy with Spring LazyConnectionDataSourceProxy

时间:2017-06-12 17:23:48

标签: spring hikaricp

可以使用延迟配置启动HikariCP数据源吗?

为此,我正在使用Spring LazyConnectionDataSourceProxy

<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig" lazy-init="true">
    <property name="poolName" value="TargetHikariCP" />
    <property name="dataSourceClassName" value="oracle.jdbc.pool.OracleDataSource" />
    <property name="connectionInitSql" value="SELECT 1 FROM DUAL"/>
    <property name="leakDetectionThreshold" value="300000"/>
    <property name="minimumIdle" value="1"/>
    <property name="maximumPoolSize" value="10"/>
    <property name="autoCommit" value="false"/>
    <property name="dataSourceProperties"> <props> ... </props> </property>
</bean>

<bean id="dataSourceLazy" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close" lazy-init="true">
    <constructor-arg ref="hikariConfig" />
</bean>

<bean id="dataSource"
    class="org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy">
    <property name="targetDataSource" ref="dataSourceLazy" />
</bean>      


<bean id="txManager"
          class="org.springframework.jdbc.datasource.DataSourceTransactionManager" lazy-init="true">
    <property name="dataSource" ref="dataSource" />
</bean>

然而,它不起作用,因为数据源是在项目启动时启动的。

使用org.springframework.jdbc.datasource.DriverManagerDataSource时,相同的配置可以正常工作。

2 个答案:

答案 0 :(得分:2)

在版本> 3中,我们可以设置setInitializationFailTimeout(-1);

根据文档:

  • 任何大于零的值都将被视为池初始化超时。将阻止调用线程继续进行直到成功连接 到数据库,或者直到超时。如果达到超时,则 PoolInitializationException将被抛出。
  • 零值不会阻止池从 无法获得连接的情况。但是,启动时池将 尝试获得连接并验证connectionTestQueryconnectionInitSql有效。如果这些验证失败,则出现异常 将被抛出。如果无法获得连接,则跳过验证 池将启动并继续尝试在 背景。这可能意味着DataSource#getConnection()的呼叫者可能 遇到异常。
  • 小于零的值将绕过任何连接尝试和验证 启动,因此池将立即启动。游泳池将继续 尝试在后台获取连接。这可能意味着呼叫者 DataSource#getConnection()可能会遇到异常。

答案 1 :(得分:0)

HikariCP有一个属性 initializationFailFast ,用于控制池是否会快速失败&#34;如果池无法成功初始连接播种:

  

此属性控制池是否会快速失败&#34;如果池无法成功初始连接。如果希望应用程序在数据库关闭/不可用时启动,请将此属性设置为false。默认值:true

此属性已记录在他们的站点中,但是根据2.6.2版本没有,但似乎仍然支持它。

在我的用例中,使用此属性应足以解决我的问题。