2010-08-20 141 views
0

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

我正在使用弹簧BasicDataSource来设置数据库连接的Java Web应用程序。我正在本地测试应用程序,它工作得很好......但是,当应用程序在线时,在某些时候连接到数据库只是停滞不前。我不是在研究连接池,而是我发现在每个新的HTTP请求中,我执行了一些查询,新的池被创建。据我所知,池被引入是可重用的,而不是每次涉及新的数据库访问时创建的。或者我错了?

这里是我的春天数据源配置:

<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它处理发送到应用程序

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

所有的HTTP请求

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

我在哪里出错?

谢谢

+0

我不确定是否意味着要创建一个新的连接,而不是说每个请求都会创建一个新的连接池。如果不是,这确实是一个大问题。我可以建议你编辑问题,以包括为什么你认为每次请求都会重新创建池。 – 2010-08-20 21:46:18

+0

对不起,我认为我很清楚...我试图做的只是创建一个连接,考虑到将创建新的池,但也重用...不是每个请求创建新池...在1000个请求中,我调用了数十个池。 – k00 2010-08-20 22:17:50

+0

如果它有任何帮助,我已经实现了这个很像教程在这里描述:http://www.vogella.de/articles/SpringJDBC/article.html 我希望有人有同样的问题,并设法修复它......或者如果有人有教程,显示正确的方式来实现这一点。 – k00 2010-08-20 23:17:13

回答

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> 

你永远不应该需要获得从数据源(在你的情况下,这是Apache的DBCP基于连接池)的连接,直接。 JdbcTemplate将在需要时自行获取连接。我不确定什么是“gedDatabase”,但它听起来像你试图自己连接并可能忘记关闭它。这会导致池快速耗尽连接。在处理了20个请求之后,随后的请求将停留在尝试从池中获取连接。

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

+0

我刚刚注意到我没有复制所有必要的配置,它不是gedDatabase,它是getDatabase():)... mainController使用setter依赖注入,并设置之前由EventDao初始化的dataSource。 EventDao只实例化一次! – k00 2010-08-23 17:06:51

+0

我最关心的是getDatabase在做什么以及你多久打电话给它。 – mrembisz 2010-08-24 18:45:42

0

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

我的两分钱:
就我而言,通过XML的代码和接线事情是一个可怕的反模式。