【问题标题】:JDBC connection pooling issueJDBC 连接池问题
【发布时间】:2011-04-01 21:27:04
【问题描述】:

我可能会说,这是一个相当大的问题。

我正在开发使用 springs BasicDataSource 来设置数据库连接的 Java Web 应用程序。我在本地测试应用程序,它工作得很好......但是,当应用程序在线时,在某些时候与数据库的连接卡住了。我不是在调查连接池,我发现在每个新的 HTTP 请求上,我执行了一些查询,都会创建新的池。据我所知,引入池是为了可重用,而不是在每次涉及新数据库访问时创建。还是我错了?

这是我的 spring 数据源配置:

<bean id="dataSource" destroy-method="close" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName" value="${jdbc.driverClassName}"/>
        <property name="url" value="url"/>
        <property name="username" value="username"/>
        <property name="password" value="password"/>
        <property name="defaultAutoCommit" value="true"/>
 <property name="defaultTransactionIsolation" value="1"/>
 <property name="initialSize" value="0"/>
 <property name="maxActive" value="20"/>
 <property name="minIdle" value="0"/>
</bean>

比我配置的:

<bean id="EventDao" class="my.managament.database.class">
    <property name="dataSource" ref="dataSource"/>
</bean>

以及处理所有发送到应用程序的 HTTP 请求的 mainPageController

<bean id="mainController" class="my.management.main.controller.class">

在应用程序的其余部分,我使用 gedDatabase() 获取数据库连接,并通过 JDBCTemplate 进行选择。

我哪里错了?

谢谢

【问题讨论】:

  • 我不确定您是否要声明正在创建一个新连接,而不是声明每个请求都会创建一个新连接池。如果不是,这确实是一个大问题。我是否可以建议您编辑问题以包括为什么您认为每次请求都会重新创建池。
  • 对不起,我以为我很清楚......我试图做的是只创建一个连接,考虑到要创建新池,但也要重用......不是每个创建新请求的请求...在 1000 个请求中,我调用了成千上万个池。
  • 如果有任何帮助,我已经实现了这个,就像这里的教程中描述的一样:vogella.de/articles/SpringJDBC/article.html我希望有人遇到同样的问题并设法解决它......或者如果有人有教程这显示了实现这一点的正确方法。

标签: java spring jdbc connection-pooling


【解决方案1】:

您想通过连接池使用 dao 和 jdbcTemplate 和 dataSource。我猜最接近您的设置的正确方法是拥有一个具有 JdbcTemplate 字段和使用您的 dataSource bean 创建的 JdbcTemplate bean 的 dao。它看起来像:

public class MyDAO {
  private JdbcTemplate jdbcTemplate;

  // your dao methods using jdbcTemplate here
}

其中 jdbcTemplate 来自如下 bean:

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
  <constructor-arg ref="dataSource">
</bean>

您永远不需要直接从 dataSource(在您的情况下是基于 apache dbcp 的连接池)获取连接。 JdbcTemplate 将在需要时自行获取连接。我不确定“gedDatabase”是什么,但听起来你试图自己建立连接并且可能忘记关闭它。这将导致池快速耗尽连接。处理完 20 个请求后,后续请求会卡在尝试从池中获取连接。

另外,我不明白您为什么以及如何看到多个池。您有一个最多可容纳 20 个连接的连接池。您所有的 bean 都被创建为单例,这是默认的 spring 范围。

【讨论】:

  • 我刚刚注意到我没有复制所有必要的配置。而且它不是 gedDatabase,它是 getDatabase() :)... mainController 使用 setter 依赖注入,并设置先前初始化的 dataSource事件道。 EventDao 只被实例化一次!
  • 我主要关心的是 getDatabase 在做什么以及您多久调用一次。
【解决方案2】:

您的 EventDao 的生命周期是多少?您正在将 DataSource 注入 dataSource 属性。我怀疑您正在创建多个 EventDao bean,并且每次创建一个时都会有一个新的 DataSource。我认为我们需要进一步了解代码才能正确回答您的问题。

我的两分钱:
就我而言,通过 XML 编写代码和连接事物是一种可怕的反模式。

【讨论】:

    猜你喜欢
    • 2011-10-24
    • 2015-11-16
    • 2011-05-05
    • 2016-07-06
    • 2012-05-09
    • 2012-02-28
    • 1970-01-01
    • 2011-10-10
    • 1970-01-01
    相关资源
    最近更新 更多