6

dbcp를 사용하여 연결 풀링을 정확히 사용할 수있는 방법을 설명 할 수 있습니까? (가능한 경우 몇 가지 예제 코드 포함). 나는 그것을 켜는 방법을 알아 냈다 - KeyedObjectPoolFactory를 PoolableConnectionFactory로 전달. 그런데 구체적인 준비된 진술은 어떻게 정의되어야합니까? 지금 당장 PoolingDataSource를 사용하여 풀에서 연결을 가져옵니다. 풀에서 준비된 문장을 어떻게 사용합니까?dbcp에서 PreparedStatement 풀링 사용

+0

KeyedObjectPoolFactory에 대해 무엇을 전달하고 있습니까? GenericKeyedObjectPoolFactory의 생성자에는 KeyedPoolableObjectFactory가 필요하며 PreparedStatement가 사용되는 Connection을 사용하는 생성자 중 하나를 만드는 방법을 알지 못합니다. –

답변

6

풀에서 연결을 얻는 것에 대해 "풀링되지 않은"연결을 얻는 것에 대해 이야기하고 있습니다. 코드에 변경 사항이 있습니까? 나는 네가하지 않을 걸. 준비된 진술과 동일합니다. 코드가 변경되지 않아야합니다. 따라서 여기에는 유용한 코드 예제가 없습니다.

JDBC 데이터 소스 구현에 대한 문서를 읽고 풀링에 대해 개발자가 무엇을 말하고 있는지 확인해야합니다. 이에 대한 신뢰할 수있는 정보의 다른 출처는 없습니다.

here : 이 구성 요소는 PreparedStatements를 풀링 할 수도 있습니다.

* public PreparedStatement prepareStatement(String sql) 
* public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency) 

그래서, 당신은 단지의 prepareStatement() 호출을 사용하여 유지하고 DBCP는 이론적으로 처리됩니다 : 성명 풀이 다음 방법 중 하나에 의해 만들어진 각각의 연결 및자는 PreparedStatements 생성됩니다 활성화되면 풀링됩니다 풀링 (예 : "select * from us where u : name like : id"를 만들려고 시도하는 경우 풀에서이 문을 먼저 찾으려고합니다.)

+0

정말요? 그렇다면 PoolableConnectionFactory에는 명령문 풀링을위한 매개 변수가있는 이유는 무엇입니까? 분명히 그것을 설정하는 방법이 있어야합니다. Apache는 평상시처럼 도움이되지 않습니다. – sproketboy

+0

@ Dan : 당신의 코멘트를 확장 하시겠습니까? 당신이 대답하지 않은 부분은 무엇입니까? 질문을 다시 읽으면 작성자가 이미 문에 대한 풀링을 사용하는 방법을 알고 있습니다. 그는 코드에서 변경해야 할 사항이 있는지 궁금해하고 있습니다. –

+1

아파치에서 문서가 흔히 없기 때문에 죄송합니다. – sproketboy

1

다음은 내가 사용하는 기본 코드입니다. 단일 Connection를 사용하는 경우

GenericObjectPool connectionPool = new GenericObjectPool(null); 
    connectionPool.setMinEvictableIdleTimeMillis(1000 * 60 * 30); 
    connectionPool.setTimeBetweenEvictionRunsMillis(1000 * 60 * 30); 
    connectionPool.setNumTestsPerEvictionRun(3); 
    connectionPool.setTestOnBorrow(true); 
    connectionPool.setTestWhileIdle(false); 
    connectionPool.setTestOnReturn(false); 

    props = new Properties(); 
    props.put("user", username); 
    props.put("password", password); 
    ConnectionFactory connectionFactory = new DriverManagerConnectionFactory(url, props); 

    PoolableConnectionFactory poolableConnectionFactory = new PoolableConnectionFactory(connectionFactory, connectionPool, null, "SELECT 1", false, true); 
    PoolingDataSource dataSource = new PoolingDataSource(connectionPool); 
+2

이것은 옳지 않을 수 있습니다. PoolableConnectionFactory의 세 번째 인수에 null을 전달하면 PreparedStatement 캐싱이 비활성화됩니다 (http://commons.apache.org/dbcp/apidocs/org/apache/commons/dbcp/PoolableConnectionFactory.html#PoolableConnectionFactory(org.apache.commons.dbcp). ConnectionFactory, org.apache.commons.pool.ObjectPool, org.apache.commons.pool.KeyedObjectPoolFactory, java.lang.String, boolean, boolean)를 호출합니다. 그 주장에 대해 무엇을 사용해야합니까? –

0

건이며, 당신이 원하는 여부 PreparedStatement의 캐시 것, 이것에 영향을 미칠 수있는 유일한 방법은 DataSource 속성을 사용하거나 공급 업체 특정 API를 사용하는 것입니다. 그러나 이러한 명령문은 다른 연결에서 볼 수 없으며 다른 연결을 사용하여 동일한 명령문을 준비하면 다시 작성됩니다. DBCP와 같은 연결 풀은 서로 다른 연결 (Connection 대신 PooledConnection 인터페이스를 사용함) 사이에서 PreparedStatement의 재사용을 허용하므로 모든 연결에서 준비된 모든 명령문을 추적합니다.

업데이트 : 나는 C3P0에서이 기능을 찾을 수 없었다.