我的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);
}
});
});
制作基本jdbcTemplate
,SELECT
,INSERT
和{{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个月前实施它以来,这种配置工作得很好。
答案 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的另一个有趣的问题,可以帮到你。