2012-02-27 2 views
17

, 모두 DataSourceJdbcTemplates 그래서 당신은 JdbcTemplate의 단일 인스턴스를 구성 할 수 있습니다 후 안전하게 다중의 DAO (또는 저장소)에이 공유 참조를 주입, threadsafe 있습니다. 또한 DataSource은 연결 풀을 관리하므로 스프링 싱글 톤이어야합니다.JdbcTemplate 인스턴스가 여러 개 있는지 여부 내가 이해에서

공식 Spring Documentation JdbcTemplate best practices 수동에서 대안 (발췌 이탤릭체에 대해 설명하고 대괄호 사이에 내 노트 :

  • 구성하여 Spring 설정 파일에 데이터 소스 다음 종속성 분사 데이터 소스를 공유 당신의 DAO 클래스에 빈은,. JdbcTemplate과를 [XML의 구성 및 데이터 소스 세터에 new JdbcTemplate(dataSource) 있기 때문에이 여러 JdbcTemplate을 인스턴스로 연결] 데이터 소스에 대한 세터 생성됩니다
  • 사용하는 구성 요소를 스캔하고이 의존성 주입을위한 nnotation 지원. 이 경우 클래스에 @Repository (구성 요소 검색을위한 후보로 지정)로 주석을 추가하고 @Autowired로 DataSource setter 메서드에 주석을 추가합니다. [이 경우 여러 개의 JdbcTemplate 인스턴스로 연결]
  • Spring의 JdbcDaoSupport 클래스를 사용하고 있고 다양한 JDBC 기반 DAO 클래스가이 클래스에서 확장되면 하위 클래스는 다음과 같이 setDataSource (..) 메소드를 상속합니다. JdbcDaoSupport 클래스. 이 클래스에서 상속할지 여부를 선택할 수 있습니다. JdbcDaoSupport 클래스는 편의상 제공됩니다. 그러나

, 나중에 메모, 낙담 [당신이 그것을 확장 각 클래스 JdbcDaoSupport의 인스턴스를했습니다 이후, JdbcTemplate을의 인스턴스 너무 파생 클래스의 각 인스턴스에 대해 (source code for JdbcDaoSupport 참조)가있다] 모든 방금 제시된 옵션 :

일단 구성되면 JdbcTemplate 인스턴스는 threadsafe입니다. 응용 프로그램이 여러 개의 데이터 소스를 필요로하는 여러 개의 데이터베이스에 액세스하는 경우 여러 개의 JdbcTemplate 인스턴스가 필요할 수 있으며 이후 여러 개의 다른 JdbcTemplates가 구성됩니다. 즉

, 단지 여러 JdbcTemplate을 인스턴스를 (하나 당 DAO)를 가진 발생합니다 제시된 모든 옵션 및 문서가 하나의 데이터베이스로 작업 할 때 그 필요하지 않습니다 말한다 직후.

내가해야 할 일은 직접적으로 JdbcTemplate을 다양한 DAO에 주입하는 것입니다. 제 질문은 그렇게 할 수 있습니까? 또한 스프링 참조 문서가 자기 모순이라고 생각합니까? 아니면 내 오해입니까?

+2

그냥 하나의 데이터 소스/데이터베이스 스키마 – tom

+0

봄 문서되지에게 자기 모순 당 JdbcTemplate을을 사용하여 생각하지 않습니다. 이전 문장을 읽어야한다 - 위의 템플릿 초기화 스타일 중 어떤 것을 사용하든 (사용하지 않든) 상관없이, SQL을 실행할 때마다 JdbcTemplate 클래스의 새 인스턴스를 만드는 것은 거의 필요하지 않다. 가장 좋은 방법은 DAO 당 JdbcTemplate입니다. 복수의 데이터 소스만을 필요로하는 경우, 복수의 JdbcTemplates – hutingung

답변

2

IMO, JdbcTemplate을 (여러) DAO에 삽입하는 데 문제가 없습니다. 이 템플릿은 DB 쿼리를 실행해야 할 때 DAO를 실제 리소스 (db 연결)에 "연결"하는 데 사용됩니다. 따라서 SessionFactory와 TransactionManager가 적절하게 설정되어 있다면 동시성 문제가 발생하지 않을 것입니다. Spring은 지속성 계층 작업에 필요한 빈의 라이프 사이클을 관리합니다. 템플릿을 사용할 때의 장점은 다음과 같습니다.

  1. JDBC 템플릿은 DB와 자동으로 상호 작용하는 데 필요한 물리적 리소스를 관리합니다. 데이터베이스 연결을 작성하고 해제하십시오.
  2. Spring JDBC 템플릿은 표준 JDBC SQLException을 RuntimeExceptions로 변환합니다.이렇게하면 오류에보다 유연하게 대처할 수 있습니다.

    우리는, 우리는 다음과 같이 정의 할 수 있습니다 DAO에서 JdbcTemplate을 속성을 변경하지 마십시오 : 봄 JDBC 템플릿은 더 나은 이해 오류 메시지

0

그래서 유출해야 두 가지 상황에 또한 공급 업체 특정 오류 메시지를 변환합니다

<bean id="tlmJDBCTemplate" class="org.springframework.jdbc.core.JdbcTemplate"    <property name="dataSource" ref="plmTlmDataSource"/>   
    </bean> 

참고 :이 필요가 없기 때문에 시간의 대부분은 우리가 JdbcTemplate과 속성을 변경하지 마십시오.

DAO에서 JdbcTemplate 속성을 변경 했으므로 JdbcDaoSupport를 확장해야합니다.

State: 
• fetchSize: If this variable is set to a non-zero value, it will be used for setting the fetchSize property on statements used for query processing(JDBC Driver default) 
• maxRows: If this variable is set to a non-zero value, it will be used for setting the maxRows property on statements used for query processing(JDBC Driver default) 
• queryTimeout: If this variable is set to a non-zero value, it will be used for setting the queryTimeout property on statements used for query processing.(JDBC Driver default) 
• skipResultsProcessing: If this variable is set to true then all results checking will be bypassed for any callable statement processing. This can be used to avoid a bug in some older Oracle JDBC drivers like 10.1.0.2.(false) 
• skipUndeclaredResults: If this variable is set to true then all results from a stored procedure call that don't have a corresponding SqlOutParameter declaration will be bypassed. All other results processing will be take place unless the variable {@code skipResultsProcessing} is set to {@code true}(false) 
• resultsMapCaseInsensitive: If this variable is set to true then execution of a CallableStatement will return the results in a Map that uses case insensitive names for the parameters if Commons Collections is available on the classpath.(false) 
  1. JdbcDaoSupport

    공공 추상 클래스 JdbcDaoSupport는 DaoSupport {

    private JdbcTemplate jdbcTemplate; 
    
    
    /** 
    * Set the JDBC DataSource to be used by this DAO. 
    */ 
    public final void setDataSource(DataSource dataSource) { 
        if (this.jdbcTemplate == null || dataSource != this.jdbcTemplate.getDataSource()) { 
         this.jdbcTemplate = createJdbcTemplate(dataSource); 
         initTemplateConfig(); 
        } 
    } 
    

요약을 확장 : 나는 봄이 가이드의 연습이 최고 줄 생각하지 않습니다.

0

본질적으로 봄은 모범 사례에 대해 매우 미묘합니다.

JdbcTemplate은 thread-safe, 특히 lock-free (v4.2.4)입니다. 동시 스레드간에 공유 할 때 성능 저하가 발생해서는 안됩니다 *. 따라서 데이터 원본마다 둘 이상의 인스턴스에 대한 강력한 이유가 없습니다.

투기 적 메모 :이 섹션은 실제로 혼란 스럽습니다. 아마도 역사적인 (진화론 적) 이유 때문일 것입니다. 어쩌면 봄에는 비 스레드 안전성 또는 한 번에 도메인의 부족한 요구로 인해 과거에 DAO 정책이있었습니다. xml 기반 구성 "재앙"과 유사합니다. 요즘 봄은 유화 된 견해를 포기하고 대신 유연 해 지려고 노력합니다. 불행히도, 나쁜 디자인 선택이 은밀하게 만 인식되게 만들었습니다.

* 측정

관련 문제