【问题标题】:Spring MVC refresh database beans in application contextSpring MVC 在应用程序上下文中刷新数据库 bean
【发布时间】:2015-06-08 10:07:05
【问题描述】:

我正在开发一个使用 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?

【问题讨论】:

  • 使用验证查询来验证连接。如果验证失败,连接将被删除并创建一个新连接。这样你就不需要重新启动任何东西......
  • 事实上,我们遇到了问题,因为连接器似乎正在等待,并且在任何时候都没有给出任何错误......它只是阻塞。当您说验证查询时,您到底在说什么?这只是对数据库的简单查询还是 Spring 提供的东西?
  • 你的数据源提供了这个。你读过the documentation吗?但是,我也建议使用不同的连接池,例如 HikariCP
  • 感谢 Deinum!我错过了也有超时参数的验证查询参数,所以它很完美!虽然不知道如何确定您的答案:)

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


【解决方案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 找到关于池大小的不错的文章/演示。

【讨论】:

    猜你喜欢
    • 2013-04-12
    • 1970-01-01
    • 1970-01-01
    • 2010-11-14
    • 2021-08-30
    • 1970-01-01
    • 1970-01-01
    • 2011-04-23
    • 2017-01-16
    相关资源
    最近更新 更多