JDBC连接池问题

时间:2010-08-20 21:38:07

标签: java spring jdbc connection-pooling

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

我正在使用Spring Web应用程序,它使用spring BasicDataSource来设置数据库连接。我在本地测试应用程序,它工作得很好......但是,当应用程序在线时,在某些方面连接到DB只是卡住了。我当时正在调查关于连接池的问题,并且我发现在每个新的HTTP请求中,我执行了一些查询,创建了新的池。据我所知,池的引入是可重用的,而不是每次涉及新的DB访问时都创建池。或者我错了?

这是我的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>

和mainPageController一起处理发送给应用程序的所有HTTP请求

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

 

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

我哪里出错?

由于

2 个答案:

答案 0 :(得分:1)

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

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都创建为单例,这是默认的弹簧范围。

答案 1 :(得分:0)

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

我的两分钱:
就我而言,通过XML进行代码和布线是一种可怕的反模式。