Apache2 / кот / MySQL / Сервер PageSpeed, зависающий один раз в день

Мой сервер начал зависать по крайней мере один раз в день. Это остается таким, пока я не перезапускаю Tomcat. Я еще не уверен, какая часть вызывает проблему, таким образом, я пытаюсь работать над несколькими гипотезами:

  • Мой веб-сайт подается через PageSpeed Google, таким образом, я сомневаюсь, что являюсь объектом DDos-атаки.
  • Когда это зависает, я должен перезапустить и apache2 и кота. Таким образом, я не могу сказать, какой вызывает проблему.
  • Когда сервер зависает, я проверяю processlist 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.

Какие-либо предложения о том, почему сервер зависает?

1
задан 26 November 2014 в 22:23
1 ответ

Возможно, это logrotate, который перезапускает mysql, а затем ваше соединение с базой данных должно быть закрыто + открыто?

0
ответ дан 4 December 2019 в 08:21

Теги

Похожие вопросы