【问题标题】:Can We Close and Open Connection from Bean Configuration?我们可以从 Bean 配置中关闭和打开连接吗?
【发布时间】:2019-10-01 03:43:08
【问题描述】:

所以,我使用@bean 配置创建了一些与数据库的连接,并使用hikariCP 作为数据源。这是我编写的一些代码。

DatabaseConfiguration.java

...
    @Primary
    public SqlSessionFactoryBean logSessionFactory(@Named(ResourceConfiguration.LOG) final DataSource dataSource) throws Exception{
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource);
        SqlSessionFactory sqlSessionFactory;
        sqlSessionFactory = sqlSessionFactoryBean.getObject();
        sqlSessionFactory.getConfiguration().addMapper(LogMapper.class);
        return sqlSessionFactoryBean;
    }

    @Bean
    public MapperFactoryBean<LogMapper> logMapperMapperFactoryBean(@Named(LOG) final SqlSessionFactoryBean sqlSessionFactoryBean) throws Exception {
        MapperFactoryBean<LogMapper> factoryBean = new MapperFactoryBean<>(LogMapper.class);
        factoryBean.setSqlSessionFactory(sqlSessionFactoryBean.getObject());
    return factoryBean;
}
...

ResourceConfiguration.java

...
    @Bean(name = LOG, destroyMethod = "")
    @ConfigurationProperties(prefix = "datasource.log")
    @Primary
    public DataSource dataSourceLog() {
        return new HikariDataSource();
    }
...

应用程序属性

...
datasource.log.jdbcUrl=<....>
datasource.log.username=<....>
datasource.log.password=<....>
datasource.log.maximum-pool-size=10
datasource.log.max-lifetime=0
datasource.log.idle-timeout=300000
datasource.log.leak-detection-threshold=2000
datasource.log.connection-timeout=30000
datasource.log.leak-detection-threshold=30000
datasource.log.initialization-fail-timeout=0
...

如果映射器被击中并且我在需要时使用@Autowired 调用映射器类,程序总是打开以获得第一次连接。我期待使用打开关闭连接,但事实并非如此。当连接断开时,hikariCP 总是给我connection timeout 30000ms。有没有办法让 SqlSessionFactory 在连接错误时关闭或打开连接?

【问题讨论】:

    标签: spring-boot hikaricp spring-mybatis


    【解决方案1】:

    好吧,我的简短回答是,当您拥有诸如 Hikari 之类的连接池时,您不需要打扰 DB 连接。你最终需要一些方法来查询你的数据库,对吧?您可以使用扩展 CrudRepository 或 JpaRepository 的 @Repository 接口来完成此操作。这样您就可以快速启动并运行。 如果您使用 Spring Boot,手动管理 DB 连接不是一个好主意。

    【讨论】:

    • 所以我们不需要打开和关闭连接?
    • 是的,你是对的。池本身管理连接的生命周期。它在大量使用数据库时创建并打开新连接;当数据库使用率低时,它会关闭打开的连接。它还会在关机时关闭它们。
    猜你喜欢
    • 2013-08-18
    • 2014-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多