【发布时间】:2011-04-11 16:14:22
【问题描述】:
我们正在使用 Spring 框架(2.5 版)中的 DriverManagerDataSource 来汇集到 Oracle 的连接。但是,这些连接似乎没有定义任何超时 - 昨天,在紧急数据库重新启动后,我们有一个线程挂在数据库连接内部读取的套接字上。如何设置超时时间,比如 10 分钟,以便下次引发异常?
【问题讨论】:
我们正在使用 Spring 框架(2.5 版)中的 DriverManagerDataSource 来汇集到 Oracle 的连接。但是,这些连接似乎没有定义任何超时 - 昨天,在紧急数据库重新启动后,我们有一个线程挂在数据库连接内部读取的套接字上。如何设置超时时间,比如 10 分钟,以便下次引发异常?
【问题讨论】:
我最终通过以下方式更改了 Spring 上下文中的 bean:
<bean id="myDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" autowire="no">
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<property name="connectionProperties">
<props>
<prop key="oracle.net.READ_TIMEOUT">60000</prop>
</props>
</property>
</bean>
我不知道它是否还有效。
【讨论】:
Oracle 有一个内置的连接池:oracle.jdbc.pool.OracleDataSource。我建议你直接使用它。 Oracle JDBC(10gR2,其他版本类似)的参考在http://download.oracle.com/docs/cd/B19306_01/java.102/b14355/toc.htm。兴趣点:
【讨论】:
如果您的 Oracle 驱动程序实现支持超时属性,您可以通过 getConnectionProperties().put(key, timeout) 将其传递给底层实现
我假设您意识到DriverManagerDataSource 不是连接池?来自文档:
注意:这个类不是真正的连接池;它实际上并没有 池连接。它只是用作 简单替换成熟的 连接池,实现相同 标准接口,但创建新的 每次通话都有连接。 [..] 如果你 外面需要一个“真正的”连接池 对于 J2EE 容器,考虑 Apache's Jakarta Commons DBCP 或 C3P0.
您可能也对OCI Connection Pooling感兴趣?
【讨论】: