2011-11-21 4 views
2

SQL 문을 실행하는 데 사용하는 클래스에 캡슐화 된 일부 c3p0 풀이 있습니다. 같은 클래스 내에서 - -여러 클래스 사이에 JDBC 연결 풀 공유

public PooledQueryExecutor(String url, Properties connectionProperties) throws DALException { 
     try { 
      dataSource = new ComboPooledDataSource(); 
      dataSource.setDriverClass(DRIVER); 
      dataSource.setJdbcUrl(url); 
      dataSource.setProperties(connectionProperties); 
     } catch (PropertyVetoException ve) { 
      throw new DALException(ve); 
     } 
    } 

그럼 난 기본 작업을 수행하기 위해 어떤 방법을 사용하십시오 : 이런 식으로 초기화 것

public CachedRowSet executeSelect(String sql) throws DALException { 
     // Get a connection, execute the SQL, return the rows that match, return resources to the pool 
    } 

은 "질문"입니다 :
나는 다른 많은이를 내가받는 네트워크 패킷을 나타내는 클래스. 대부분의 클래스는 DB 조작을 수행하기 위해이 PooledQueryExecutor를 가져야하지만 일부는 그렇지 않습니다. 이 PooledQueryExecutor를 필요로하는 클래스의 생성자 (패킷의 80 %)에 전달합니까, 아니면 PooledQueryExecutor를 싱글 톤으로 만드나요? 아니면 "다른 것"일까요? 나도 비록 ThreadLocal을 사용하여 내 생성자를 오염시키지 않았지만 좋은 생각이라고 생각하지 않습니까?

편집 : 웹 응용 프로그램이 아니며 현재 종속성 주입 프레임 워크가 사용되지 않습니다.

감사합니다.

답변

2

DI 프레임 워크를 사용하고 있지 않다고 가정합니까? 그것을 요구하는 클래스의 생성자에

  • 패스 PooledQueryExecutor :이 경우 당신은 몇 가지 선택이있다. 이것은 실제로 테스트와 아키텍처 관점에서 꽤 좋습니다. 그럼 당신도 수업을 반복하고 이것과 PooledQueryExecutor이 필요한 곳에 주입하는 구현 발견 할 수


interface PooledQueryExecutorAware { 

    void setPooledQueryExecutor(PooledQueryExecutor executor); 

} 

:

  • 는 JDBC를 필요로하는 클래스와 같은 몇 가지 간단한 인터페이스를 구현할 수 있습니다. 당신은 여기서 DI를 재발견하는 한 걸음이지만 결코 신경 쓰지 마십시오.

    • 비슷한 접근 방식은 종속성으로 PooledQueryExecutorAware을 필요로하고 protected final 필드를 유지했을 추상 기본 클래스를 생성하는 것입니다.

    • 모든 클래스 PooledQueryExecutor 알고하자 - 불필요한 커플 링, 권장하지

    • 싱글은 입니다 최악의 당신이 코드를 이해하기 검증 할 하드를, 무엇을 할 수 있는지. 제발, 하지마.

    • ThreadLocal? 잊어 버려. 기억하십시오, 묘사는 왕입니다.

    JdbcTemplate도 확인하십시오. 그것은 Spring의 일부이지만, 전체 프레임 워크를 사용하지 않고 spring-jdbc.jar 및 기타 몇 개만 포함 할 수 있습니다. 귀하의 PooledQueryExecutor을 쉽게 대체 할 수 있다고 생각합니다.

  • +0

    현재 DI 프레임 워크가 없습니다. 나는 실제로 리플렉션을 사용하여 패킷 인스턴스를 생성하고있다 (수천 개가있다. 모두 동일한 생성자 ==> "IncomingPacket incomingPacketInstance = incomingPacketConstructor.newInstance (pooledQueryExecutor);"), DB를 사용하는 패킷을 표시하는 인터페이스는 (깨끗한 "리플렉션 코드"를 유지하기위한) 옵션이 아닙니다. "private static PooledQueryExecutor db;"를 넣으면 어떨까요? 기본 클래스 (IncomingPacket) 내부. 한 번만 설정하면 JUnits에 대한 mock 객체를 설정할 수 있습니다. – AndrewBourgeois

    +0

    정말 재미있는 세부 정보를 제공했습니다. 나는 "인터페이스"접근 방식이 이제 더 나아 졌다고 생각한다. 그냥'incomingPacketInstance' 콜렉션을 반복하고'instanceof'를 사용하십시오. 장래에 더 많은 의존성이 필요하다면'* Aware' 인터페이스를 추가 할 수 있습니다. 'static' 필드 ('final' 일 수는 없습니다)는 미래의 고통이 될 것입니다. –

    +0

    인터페이스 접근법을 살펴 보겠다. 패킷에 여러 객체가 있으면 더 좋을 것이다. 고맙습니다 ! – AndrewBourgeois

    0

    나는 풀 설정 (주입)을 선호합니다. 그런 식으로 어떤 인스턴스가 다른 풀을 가져야하는지 결정할 수 있습니다. 풀 (들)을 로거 등으로 래핑 할 수 있으며 풀이 필요한 클래스가 명확합니다.

    또한 코드를 테스트하기가 더 쉽다고 생각합니다.

    0

    예를 들어, 웹 서버는 JNDI를 실행하고 JNDI에서 데이터 소스를 가져 오는 것입니다. Simpel JDNI 구현은 독립형 애플리케이션을 위해 존재합니다.

    프로그램에서 종속성 삽입을 사용하면 필요한 곳으로 주입 할 수있는 훌륭한 리소스의 예입니다. 이는 Java EE 6 또는 Spring/Guice/CDI 사용 응용 프로그램을 의미합니다.

    0

    개체는 네트워크 패킷을 나타 냅니까? 데이터베이스 연결을 사용하는 대상은 무엇입니까? 이건 내게 맞는 느낌이 아니야. 당신이하려는 일에 대해 좀 더 이야기하고 싶습니다. 그리고 당신의 건축은 무엇입니까?

    패킷 개체를 도메인의 순수한 모델로 만들기 위해 상태를 유지할 수 있으며 동작을 정의해야하지만 데이터베이스에서 문제를 일으키지 않아야합니다. 데이터베이스 액세스는 시스템, 스토리지 계층 또는 하위 시스템의 다른 부분이어야합니다. 중요한 객체가 싱글 톤이 될 수도 있습니다 (또는 최소한 싱글 톤이 아닌 경우에도 단일 인스턴스를 가질 수 있음). 그리고 매우 자연스럽게 단일 글로벌 연결 풀을 포함 할 수 있습니다.

    그러면 도메인 오브젝트가 스토리지 서브 시스템과 어떻게 상호 작용하는지에 대한 질문이 있습니다. 실제로 연결 풀에 대해 물어 본 것과 같은 질문이 있습니다. 일반적으로, 나는 일종의 컨트롤러 객체를 가지고있어 프로그램의 작업을 조정한다. 그들은 서로 다른 층에있는 물건들과 대화하고 서로 소개하기에 적절합니다.

    구체적인 예가이 설명을 더 쉽게 만듭니다. 귀하의 패킷에 대해 알려주십시오!