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>
【讨论】:
里面有错字;我使用 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,请问一下在同一次请求中