Spring MVC在应用程序上下文中刷新数据库bean

时间:2015-06-08 10:07:06

标签: spring singleton refresh javabeans apache-commons-dbcp

我正在开发一个使用dbcp数据库连接池的Spring MVC Web应用程序。

<bean id="datasourceAR_XXX" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" scope="singleton">
        <property name="driverClassName"><value>oracle.jdbc.driver.OracleDriver</value></property>
        <property name="url"><value>jdbc:oracle:thin:@XXX.XXX.com:1500:SERVICE</value></property>
        <property name="maxActive"><value>100</value></property>
        <property name="maxIdle"><value>10</value></property>
        <property name="username"><value>XXX</value></property>        
        <property name="password"><value>XXX</value></property>
</bean>

我最近将这些bean的范围移到 singleton ,因为每个会话的连接量开始有点过多。

问题是:

我们的数据库正在关闭每个星期天,并且Spring应用程序似乎通过保持套接字打开而不会像我想象的那样刷新连接。

有没有办法以每天刷新连接的方式刷新作为单例的bean,并且没有义务每个星期一重新启动应用程序?

1 个答案:

答案 0 :(得分:1)

您要做的是为您的连接配置验证。从池中借用连接时,您需要确保该连接有效。为此,您可以在数据源上指定validationQuery属性。

<bean id="datasourceAR_XXX" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" scope="singleton">
    <property name="driverClassName"><value>oracle.jdbc.driver.OracleDriver</value></property>
    <property name="url"><value>jdbc:oracle:thin:@XXX.XXX.com:1500:SERVICE</value></property>
    <property name="maxActive"><value>100</value></property>
    <property name="maxIdle"><value>10</value></property>
    <property name="username"><value>XXX</value></property>        
    <property name="password"><value>XXX</value></property>
    <property name="validationQuery" value="select 1 from dual" />
</bean>

请参阅DBCP - validationQuery for different Databases以获取不同数据库的可能验证查询列表。

Commons DBCP存在一些问题,它已经很老了(尽管现在有一个DBCP 2.x)。我建议移动到不同的数据源,如HikariCP这个数据源也是一个基于JDBC 4.x的数据源,它允许更容易的连接验证(它是JDBC 4规范的一部分)。

<bean id="datasourceAR_XXX" class="com.zaxxer.hikari.HikariDataSource">
    <property name="datasourceClassName" value="oracle.jdbc.pool.OracleDataSource"/>
    <property name="maximumPoolSize" value="20" />
    <property name="username" value="XXX" />
    <property name="password" value="XXX" />
    <property name="datasourceProperties">
        <props>
            <prop key="serverName">XXX.XXX.com</prop>
            <prop key="port">1500</prop>
            <prop key="databaseName">SERVICE</prop>             
        </props>
    </property>
</bean>

如果您的oracle驱动程序足够新,则不再需要验证查询,因为驱动程序提供了验证,而不需要完成查询。接下来,您可能会在此池中获得更好的结果。

此外,您可能会有一个较大的池大小,可以找到有关池大小的好文章/演示here