【发布时间】:2016-02-09 05:24:41
【问题描述】:
这是我正在编写的一个使用 JooQ 3.7.0 的类的代码(不相关的部分已被剥离);注意DSLContext 的AutoCloseable 功能的使用:
public final class JooqPerMethodMetricWriter
implements PerMethodMetricWriter
{
private static final Logger LOGGER
= LoggerFactory.getLogger(JooqPerMethodMetricWriter.class);
// [snip]
private final DSLContext jooq;
public JooqPerMethodMetricWriter(final Connection connection,
final Instant instant)
throws IOException
{
// [snip]
jooq = DSL.using(connection);
}
private void writeCsv(final Configuration configuration)
{
// [snip]
try (
final DSLContext context = DSL.using(configuration);
final Reader reader = Files.newBufferedReader(csvPath);
) {
final Loader<PermethodMetricsRecord> loader = context
.loadInto(PERMETHOD_METRICS)
.loadCSV(reader)
.fields(PERMETHOD_METRICS.fields())
.execute();
LOGGER.info("{} lines stored in database", loader.stored());
} catch (IOException e) {
throw new RuntimeException("Cannot open CSV for reading", e);
}
// BREAKPOINT 1
}
@Override
public void close()
throws IOException
{
jooq.transaction(this::writeCsv);
jooq.close();
// BREAKPOINT 2
Files.delete(csvPath);
}
// [snip]
}
如果相关,使用的数据库是 PostgreSQL (9.4.x)。
在上面的代码中,我有两个断点。当我调试时,我看到:
- 在第一个断点处,
configuration.connectionProvider().acquire().isClosed()为假... - 在第二个断点处,
jooq.configuration().connectionProvider().acquire().isClosed()也是错误的。
我很困惑。我作为构造函数参数收到的Connection 发生了什么?我需要自己.close()吗?
附带问题,这次是关于Loader:我保留默认值,因此.commitNone();鉴于我在事务中运行加载程序,如果我尝试使用 .commit<somethingElse>() 代替,例如 .commitAfter(1000),它会有所不同吗?
【问题讨论】:
-
我可以请您在 Stack Overflow 上的一个单独问题中提出附带问题吗?它对未来的访问者会更有用...
-
@LukasEder 完成; here.
标签: java postgresql jooq