在连接池中移交Web App之前验证连接

时间:2009-09-17 05:27:20

标签: oracle spring connection-pooling

我在Spring使用Oracle Data Source实现了连接池。目前,我们面临的问题是,连接在一段时间后变得无效。 (可能是Oracle在一段时间后丢弃了这些空闲连接)。以下是我的问题:

  1. 可以将Oracle数据库配置为在特定时间段后自动删除空闲连接。因为我们希望这些连接闲置一段时间;如果有任何这样的配置;它可能正在发生。
  2. 在Spring的连接池属性中,我们没有“validateConnection”属性。我知道它在将其交给Web应用程序之前验证了连接吗?但这是否意味着如果连接通过validateConnection测试,那么它将始终正确连接到数据库。我问这个,因为我在这里读到以下问题: http://forum.springsource.org/showthread.php?t=69759

  3. 如果假设validateConnection没有确保连接有效的整整9码,那么DBCP中是否还有其他选项,如“testBeforBorrow”,它运行测试查询以确保连接在处理之前处于活动状态转到webapp?

  4. 如果您能为上面列出的一个或多个查询提供答案,我将不胜感激。

    干杯

2 个答案:

答案 0 :(得分:4)

您没有说明您正在使用哪种应用程序服务器,或者您是如何配置数据源的,因此我无法向您提供具体建议。

连接验证通常听起来不错,但你必须小心。例如,我们曾经在JBoss app服务器中使用它来验证池中的连接,然后再将它们交给应用程序。此Oracle专有机制在Oracle JDBC驱动程序上使用ping()方法,该方法检查连接是否仍处于活动状态。它运行良好,但事实证明ping()在服务器上执行“select 'x' from dual”,当它每秒运行数十次时,这是一个非常昂贵的查询。

所以道德是,如果你有一个高流量的服务器,非常小心连接验证,它实际上可以让你的数据库服务器瘫痪。

对于DBCP,它能够验证连接是从池中借来的,还是返回到池中,并且可以告诉它将哪些SQL发送到数据库来执行此验证。但是,如果您没有将DBCP用于连接池,那么这对您没有多大用处。 C3PO做了类似的事情。

如果您正在使用应用服务器的数据源机制,那么您必须找出是否可以将其配置为验证连接,以及特定于您的服务器。

最后一件事:Spring实际上并没有涉及到这里。 Spring只使用您提供的DataSource,由DataSource实现来执行连接验证。

答案 1 :(得分:0)

数据源的配置“是”如下:

<bean id="datasource2"
 class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName">
         <value>org.apache.commons.dbcp.BasicDataSource</value>
    </property>
<property name="url">
         <value>ORACLE URL</value>
    </property>
<property name="username">
         <value>user id</value>
    </property>
<property name="password">
         <value>user password</value>
    </property>
<property name="initialSize" value="5"/>
<property name="maxActive" value="20"/>
</bean>

已将其更改为:

<bean id="connectionPool1" class="oracle.jdbc.pool.OracleDataSource" destroy-method="close">
<property name="connectionCachingEnabled" value="true" />
<property name="URL">
         <value>ORACLE URL</value>
    </property>
<property name="user">
         <value>user id</value>
    </property>
<property name="password">
         <value>user password</value>
    </property>
<property name="connectionCacheProperties">
      <value>
        MinLimit:1
        MaxLimit:5
        InitialLimit:1
        ConnectionWaitTimeout:120
        InactivityTimeout:180
        ValidateConnection:true
      </value>
   </property>
</bean>