2014-04-15 2 views
1

나는 java.sql.DataSource 및 연결 풀링을 사용할 때이 연결이 부족하고있어, 준비된 문을 ... 재사용 할 수 keepStatement() 방법을 사용하면JOOQ는 keepStatement를 사용하는 경우 연결을 종료하지 않는 것 같다()

private void keepStatmentTest() 
{ 
    Settings jooqSettings = = new Settings(); 
    jooqSettings.setRenderSchema(false); 
    InitialContext ic = new InitialContext(); 
    DataSource ds = (DataSource) ic.lookup(dataSourceName); 
    DSLContext create = DSL.using(dataSource, SQLDialect.MYSQL, jooqSettings) 

    for (int i = 0; i < 100; i++) 
    { 
     ResultQuery<Record1<String>> q = create.select(ROLES.NAME) 
      .from(ROLES) 
      .where(ROLES.ID.equal(DSL.param("p", 0))) 
      .keepStatement(true); 
     q.bind("p", 1); 
     q.execute(); 
     q.bind("p", 2); 
     q.execute(); 
     q.close(); 
    } 
} 

결과 (최대 연결 풀에서 허용 (10 개) 열린 연결.) : 나는 위의 코드에서 .keepStatement(true)을 제거하면 모든 문제없이 실행

org.jooq.exception.DataAccessException: Error getting connection from data source [email protected] 
    at org.jooq.impl.DataSourceConnectionProvider.acquire(DataSourceConnectionProvider.java:89) 
    at org.jooq.impl.DefaultExecuteContext.connection(DefaultExecuteContext.java:426) 
    at org.jooq.impl.AbstractQuery.execute(AbstractQuery.java:278) 
    ... 
Caused by: org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot get a connection, pool error Timeout waiting for idle object 
    at org.apache.tomcat.dbcp.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:114) 
    at org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044) 
    at org.jooq.impl.DataSourceConnectionProvider.acquire(DataSourceConnectionProvider.java:86) 
    ... 23 more 
Caused by: java.util.NoSuchElementException: Timeout waiting for idle object 
    at org.apache.tomcat.dbcp.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:1167) 
    at org.apache.tomcat.dbcp.dbcp.AbandonedObjectPool.borrowObject(AbandonedObjectPool.java:79) 
    at org.apache.tomcat.dbcp.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:106) 
    ... 25 more 

은 (연결 실행 후 가까운).

나는 ResultQueryclose() 메서드를 호출했지만 연결을 닫지 않는 것으로 보입니다. 다른 항목도 닫아야합니까?

(JOOQ 버전 3.3.1)

답변

1

이 jOOQ 3.3.1 및 이전 버전,보고를위한 감사의 버그입니다. 가능한 한 빨리이 문제를 해결하기 위해 issue #3191을 만들었습니다 (jOOQ 3.4.0, 3.3.3, 3.2.6). jooQ와 함께 DataSource을 사용할 때 keepStatement() 의미론이 올바르게 구현되지 않은 것처럼 보입니다.

이 기능을 사용하지 않는 것이 좋습니다.

+0

감사합니다. 정보를 제공해 주셔서 감사합니다. – Mahe