我最近使用最新的Spring Boot Starter Framework重建了所有Spring 4项目。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.7.RELEASE</version>
</parent>
到目前为止,一切正常,除了我在所有重建项目中随机遇到PoolExhaustedException。
确切的例外是:
org.apache.tomcat.jdbc.pool.PoolExhaustedException: [http-nio-8080-exec-4] Timeout: Pool empty. Unable to fetch a connection in 20 seconds, none available[size:50; busy:50; idle:0; lastwait:20000].
我收到的最后一个异常来自一个从我的数据库下载文件的控制器:
@RequestMapping(value = "/getDocument/{value}/{text}", method = RequestMethod.GET)
public void get(HttpServletResponse response, @PathVariable String value, @PathVariable String text){
try {
Document ufile = documentService.getDocumentByID(Integer.parseInt(value));
response.setContentType(ufile.getType());
response.setContentLength(ufile.getContent().length);
FileCopyUtils.copy(ufile.getContent(), response.getOutputStream());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
服务:
@Transactional
public Document getDocumentByID(int id) {
Document r = this.documentDAO.getDocumentByID(id);
return r;
}
DAO:
@Transactional
public Document getDocumentByID(int id)
{
Session session = this.sessionFactory.getCurrentSession();
Document p = (Document) session.load(Document.class, new Integer(id));
return p;
}
我已经尝试用@Transactional注释Controller,这暂时解决了问题,但导致了其他的事务错误,所以我不得不将其删除。
我也试图通过project.properties来增加池,这只会延迟问题,但没有解决问题。
project.properties
spring.datasource.tomcat.max-wait=20000
spring.datasource.tomcat.max-active=50
spring.datasource.tomcat.max-idle=20
spring.datasource.tomcat.min-idle=15
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQLDialect
spring.jpa.properties.hibernate.id.new_generator_mappings = false
spring.jpa.properties.hibernate.format_sql = true
spring.mvc.view.prefix: /WEB-INF/views/
spring.mvc.view.suffix: .jsp
spring.jpa.properties.hibernate.current_session_context_class=org.springframework.orm.hibernate4.SpringSessionContext
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
答案 0 :(得分:0)
不确定具有这些名称的属性是否有效。
我还尝试设置断点并直接检查Tomcat DataSource以查看要确信的值(可以在测试中轻松自动装配)。
查看Spring Boot
Tomcat Datasource Configuration Tests我看到一些有趣的选项,例如minEvictableIdleTimeMillis,timeBetweenEvictionRunsMillis和maxWait都以spring.datasource.tomcat.
为前缀,请试试看。