【发布时间】:2016-02-23 05:04:38
【问题描述】:
我正在使用 Spring-Boot 开发一个 REST API 应用程序。事实证明,当我启动服务器(使用嵌入式 tomcat)并开始向我的 API 发送请求时,我得到了预期的响应。但是,假设我在发送另一个请求之前等待 30 分钟,那时我得到一个 org.springframework.transaction.CannotCreateTransactionException 根本原因 java.net.SocketTimeoutException: Read timed out。
我的应用程序连接到远程 MySQL 服务器数据库。
我的 WebApplicationStarter 类看起来如下:
@Configuration
@EnableAutoConfiguration
@ComponentScan("monitec")
public class WebApplicationStarter extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(WebApplicationStarter.class);
}
public static void main(String[] args) throws Exception {
ApplicationContext context = SpringApplication.run(WebApplicationStarter.class, args);
}
@Bean
public SessionFactory sessionFactory(HibernateEntityManagerFactory hemf) {
return hemf.getSessionFactory();
}
@Bean
public EmbeddedServletContainerFactory servletContainerFactory() {
TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory();
factory.addConnectorCustomizers(connector ->
((AbstractProtocol) connector.getProtocolHandler()).setConnectionTimeout(10000));
factory.setPort(7543);//TODO: Replace this hardcoded value by a system preference
factory.setSessionTimeout(20000);
// configure some more properties
return factory;
}
}
我的 application.properties 如下:
# Thymeleaf
spring.thymeleaf.cache: false
# Data Source
spring.datasource.url=jdbc:mysql://hostname:8888/schema_name
spring.datasource.username=xxxxxxxxx
spring.datasource.password=xxxxxxxxxxx
# Hibernate
spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect
spring.jpa.properties.hibernate.current_session_context_class=org.springframework.orm.hibernate4.SpringSessionContext
logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
#spring.jpa.generate-ddl=true
#spring.jpa.hibernate.ddl-auto=create
我研究了几篇帖子,但未能解决我的问题。我还将 sessionTimeout 设置为“-1”以使其无限,但它不起作用。我不知道是否可能是关闭连接的 MySQL 服务器,如果是这种情况,我想知道当新的 http 请求到达服务器时如何让我的应用程序打开一个新的应用程序。目前我还没有启用任何类型的安全性,我的意思是我不需要任何调用我的 REST API 的客户端进行身份验证,我会在将来这样做,但现在没有必要。
提前谢谢你,我愿意接受你能给我的任何建议和改进。如果您需要我的 REST 控制器代码,请告诉我,我会发布它。
PD:我正在使用 POST MAN REST CLIENT 测试我的应用程序。
编辑:我总是收到读取超时异常,除非我重新启动服务器,否则我无法向服务器发送更多请求。这意味着在异常之后,我从任何客户端发送的每个请求,我都会不断收到异常,而获得预期结果的唯一方法是重新启动应用程序(嵌入式 tomcat)
【问题讨论】:
-
会话超时。请参阅reference
-
嗨,我已经看到了那个帖子,问题是无法获得超时,而我的问题是我确实获得了超时并且无法发送更多请求,除非我重新启动服务器.我想我忘了提到这一点。我会编辑帖子。
标签: java mysql spring rest spring-boot