Spring MVC 刷新应用程序上下文中的数据库 bean
Spring MVC refresh database beans in application context
我正在开发一个使用 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 的范围移动到 单例,因为每个会话的连接量开始有点太多了。
问题是:
我们的数据库每个星期天都会关闭,spring 应用程序似乎表现得很奇怪,它保持套接字打开并且没有像我想象的那样刷新连接。
有没有一种方法可以每天刷新连接并且不必在每个星期一重新启动应用程序来刷新单例范围的 bean?
您要做的是为您的连接配置验证。从池中借用连接时,您需要确保该连接有效。为此,您可以在数据源上指定 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 驱动程序足够新,您不再需要验证查询,因为验证是由驱动程序提供的,而不需要通过查询来完成。除此之外,您可能会使用此池获得更好的结果。
此外,您的池大小可能有点大,article/presentation 关于池大小的信息可以找到 here。
我正在开发一个使用 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 的范围移动到 单例,因为每个会话的连接量开始有点太多了。
问题是:
我们的数据库每个星期天都会关闭,spring 应用程序似乎表现得很奇怪,它保持套接字打开并且没有像我想象的那样刷新连接。
有没有一种方法可以每天刷新连接并且不必在每个星期一重新启动应用程序来刷新单例范围的 bean?
您要做的是为您的连接配置验证。从池中借用连接时,您需要确保该连接有效。为此,您可以在数据源上指定 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 驱动程序足够新,您不再需要验证查询,因为验证是由驱动程序提供的,而不需要通过查询来完成。除此之外,您可能会使用此池获得更好的结果。
此外,您的池大小可能有点大,article/presentation 关于池大小的信息可以找到 here。