나는 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
은 (연결 실행 후 가까운).
나는 ResultQuery
의 close()
메서드를 호출했지만 연결을 닫지 않는 것으로 보입니다. 다른 항목도 닫아야합니까?
(JOOQ 버전 3.3.1)
감사합니다. 정보를 제공해 주셔서 감사합니다. – Mahe