我可能会说,这是一个相当大的问题。
我正在使用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进行选择。
我哪里出错?
由于
答案 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进行代码和布线是一种可怕的反模式。