Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.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 Spring引导、hibernate、hikariCP和mysql在不活动后没有通信_Java_Mysql_Hibernate_Spring Boot_Hikaricp - Fatal编程技术网

Java Spring引导、hibernate、hikariCP和mysql在不活动后没有通信

Java Spring引导、hibernate、hikariCP和mysql在不活动后没有通信,java,mysql,hibernate,spring-boot,hikaricp,Java,Mysql,Hibernate,Spring Boot,Hikaricp,我们正面临一个奇怪的错误。当我们第一次启动服务器时,我们可以登录等。在几个小时的不活动后,我们无法再登录。我们可以通过重新启动应用程序来解决这个问题,但它每天至少会发生一次。重新启动应用程序只是一个短期解决方案,我们需要找到一个更稳定的解决方案来解决这一关键问题 我正在使用以下配置: 环境 Hibernate : 5.2.13 JPA : spring-boot-starter-data-jpa (1.5.10) JDK version : 1.8.0

我们正面临一个奇怪的错误。当我们第一次启动服务器时,我们可以登录等。在几个小时的不活动后,我们无法再登录。我们可以通过重新启动应用程序来解决这个问题,但它每天至少会发生一次。重新启动应用程序只是一个短期解决方案,我们需要找到一个更稳定的解决方案来解决这一关键问题

我正在使用以下配置:

环境

Hibernate       : 5.2.13
JPA             : spring-boot-starter-data-jpa (1.5.10)
JDK version     : 1.8.0_191
Database        : Mysql (version 5.7.25)
JDBC Driver     : 5.1.45
Spring Boot     : 1.5.10
OS              : Ubuntu 16.04.6

Hikari

HikariCP version: 2.7.7

datasource:
        type: com.zaxxer.hikari.HikariDataSource
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://localhost:3306/<database>?useUnicode=true&characterEncoding=utf8&useSSL=false
        username: <username>
        password: <secret password>
        hikari:
            data-source-properties:
                cachePrepStmts: true
                prepStmtCacheSize: 250
                prepStmtCacheSqlLimit: 2048
                useServerPrepStmts: true
我真的不知道如何在重新启动后手动触发此问题,因此我们必须等待几个小时才能进入此状态

似乎我们不是唯一一个有这个问题的人,但是在几天没有解决它之后,这有点令人沮丧


我们需要尽快解决这个问题,有什么想法吗?

我找到了解决问题的办法。我们在yaml文件中所做的配置似乎无法正常工作,因此我必须以编程方式配置HikariCP

我在yaml文件中删除了hikari的配置,之后数据源看起来像:

datasource:
    type: com.zaxxer.hikari.HikariDataSource

数据源配置如下所示:

@Configuration
public class DatasourceConfiguration {

    private static final Logger log = LoggerFactory.getLogger(DatasourceConfiguration.class);

    private final Environment env;

    public DatasourceConfiguration(Environment env) {
        this.env = env;
    }

    @Bean(name="primaryDatasource")
    @Primary
    @ConfigurationProperties(prefix="spring.datasource")
    public DataSource dataSource() {

        HikariConfig config = new HikariConfig();
        config.setDriverClassName("com.mysql.jdbc.Driver");
        config.setPoolName("JPAHikariCP");
        config.setAutoCommit(false);
        config.setConnectionTestQuery("SELECT 1");

        String profile = env.getProperty("spring.profiles.active");

        Optional<String> db = Optional.of("database");
        Optional<String> username = Optional.of("user");
        Optional<String> password = Optional.of("pass");

        if("test".equals(profile) || "dev".equals(profile)) {
            config.addDataSourceProperty("cachePrepStmts", true);
            config.addDataSourceProperty("prepStmtCacheSize", 250);
            config.addDataSourceProperty("prepStmtCacheSqlLimit", 2048);
            config.addDataSourceProperty("useServerPrepStmts", true);
        }

        config.setJdbcUrl(String.format("jdbc:mysql://localhost:3306/%s?useUnicode=true&characterEncoding=utf8&useSSL=false", db.get()));
        config.setUsername(username.get());
        config.setPassword(password.get());

        return new HikariDataSource(config);
    }



}


@配置
公共类数据源配置{
私有静态最终记录器log=LoggerFactory.getLogger(DatasourceConfiguration.class);
私人最终环境保护;
公共数据源配置(环境环境){
this.env=env;
}
@Bean(name=“primaryDatasource”)
@初级的
@ConfigurationProperties(前缀=“spring.datasource”)
公共数据源数据源(){
HikariConfig config=新的HikariConfig();
config.setDriverClassName(“com.mysql.jdbc.Driver”);
config.setPoolName(“JPAHikariCP”);
config.setAutoCommit(false);
config.setConnectionTestQuery(“选择1”);
字符串profile=env.getProperty(“spring.profiles.active”);
Optional db=Optional.of(“数据库”);
可选用户名=可选的。of(“用户”);
可选密码=Optional.of(“pass”);
if(“test”.equals(profile)| |“dev”.equals(profile)){
config.addDataSourceProperty(“cachePrepsmts”,true);
config.addDataSourceProperty(“prepStmtCacheSize”,250);
config.addDataSourceProperty(“prepStmtCacheSqlLimit”,2048);
config.addDataSourceProperty(“UseServerPrepsmts”,true);
}
config.setJdbcUrl(String.format(“jdbc:mysql://localhost:3306/%s?useUnicode=true&characterEncoding=utf8&useSSL=false“,db.get());
config.setUsername(username.get());
config.setPassword(password.get());
返回新的HikariDataSource(配置);
}
}

现在它可以工作了。

您可能需要配置测试查询,如图所示,服务器(mysql)关闭了连接,但池仍然认为它是有效的连接。mysql有一个配置wait_timeout(秒),如果在该时间段之后未使用,则可以关闭连接。不熟悉HikariCP,通常需要配置验证查询,例如选择1。我不使用spring,我一直认为spring可以为您管理该查询,但当EntityManager不总是关闭时,我遇到了类似这样的连接问题。似乎在某些情况下,您的连接在完成后不会关闭。我通过在我的web应用程序上实现一个过滤器来修复它。
@Configuration
public class DatasourceConfiguration {

    private static final Logger log = LoggerFactory.getLogger(DatasourceConfiguration.class);

    private final Environment env;

    public DatasourceConfiguration(Environment env) {
        this.env = env;
    }

    @Bean(name="primaryDatasource")
    @Primary
    @ConfigurationProperties(prefix="spring.datasource")
    public DataSource dataSource() {

        HikariConfig config = new HikariConfig();
        config.setDriverClassName("com.mysql.jdbc.Driver");
        config.setPoolName("JPAHikariCP");
        config.setAutoCommit(false);
        config.setConnectionTestQuery("SELECT 1");

        String profile = env.getProperty("spring.profiles.active");

        Optional<String> db = Optional.of("database");
        Optional<String> username = Optional.of("user");
        Optional<String> password = Optional.of("pass");

        if("test".equals(profile) || "dev".equals(profile)) {
            config.addDataSourceProperty("cachePrepStmts", true);
            config.addDataSourceProperty("prepStmtCacheSize", 250);
            config.addDataSourceProperty("prepStmtCacheSqlLimit", 2048);
            config.addDataSourceProperty("useServerPrepStmts", true);
        }

        config.setJdbcUrl(String.format("jdbc:mysql://localhost:3306/%s?useUnicode=true&characterEncoding=utf8&useSSL=false", db.get()));
        config.setUsername(username.get());
        config.setPassword(password.get());

        return new HikariDataSource(config);
    }



}