gpt4 book ai didi

java - 长时间发送请求时出现 org.springframework.transaction.CannotCreateTransactionException

转载 作者:行者123 更新时间:2023-11-29 21:24:37 27 4
gpt4 key购买 nike

我正在使用 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 Controller 代码,请告诉我,我会发布它。

PD:我正在使用 POST MAN REST CLIENT 来测试我的应用程序。

编辑:我总是遇到读取超时异常,除非重新启动服务器,否则我无法向服务器发送更多请求。这意味着在异常发生后,我从任何客户端发送的每个请求都会不断收到异常,并且获得预期结果的唯一方法是重新启动应用程序(嵌入式 tomcat)

最佳答案

我已将问题范围缩小为 Spring-Boot 自动配置管理连接池的问题。读完这篇文章后我确认了我的诊断 https://aodcoding.wordpress.com/2015/05/22/handling-connection-pool-issues-in-spring-boot/

因此,我通过添加连接池属性来解决问题,我决定不使用我提到的文章中描述的 C3P0 属性,而是使用 spring boot 属性,如下所示:

spring.datasource.max-active=50
spring.datasource.initial-size=5
spring.datasource.max-idle=10
spring.datasource.min-idle=5
spring.datasource.test-while-idle=true
spring.datasource.test-on-borrow=true
spring.datasource.validation-query=SELECT 1 FROM DUAL
spring.datasource.time-between-eviction-runs-millis=5000
spring.datasource.min-evictable-idle-time-millis=60000

据我所知,问题已经解决。我已经等待很长时间并重新向我的服务发送请求,并且我得到了正确的答复。我的下一步是开始启用 spring 安全配置以保护 REST 服务。

希望这对任何与我遇到同样问题的人有所帮助。因为如果您看到异常,并不太清楚问题是由于连接池引起的,您会尝试按照错误的方向解决问题。

关于java - 长时间发送请求时出现 org.springframework.transaction.CannotCreateTransactionException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35569232/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com