Java ApacheTomcat 8+;MySQL性能问题
我有一个Java(tomcat)应用程序,它使用MySQL(带hibernate)作为数据库 这是一个简单的Java Jsf应用程序,只有三个用户同时使用该系统(有两种大表,有20k行,通常在冻结时存在) 系统一直在崩溃,我需要重新启动Tomcat和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
[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
。每个线程占用内存。预计只有3个用户,您可以将其减少到5个以节省内存200
似乎也太大了。同样hibernate.hikari.maximumPoolSize
应该足够了5
- Hibernate加载的每个@Entity都存储在中。这会减慢休眠速度并消耗内存。考虑使用(如果可能的话)减少会话大小。
- 使用或其他探查器进行内存转储,以分析内存的去向
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"