【问题标题】:cleanup sqlite db file on close关闭时清理 sqlite db 文件
【发布时间】: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


【解决方案1】:

这与您提出的问题完全不同,这里已经有了答案:stackoverflow.com/q/8831514/521799 – Lukas Eder

根据提供的链接,我们可以在url末尾使用::memory:来创建内存中的sqlite文件,否则不需要清理。

【讨论】:

    猜你喜欢
    • 2011-06-01
    • 1970-01-01
    • 2019-04-19
    • 1970-01-01
    • 2015-04-27
    • 2021-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多