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
을 사용하여 내 생성자를 오염시키지 않았지만 좋은 생각이라고 생각하지 않습니까?
편집 : 웹 응용 프로그램이 아니며 현재 종속성 주입 프레임 워크가 사용되지 않습니다.
감사합니다.
현재 DI 프레임 워크가 없습니다. 나는 실제로 리플렉션을 사용하여 패킷 인스턴스를 생성하고있다 (수천 개가있다. 모두 동일한 생성자 ==> "IncomingPacket incomingPacketInstance = incomingPacketConstructor.newInstance (pooledQueryExecutor);"), DB를 사용하는 패킷을 표시하는 인터페이스는 (깨끗한 "리플렉션 코드"를 유지하기위한) 옵션이 아닙니다. "private static PooledQueryExecutor db;"를 넣으면 어떨까요? 기본 클래스 (IncomingPacket) 내부. 한 번만 설정하면 JUnits에 대한 mock 객체를 설정할 수 있습니다. – AndrewBourgeois
정말 재미있는 세부 정보를 제공했습니다. 나는 "인터페이스"접근 방식이 이제 더 나아 졌다고 생각한다. 그냥'incomingPacketInstance' 콜렉션을 반복하고'instanceof'를 사용하십시오. 장래에 더 많은 의존성이 필요하다면'* Aware' 인터페이스를 추가 할 수 있습니다. 'static' 필드 ('final' 일 수는 없습니다)는 미래의 고통이 될 것입니다. –
인터페이스 접근법을 살펴 보겠다. 패킷에 여러 객체가 있으면 더 좋을 것이다. 고맙습니다 ! – AndrewBourgeois