Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 长时间后发送请求时获取org.springframework.transaction.CannotCreateTransactionException_Java_Mysql_Spring_Rest_Spring Boot - Fatal编程技术网

Java 长时间后发送请求时获取org.springframework.transaction.CannotCreateTransactionException

Java 长时间后发送请求时获取org.springframework.transaction.CannotCreateTransactionException,java,mysql,spring,rest,spring-boot,Java,Mysql,Spring,Rest,Spring Boot,我正在使用SpringBoot开发一个RESTAPI应用程序。当我启动服务器(使用嵌入式tomcat)并开始向API发送请求时,我得到了预期的响应。但是,假设我在发送另一个请求之前等待了30分钟,那时我得到了一个org.springframework.transaction.CannotCreateTransactionException,根本原因是java.net.SocketTimeoutException:Read timeout 我的应用程序连接到远程MySQL服务器数据库 我的WebA

我正在使用SpringBoot开发一个RESTAPI应用程序。当我启动服务器(使用嵌入式tomcat)并开始向API发送请求时,我得到了预期的响应。但是,假设我在发送另一个请求之前等待了30分钟,那时我得到了一个org.springframework.transaction.CannotCreateTransactionException,根本原因是java.net.SocketTimeoutException:Read timeout

我的应用程序连接到远程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;
    }
}
# 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
我的应用程序属性如下所示:

@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;
    }
}
# 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请求到达服务器时如何使我的应用程序打开一个新的应用程序。现在我还没有启用任何类型的安全性,我的意思是我不需要任何调用我的RESTAPI的客户端的身份验证,我将来会这样做,但现在没有必要

提前谢谢你,我愿意接受你能给我的任何建议和改进。如果您需要我的REST控制器代码,请告诉我,我会发布它

PD:我正在使用PostManREST客户端测试我的应用程序


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

我已将问题缩小为Spring Boot autoconfig管理连接池的问题。读了这篇文章后,我确认了我的诊断

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

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服务


希望这有助于任何人有相同的问题,我有。因为如果您看到异常,不太清楚问题是否是由连接池引起的,那么您将尝试按照错误的方向解决问题

会话已超时。请看Hi,我已经看到了那篇文章,问题是无法获得超时,而我的问题是我确实获得了超时,并且除非重新启动服务器,否则无法发送更多请求。我想我忘了提那件事了。我会编辑这篇文章。