我在Spring使用Oracle Data Source实现了连接池。目前,我们面临的问题是,连接在一段时间后变得无效。 (可能是Oracle在一段时间后丢弃了这些空闲连接)。以下是我的问题:
在Spring的连接池属性中,我们没有“validateConnection”属性。我知道它在将其交给Web应用程序之前验证了连接吗?但这是否意味着如果连接通过validateConnection测试,那么它将始终正确连接到数据库。我问这个,因为我在这里读到以下问题: http://forum.springsource.org/showthread.php?t=69759
如果假设validateConnection没有确保连接有效的整整9码,那么DBCP中是否还有其他选项,如“testBeforBorrow”,它运行测试查询以确保连接在处理之前处于活动状态转到webapp?
如果您能为上面列出的一个或多个查询提供答案,我将不胜感激。
干杯
答案 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>