【问题标题】:Issue closing data source connection关闭数据源连接的问题
【发布时间】:2022-01-02 03:10:17
【问题描述】:

我有一个已设置的数据源,然后由第三方软件用于执行 sql。运行 sql 后,我有另一个 bean 执行并关闭连接。

@Bean
public DataSource datasource() {
    HikariConfig myconfig = new HikariConfig();
    ...
    return new HikariDataSource(myconfig);
}

@Bean
@DependsOn("sqlproject")
public void closeConnection() throws SQLException {
    Connection c = datasource().getConnection();
    try {
        c.close();
    } 
    finally {
        System.out.println(c.isClosed());
    }
}

但是,我显然仍然可以使用该数据源连接到特定数据进行本地调用。我不应该打电话给datasource(),因为这会创建一个新实例吗?我做错了什么?

【问题讨论】:

    标签: java database-connection datasource


    【解决方案1】:

    你是对的,当你从配置类调用datasource 时,会创建新实例,因为Spring AOP doesn't support self invocation via this

    此外,即使您正确使用了此 AOP,它也不会关闭 DataSource,因为您正在创建新连接(通过 getConnection() 然后关闭它。

    如果你想关闭HikariDataSource,那么你需要调用HikariDataSource#close

    此外,您不需要在 void 方法上添加 @Bean 注释,因为它没有任何意义。

    【讨论】:

    • 我需要在同一个datasource() 方法中调用HikariDataSource#close 吗?在不创建新实例的情况下如何关闭它?此外,奇怪的是,当没有 @Bean 注释时,不会调用 closeConnection() 方法;我也有同样的想法。
    • 什么时候需要调用这个方法?
    • 我需要在“sqlproject”库完成执行后调用它;在 DataSource 已经设置之前不会发生。我知道closeConnection() 总是在之后被调用,这就是我尝试使用它的原因。 DriverManager#getConnection 有用吗?
    • 如果某事完成后需要调用某事,则需要使用@PreDestroy注解,DisposableBean接口或者可以听ContextRefreshedEvent(baeldung.com/spring-events)并根据需要执行你想要的代码在ApplicationContext 状态
    • 我认为@PreDestroy 是为了在删除过程的一开始就执行某些操作?所以,我需要一个DisposableBean 然后,我想创建它自己的destroy() 方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-10
    • 2013-05-23
    • 2021-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多