我正在尝试使用JOOQ DSLContext.meta()
获取我的H2内存数据库中所有表的列表:
DSL_CONTEXT_PROVIDER.db().meta().getTables();
结果:
java.lang.RuntimeException: org.jooq.exception.DataAccessException: Error while accessing DatabaseMetaData
at MyTest.deleteEntities(MyTest.java:222)
at MyTest.cleanupDatabase(MyTest.java:201)
at MyTest.afterTestCase(MyTest.java:117)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
[... omitted for brevity ...]
Caused by: org.jooq.exception.DataAccessException: Error while accessing DatabaseMetaData
at org.jooq.impl.MetaImpl.getCatalogs(MetaImpl.java:160)
at org.jooq.impl.MetaImpl.getSchemas(MetaImpl.java:168)
at org.jooq.impl.MetaImpl.getTables(MetaImpl.java:179)
at MyTest.deleteEntities(MyTest.java:210)
... 29 more
Caused by: org.h2.jdbc.JdbcSQLException: The object is already closed [90007-174]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:332)
at org.h2.message.DbException.get(DbException.java:172)
at org.h2.message.DbException.get(DbException.java:149)
at org.h2.message.DbException.get(DbException.java:138)
at org.h2.jdbc.JdbcConnection.checkClosed(JdbcConnection.java:1410)
at org.h2.jdbc.JdbcConnection.checkClosed(JdbcConnection.java:1388)
at org.h2.jdbc.JdbcDatabaseMetaData.checkClosed(JdbcDatabaseMetaData.java:2963)
at org.h2.jdbc.JdbcDatabaseMetaData.getCatalogs(JdbcDatabaseMetaData.java:756)
at org.jooq.impl.MetaImpl.getCatalogs(MetaImpl.java:143)
... 32 more
DSL_CONTEXT_PROVIDER.db()
看起来像这样:
JdbcDataSource h2ds = new JdbcDataSource();
h2ds.setURL("jdbc:h2:mem:testDB;create=true");
h2ds.setUser("");
h2ds.setPassword("");
return DSL.using(new DefaultConfiguration().set(new DataSourceConnectionProvider(h2ds)));
普通查询可以正常使用上述配置,但不适用meta().getTables()
。如果我将DataSourceConnectionProvider
替换为不关闭连接的匿名实现,则不再抛出任何异常。
在基础连接关闭后,H2似乎不赞成在getCatalogs()
返回的对象上调用connection.getMetaData()
等方法。这是jooq-meta
中的错误(我使用3.7.0)还是我的配置存在缺陷?
答案 0 :(得分:1)
jOOQ 3.7.0 / 3.7.1及更早版本正在缓存DatabaseMetaData
中的org.jooq.Meta
。这是一个错误(4762),很快就会修复。
您遇到此问题的原因是因为您正在使用DataSourceConnectionProvider
,它并非真正用于独立连接,或者简单"简单& #34; DataSources
。它会在每次查询后关闭连接(通常转换为将其返回到池中)。关闭连接后,缓存的DatabaseMetaData
引用将过时。
您已经记录了解决方法:不要使用"简单"使用jOOQ的DataSource
API {/ 1}} {/ 1}}