【发布时间】:2018-11-24 06:39:50
【问题描述】:
一旦原型 bean 超出使用 jooq starter 的 Spring Boot 项目的范围,我们可以清理 {filename}.db 吗?
destroy方法需要获取文件名句柄。
尝试将;DB_CLOSE_DELAY=-1 放在 URL 的末尾,但似乎不适用于 sqlite 文件。预期 DB_CLOSE_DELAY 的某个值会在最后删除文件或在内存中执行。
@Bean
public Function<String, DSLContext> dslFactory() {
return this::dsl;
}
@Bean
@Scope("prototype")
@ConfigurationProperties("datasource")
public DefaultDSLContext dsl(String filename) {
DataSource dataSource = DataSourceBuilder.create()
.url("jdbc:sqlite:" + filename + ".db")
.build();
DefaultConfiguration jooqConfiguration = new DefaultConfiguration();
jooqConfiguration.set(new DataSourceConnectionProvider(new TransactionAwareDataSourceProxy(dataSource)));
jooqConfiguration.set(new DefaultExecuteListenerProvider(new ExceptionTranslator()));
DefaultDSLContext context = new DefaultDSLContext(jooqConfiguration);
return context;
}
用法:
@Autowired
private Function<String, DSLContext> dslFactory;
DSLContext dsl = dslFactory.apply("xxx");
尝试在原型 bean 声明 DefaultExecuteListener.end 中覆盖,但它会在每个 dsl execute() 上被调用。像下面这样的东西本来是理想的 - 当最终 dslContext 超出范围时使用 lombok 清理,即在方法调用结束时具有 context.getBean/apply 如上所述,然后 {filename}.db 被删除。
@Cleanup DefaultDSLContext context = new DefaultDSLContext(jooqConfiguration);
【问题讨论】:
-
你不能用 jOOQ API 做到这一点,因为 jOOQ 不知道(或关心)你的 bean 生命周期。请改用 Spring 的 API。
-
@LukasEder 我们可以提供内存 sqlite 文件吗,比如 h2 支持在数据源的 url 中使用 :mem: 吗?我尝试为原型范围的 dslContext 编写一个 bean 后处理器,如上例所示,但由于连接仍然从 DSLContext 打开到数据库,它不允许删除 .db 文件。
-
这是一个与您提出的问题截然不同的问题,这里已经有了答案:stackoverflow.com/q/8831514/521799
标签: sqlite spring-boot jooq