Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.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 ApacheTomcat 8+;MySQL性能问题_Java_Mysql_Hibernate_Tomcat_Hikaricp - Fatal编程技术网

Java ApacheTomcat 8+;MySQL性能问题

Java ApacheTomcat 8+;MySQL性能问题,java,mysql,hibernate,tomcat,hikaricp,Java,Mysql,Hibernate,Tomcat,Hikaricp,我有一个Java(tomcat)应用程序,它使用MySQL(带hibernate)作为数据库 这是一个简单的Java Jsf应用程序,只有三个用户同时使用该系统(有两种大表,有20k行,通常在冻结时存在) 系统一直在崩溃,我需要重新启动Tomcat和MySQL才能再次工作 在我的日志中: [WARN] 2017-11-08 16:53:02,438 com.zaxxer.hikari.pool.PoolBase isConnectionAlive - HikariPool-1 - Failed

我有一个Java(tomcat)应用程序,它使用MySQL(带hibernate)作为数据库

这是一个简单的Java Jsf应用程序,只有三个用户同时使用该系统(有两种大表,有20k行,通常在冻结时存在)

系统一直在崩溃,我需要重新启动Tomcat和MySQL才能再次工作

在我的日志中:

[WARN] 2017-11-08 16:53:02,438 com.zaxxer.hikari.pool.PoolBase isConnectionAlive - HikariPool-1 - Failed to validate connection com.mysql.jdbc.JDBC4Connection@33dc5260 
此外:

和(90倍):

此外:

后来我还得到:
java.lang.OutOfMemoryError:java堆空间
,但系统只使用了760Mb

(是的,有很多错误,这就是为什么我很难找到解决方法的原因!)

有什么建议吗

我已设置为setenv.sh

export CATALINA_OPTS="$CATALINA_OPTS -Xms512m"
export CATALINA_OPTS="$CATALINA_OPTS -Xmx512m"
export CATALINA_OPTS="$CATALINA_OPTS -server"
当我验证正在使用的内存时,显示:

mysqld = 165.3 MiB
java = 662.0 MiB
我使用的连接池如下所示:

<property name="hibernate.hikari.maximumPoolSize" value="200" /> 
<property name="hibernate.hikari.idleTimeout" value="30000" /> 
<property name="hibernate.hikari.maxLifetime" value="600000" /> 
<property name="hibernate.hikari.dataSourceClassName" value="com.mysql.jdbc.jdbc2.optional.MysqlDataSource" />
<property name="hibernate.connection.provider_class" value="org.hibernate.hikaricp.internal.HikariCPConnectionProvider" />
服务器运行在一个带有1Gb Ram和1个vCPU的DigitalOcean droplet中。此服务器的最佳tomcat+mysql+hiraki配置是什么

谢谢大家!

[已编辑]

我删除了Xms512m和Xmx512m参数,并将maximumPoolSize减少到20,在服务器运行几个小时后,我得到了:

ERROR org.hibernate.engine.jdbc.spi.SqlExceptionHelper - HikariPool-1 - Connection is not available, request timed out after 30004ms.
javax.persistence.PersistenceException: 

org.hibernate.exception.JDBCConnectionException: Unable to acquire JDBC Connection

Caused by: org.hibernate.exception.JDBCConnectionException: Unable to acquire JDBC Connection

其中一个显而易见的问题是:

java.lang.OutOfMemoryError: GC overhead limit exceeded
表示没有足够的堆内存,JVM会花费大量时间进行垃圾收集

export CATALINA_OPTS="$CATALINA_OPTS -Xms512m"
export CATALINA_OPTS="$CATALINA_OPTS -Xmx512m"
告诉JVM Tomcat及其运行的所有应用程序最初应该保留512 Mb的内存,并且它们最多可以分配512 Mb的内存

从上面的错误可以清楚地看出,512 Mb对于您的应用程序来说是不够的

您需要考虑的选项包括:

  • Tomcat连接器中定义了什么
    maxThreads
    值。默认值为
    200
    。每个线程占用内存。预计只有3个用户,您可以将其减少到5个以节省内存
  • hibernate.hikari.maximumPoolSize
    似乎也太大了。同样
    5
    应该足够了
  • Hibernate加载的每个@Entity都存储在中。这会减慢休眠速度并消耗内存。考虑使用(如果可能的话)减少会话大小。
  • 使用或其他探查器进行内存转储,以分析内存的去向

同样使用1GbIt的交换内存也不起作用=(tomcat确实开始使用更少的内存,但几小时后又停止工作。进行内存转储并分析它。这里没有灵丹妙药。
wait_timeout = 360
interactive_timeout = 420
ERROR org.hibernate.engine.jdbc.spi.SqlExceptionHelper - HikariPool-1 - Connection is not available, request timed out after 30004ms.
javax.persistence.PersistenceException: 

org.hibernate.exception.JDBCConnectionException: Unable to acquire JDBC Connection

Caused by: org.hibernate.exception.JDBCConnectionException: Unable to acquire JDBC Connection
java.lang.OutOfMemoryError: GC overhead limit exceeded
export CATALINA_OPTS="$CATALINA_OPTS -Xms512m"
export CATALINA_OPTS="$CATALINA_OPTS -Xmx512m"