【发布时间】:2018-04-21 12:34:59
【问题描述】:
我有一个 Java (tomcat) 应用程序,它使用 MySQL(带有休眠)作为数据库。
这是一个简单的 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
还有:
[WARN] 2017-11-08 17:04:32,200 com.zaxxer.hikari.pool.HikariPool run - HikariPool-1 - Thread starvation or clock leap detected (housekeeper delta=1m22s40ms97µs73ns).
和(90 倍):
[WARN] 2017-11-08 17:04:35,438 com.zaxxer.hikari.pool.PoolBase isConnectionAlive - HikariPool-1 - Failed to validate connection com.mysql.jdbc.JDBC4Connection@2c365a2e (No operations allowed after connection closed.)
还有:
java.lang.OutOfMemoryError: GC overhead limit exceeded
后来我得到了:java.lang.OutOfMemoryError: Java heap space,但系统只使用了 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
我正在使用 Hikari 连接池,如下所示:
<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" />
MySQL 最大连接数设置为 152。
MySQL my.cnf 设置:
wait_timeout = 360
interactive_timeout = 420
服务器在具有 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
【问题讨论】:
-
也使用 1Gb 的交换内存
标签: java mysql hibernate tomcat hikaricp