Apache2 / tomcat / MySQL / PageSpeed服务器每天挂一次

我的服务器每天至less挂起一次。 它依然如此,直到我重新启动Tomcat。 我不确定哪个部分会导致这个问题,所以我正在尝试几个假设:

  • 我的网站是通过Google的PageSpeed服务的,所以我怀疑我正在遭受DDoS攻击。
  • 当它挂起时,我必须重新启动apache2和tomcat。 所以我不知道是哪一个造成这个问题。
  • 当服务器挂起时,我检查mysql的进程列表,并且发现有十几个空闲连接。 这意味着数据库不会超载。
  • 当服务器挂起时,我看到像这样的一些错误。 所以这可能是这个问题在我的Java代码和MySQL之间的连接:

    java.sql.SQLException: Operation not allowed after ResultSet closed at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:996) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:935) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:924) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:870) at com.mysql.jdbc.ResultSetImpl.checkClosed(ResultSetImpl.java:734) at com.mysql.jdbc.ResultSetImpl.checkRowPos(ResultSetImpl.java:778) at com.mysql.jdbc.ResultSetImpl.getObject(ResultSetImpl.java:4419) at com.mypackage.SqlUtils.getResultMapList(SqlUtils.java:66) 

我从数据库检索结果的集中代码是:

 public List<ResultMap> getResultMapList(String sql) { List<ResultMap> rows = new LinkedList<>(); try (Connection conn = getConnection(); ResultSet res = conn.createStatement().executeQuery(sql)) { while (res.next()) { ResultMap row = new ResultMap(); ResultSetMetaData meta = res.getMetaData(); for (int i = 1; i <= meta.getColumnCount(); i++) { row.put(meta.getColumnLabel(i).toLowerCase(), res.getObject(i)); // Line 66 } rows.add(row); } } catch (Exception e) { e.printStackTrace(); } return rows; } 

我的连接汇集在一起​​:

 public Connection getConnection() { if (datasource == null) { PoolProperties p = new PoolProperties(); p.setUrl(myURL); p.setDriverClassName("com.mysql.jdbc.Driver"); p.setUsername(dbprefix + "user1"); p.setPassword(password); p.setJmxEnabled(true); p.setTestWhileIdle(false); p.setTestOnBorrow(true); p.setValidationQuery("SELECT 1"); p.setTestOnReturn(false); p.setValidationInterval(30000); p.setTimeBetweenEvictionRunsMillis(1000); p.setMaxActive(20); p.setMaxIdle(5); p.setInitialSize(5); p.setMaxWait(10000); p.setRemoveAbandonedTimeout(30); p.setMinEvictableIdleTimeMillis(10000); p.setMinIdle(2); p.setLogAbandoned(true); p.setRemoveAbandoned(true); p.setFairQueue(true); p.setJdbcInterceptors("org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;" + "org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer"); datasource = new DataSource(); datasource.setPoolProperties(p); } Connection conn = null; try { conn = datasource.getConnection(); } catch (Exception e) { e.printStackTrace(); } return conn; } 

ResultMap扩展LinkedHashMap<String, Object> ,我只用它来存储在ResultSet检索的字段。

安装软件:Apache / 2.4.7(Ubuntu),Mysql:5.5.40(InnoDB),Tomcat:8.0.15,Java:1.8.0_25。

有关为什么服务器挂起的任何build议?

也许这是logrotate,这是重新启动MySQL,然后你的连接到数据库需要closures+重新打开?