Spring jdbcTemplate - 连接已关闭

时间:2016-10-14 17:51:33

标签: java spring jdbc spring-jdbc jdbctemplate

我的Jersey REST应用程序遇到了一个长期存在的问题,它利用Spring $(document).ready(function() { $('#calendar').fullCalendar({ header: { left: 'prev,next today', right: 'month,agendaWeek' }, defaultView: 'month', viewRender: function(view) { var title = view.title; $("#externalTitle").html(title); } }); }); 制作基本jdbcTemplateSELECTINSERT和{{1}查询到我们的数据库(我们使用DB2)。

这个问题每隔几天发生一次,所以我没有System.out的错误内容(下次发生时我会包含错误的屏幕截图)。每隔几天左右,我的REST服务中的一些查询由于“连接已关闭”而开始失败。错误。每当我收到此错误时,我只需重新启动tomcat应用程序服务器,问题就会解决几天,直到它再次开始发生。

每隔几天重新启动服务器一旦开始使用它们,对我们的最终用户来说将是不可接受的解决方案。因此,如果有人知道为什么会发生这种情况以及如何永久解决问题,请告诉我。

这是我的Spring数据源配置:

UPDATE

这是我的application.properties:

DELETE

我的pom.xml,其中包含spring jdbc和驱动程序依赖项

package com.my.package;

import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
import javax.sql.DataSource;

@Configuration
public class DataSourceConfig {

    @Bean (name = "dataSource1")
    @Primary
    @ConfigurationProperties(prefix = "ds1.datasource")
    public DataSource dataSource1() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "ds1")
    public JdbcTemplate jdbcTemplate1(@Qualifier("dataSource1") DataSource dataSource1) {
        return new JdbcTemplate(dataSource1);
    }

    @Bean (name = "dataSource2")
    @ConfigurationProperties(prefix="ds2.datasource")
    public DataSource dataSource2() { return DataSourceBuilder.create().build(); }

    @Bean(name = "ds2")
    public JdbcTemplate jdbcTemplate2(@Qualifier("dataSource2") DataSource dataSource2) {
        return new JdbcTemplate(dataSource2);
    }
}

最后,我使用jdbcTemplate执行简单ds1.datasource.url=url1 ds1.datasource.username=user1 ds1.datasource.password=pass1 ds1.datasource.driver-class-name=com.ibm.db2.jcc.DB2Driver ds2.datasource.url=url2 ds2.datasource.username=user2 ds2.datasource.password=pass2 ds2.datasource.driver-class-name=com.ibm.db2.jcc.DB2Driver 查询的示例

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
    <groupId>ibm.db2</groupId>
    <artifactId>db2jcc4.jar</artifactId>
    <version>4.19.26</version>
</dependency>

编辑:错误仍在发生。这次我能够捕获日志。它基本上只是说“无法验证新建立的连接”。我不知道为什么。

SELECT

编辑#2:最后将@ exoddus的答案标记为正确答案。在阅读了他的答案并查看了他提供的Spring JDBC文档(这使我得到了底层的tomcat JDBC连接池文档)后,我开始使用许多不同的属性,直到它工作正常。

以下是我在生产环境中使用的当前配置:

@Autowired
@Qualifier("ds1")
private JdbcTemplate jdbcTemplate;

List<Something> sampleQuery(){
    String sqlQuery = "SELECT * FROM TABLE";
    try {
        return this.jdbcTemplate.query(
                sqlQuery,
                (rs, rowNum) -> {

                    Something something = new Something();
                    something.setVal1(rs.getString("FIELD1").trim());
                    something.setVal2(rs.getString("FIELD2").trim());

                    return something;
                });
    }catch (Exception ex){
        ex.printStackTrace();
        System.out.println("error...");
        return new ArrayList<>();
    }
}

重复ds2。自从我在大约6个月前实施它以来,这种配置工作得很好。

1 个答案:

答案 0 :(得分:3)

根据您的上下文,我会尝试配置DataSource bean的一些参数。也许在几天后你会失去联系,因为其中一些从未被释放或完成(我猜)。

尝试将该属性添加到application.properties:

ds1.datasource.max-active=50
ds1.datasource.max-idle=8
ds1.datasource.max-wait=10000
ds1.datasource.min-idle=4
ds1.datasource.test-on-borrow=true

ds2

相同

正确的值取决于您的环境/硬件。看看here,了解有关数据源和池的简洁解释。

Here你可以在春天找到关于DataSource的另一个有趣的问题,可以帮到你。