Oracle - 使用 Spring 框架的连接池

Posted

技术标签:

【中文标题】Oracle - 使用 Spring 框架的连接池【英文标题】:Oracle - connection Pooling with spring framework 【发布时间】:2009-07-13 11:56:13 【问题描述】:

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

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

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

我们使用 Ibatis 作为 ORM 框架。

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

【问题讨论】:

【参考方案1】:

我会使用 Oracle 提供的解决方案,该解决方案包含在他们的 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>

【讨论】:

里面有错字; 应该是 现在不推荐使用销毁方法关闭,建议使用 Oracle UCP:***.com/questions/1427890/… 有趣的是,它通过工厂在内部使用 OracleDataSource,根本没有提到关闭...不要知道如果这里简单地省略了该销毁方法会发生什么。【参考方案2】:

我使用 C3PO 建立连接。它还具有为您进行连接池的优势。只需定义一个 datasource 类型的 bean,例如com.mchange.v2.c3p0.ComboPooledDataSource (或类似的)通过你的spring配置文件。在遇到连接池问题之前,我什至使用了一种不建议用于生产的 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 文件...

【讨论】:

您能否提供一些链接以获取更多详细信息。一个简单的配置示例将是一个很好的指针。 我看到您使用的是 Oracle xpress 版本?您是否尝试过没有 Express Edition 的瘦客户端?任何指针? Oracle 自带连接池功能时为什么要使用 c3p0?【参考方案3】:

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

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

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

http://tomcat.apache.org/tomcat-6.0-doc/jndi-datasource-examples-howto.html

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

【讨论】:

【参考方案4】:

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

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

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

【讨论】:

完全不清楚你在问什么。请尝试重写此问题。 *我想你的意思是这个答案【参考方案5】:

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

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

谢谢! 普拉提克

【讨论】:

那个链接内容丰富,我哭了。请考虑删除此答案 ...域名已经过期。

以上是关于Oracle - 使用 Spring 框架的连接池的主要内容,如果未能解决你的问题,请参考以下文章

jdbc连接池问题 使用的是spring框架自带的jdbctemplate,请问一下在同一次请求中

初识数据库连接池开源框架Druid

初识数据库连接池开源框架Druid

Spring Boot : ORM 框架 JPA 与连接池 Hikari

Spring框架管理开源的连接池

Spring框架管理开源的连接池