2010-08-20 7 views
0

저는 꽤 큰 문제가있을 수 있습니다.JDBC 연결 풀링 문제

DB 연결을 설정하기 위해 Spring BasicDataSource를 사용하는 Java 웹 응용 프로그램에서 작업하고 있습니다. 로컬에서 응용 프로그램을 테스트하고 있었지만 제대로 작동합니다 ... 그러나 응용 프로그램이 온라인 상태 일 때 어떤 점에서는 DB에 대한 연결이 막혔습니다. 나는 커넥션 풀링에 관해서 조사하는 것이 아니었고, 새로운 HTTP 요청마다 실행 된 질의 중 일부를 가지고 새로운 풀이 생성된다는 것을 알았다. 내가 아는 바와 같이, 풀링은 재사용 가능하도록 도입되었으며, 새로운 DB 액세스가 포함될 때마다 생성되지는 않습니다. 아니면 내가 틀렸어? 응용 프로그램

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

로 전송 된 모든 HTTP 요청을 처리

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

그리고 mainPageController :

<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> 

내가 구성한보다 : 여기

내 스프링 소스의 설정입니다

나머지 응용 프로그램에서는 gedDatabase()를 사용하여 DB 연결을 획득하고 JDBCTemplate을 통해 선택합니다.

어디서 잘못 되었나요?

감사합니다.

+0

모든 요청에 ​​대해 새 연결 풀이 만들어지고 있음을 알리는 대신 새 연결이 만들어지고 있음을 알리는 것인지 확실하지 않습니다. 그렇지 않다면 이것은 실제로 큰 문제입니다.풀이 요청할 때마다 다시 만들어지고 있다고 생각하는 이유를 포함하도록 질문을 편집하는 것이 좋습니다. –

+0

미안하지만 분명히 생각했습니다 ... 내가 시도한 것은 새로운 풀을 만들지 만 재사용 할 수 있다는 생각으로 단 하나의 연결을 만드는 것입니다. 새로운 하나를 만들 때마다 요청하는 것이 아닙니다. ... 1000 건의 요청에서 수십 개의 풀이 호출되었습니다. – k00

+0

도움이된다면 다음 튜토리얼에 설명 된 내용을 구현했습니다. http://www.vogella.de/articles/SpringJDBC/article.html 누군가가 동일한 문제를 겪고 있으며 문제가 해결되기를 바랍니다. 또는 누군가가이를 구현할 올바른 방법을 보여주는 자습서를 가지고 있다면. – k00

답변

1

연결 풀을 통해 dao 및 jdbcTemplate 및 dataSource를 사용하려고합니다. 내 생각에 가장 가까운 올바른 접근 방식은 JdbcTemplate 필드를 가진 dao와 dataSource 빈을 사용하여 생성 된 JdbcTemplate 빈을 갖는 것이다. 그것은 보일 것 같은 : JdbcTemplate와 같은 빈에서 오는

public class MyDAO { 
    private JdbcTemplate jdbcTemplate; 

    // your dao methods using jdbcTemplate here 
} 

:

당신은 (귀하의 경우 아파치 DBCP를 기반으로 연결 풀이다)은 dataSource에서 연결을 얻을 필요가 없습니다해야
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> 
    <constructor-arg ref="dataSource"> 
</bean> 

직접 . JdbcTemplate은 필요할 때 연결 자체를 가져옵니다. 나는 "gedDatabase"가 무엇인지 모르겠다.하지만 스스로 연결을 시도하고 아마도 그것을 닫는 것을 잊어 버린 것처럼 들린다. 이로 인해 풀에 빠르게 연결이 끊어집니다. 20 개의 요청을 처리 한 후 후속 요청은 풀에서 연결을 시도 할 때 멈추게됩니다.

또한 이유와 방법이 여러 풀이 표시되는 것을 이해하지 못합니다. 최대 20 개의 연결을 보유 할 수있는 단일 연결 풀이 있습니다. 모든 콩은 기본 스프링 범위 인 싱글 톤으로 생성됩니다.

+0

방금 ​​필요한 모든 구성을 복사하지 않은 것으로 나타났습니다. gedDatabase가 아닌 getDatabase() :) ... mainController는 setter 종속성 주입을 사용하고 이전에 EventDao에 의해 초기화 된 dataSource를 설정합니다. EventDao 인스턴스가 한 번만! – k00

+0

내 관심사는 getDatabase이 수행하는 작업과 얼마나 자주 호출했는지입니다. – mrembisz

0

귀하의 EventDao의 수명은 얼마나됩니까? DataSource를 dataSource 속성에 삽입하고 있습니다. 나는 당신이 여러 개의 EventDao 빈을 만들고 각각을 만들 때마다 새로운 데이터 소스를 가지고 있다고 생각한다. 질문에 올바르게 대답 할 수 있도록 코드를 더 이해해야한다고 생각합니다.

내 두 센트
코드를 작성하고 XML을 통해 연결하는 것에 관한 한 끔찍한 반 패턴입니다.