Apache2 / Tomcat / MySQL / PageSpeed-Server hängt einmal am Tag

Apache2 / Tomcat / MySQL / PageSpeed-Server hängt einmal am Tag

Mein Server begann mindestens einmal am Tag zu hängen. Das bleibt so, bis ich Tomcat neu starte. Ich bin mir noch nicht sicher, welcher Teil das Problem verursacht, also versuche ich, mit mehreren Hypothesen zu arbeiten:

  • Meine Website wird über Google PageSpeed ​​bereitgestellt, daher bezweifle ich, dass ich einem DDoS-Angriff ausgesetzt bin.
  • Wenn es hängt, muss ich sowohl Apache2 als auch Tomcat neu starten. Ich kann also nicht sagen, welches das Problem verursacht.
  • Wenn der Server hängt, überprüfe ich die Prozessliste von MySQL und finde ein Dutzend inaktiver Verbindungen. Das bedeutet, dass die Datenbank nicht überlastet ist.
  • Wenn der Server hängt, sehe ich einige Fehler wie diesen. Es könnte also sein, dass das Problem in der Verbindung zwischen meinem Java-Code und MySQL liegt:

    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)
    

Mein zentraler Code zum Abrufen von Ergebnissen aus der Datenbank lautet:

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;
}

Meine Verbindung ist gepoolt:

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;
}

ResultMaperweitert LinkedHashMap<String, Object>, und ich verwende es nur, um die im abgerufenen Felder zu speichern ResultSet.

Installierte Software: Apache/2.4.7 (Ubuntu), Mysql: 5.5.40 (InnoDB), Tomcat: 8.0.15, Java: 1.8.0_25.

Irgendwelche Vorschläge, warum der Server hängt?

Antwort1

Vielleicht liegt es an Logrotate, das MySQL neu startet und dann Ihre Verbindung zur Datenbank geschlossen und erneut geöffnet werden muss?

verwandte Informationen