4

我们正在尝试在 Spring Framework 的帮助下实现 Oracle 连接池。我们正在使用 DBCP 连接池方法。然而,DBCP 和 spring 之间的集成并没有那么好。

我们面临的问题是 DBCP 返回 PoolableConnections 对象,而 Oracle 需要 OracleConnection 对象。(抛出 ClassCastException)

看来Oracle 11g 已经处理了这个问题。但是,我很好奇其他人如何使用适用于 Oracle 10g 的 spring 框架(使用 TOMCAT)实现 Oracle 连接池。

我们使用 Ibatis 作为 ORM 框架。

我确信有办法。任何帮助表示赞赏。

4

5 回答 5

15

我会使用 Oracles 提供的解决方案,该解决方案包含在他们的 ojdbc jar 中。较旧的方法是使用OracleConnectionPoolDataSource类,但现在您可以在常规OracleDataSource上设置参数并获取连接池。

以下是在 Spring 中执行此操作的方法:

<bean id="datasource" class="oracle.jdbc.pool.OracleDataSource" destroy-method="close">
   <property name="connectionCachingEnabled" value="true" />
   <property name="URL" value="${jdbc.url}" />
   ...all your connection properties
   <property name="connectionCacheProperties">
      <props merge="default">
         <prop key="MinLimit>3</prop>
         <prop key="MaxLimit">20</prop>
      </props>
   </property>
</bean>
于 2009-07-14T21:58:25.410 回答
4

我使用 C3PO 建立连接。它还具有为您进行连接池的优势。只需通过您的 spring 配置文件定义一个类型的数据源bean,例如 com.mchange.v2.c3p0.ComboPooledDataSource (或类似的)。在遇到连接池问题之前,我什至使用了不建议用于生产的 spring (DriverManagerDataSource) 之一,因为它实际上并没有进行连接池。

这是一个示例弹簧配置。

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
    <property name="driverClass" value="oracle.jdbc.driver.OracleDriver"/>
    <property name="jdbcUrl" value="jdbc:oracle:thin:@localhost:1521:XE"/>
    <property name="user" value="username"/>
    <property name="password" value="secret"/>
    <property name="minPoolSize" value="5"/>
    <property name="maxPoolSize" value="20"/>
    <property name="acquireIncrement" value="1"/>
    <property name="idleConnectionTestPeriod" value="100"/>
    <property name="maxStatements" value="0"/>
    <property name="checkoutTimeout" value="60000"/>

然后 Spring 将 dataSource bean 注入 Hibernate,一切都很好。您还需要在类路径中包含 c3pO jar 文件...

于 2009-07-13T12:01:29.127 回答
3

你不应该实现自己的池,如果那是你正在使用的。Tomcat 已经为您做到了,而是在 Tomcat 中定义一个数据源,并让您的 ORM 框架使用它(当您定义 Tomcat 数据源时,您可以在那里指定池配置)。

如果您可以发布一些代码片段,特别是相关的 Spring 上下文配置,我可以帮助您提供如何执行此操作。

这是 Tomcat 文档,它向您展示了您是如何做到这一点的:

顺便说一句,Tomcat 也使用 DBCP,并且最好依赖 JNDI,因为它使您的代码更具可移植性(从一个环境到另一个环境 - 例如,从开发到登台到生产,甚至跨应用服务器 - 例如,到 WebSphere、WebLogic 等)。

于 2009-07-13T18:28:50.567 回答
0

而不是使用 SimpleNativeJdbcExtractor 使用 CommonsDbcpNativeJdbcExtractor 来获取本机连接。有用。

当使用一个包含 Connections 但不包含 Statements 的简单连接池时,SimpleNativeJdbcExtractor 通常就足够了。但是,一些池(如 Jakarta 的 Commons DBCP)包装了它们返回的所有 JDBC 对象:因此,您需要对它们使用特定的 NativeJdbcExtractor(如 CommonsDbcpNativeJdbcExtractor)。

点击这里 [http://static.springsource.org/spring/docs/2.0.x/api/org/springframework/jdbc/support/nativejdbc/NativeJdbcExtractor.html]

于 2013-08-21T17:40:35.117 回答
-1

我也遇到了和你一样的问题..所以我使用了 Oracle Native 连接池..它工作顺利..

这是详细信息的链接 http://www.lambdaprobe.org/d/oracle.shtml

谢谢!普拉提克

于 2009-07-13T18:18:49.590 回答