Apache2/tomcat/MySQL/PageSpeed ​​서버는 하루에 한 번 중단됩니다.

Apache2/tomcat/MySQL/PageSpeed ​​서버는 하루에 한 번 중단됩니다.

내 서버가 하루에 한 번 이상 중단되기 시작했습니다. 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.extends LinkedHashMap<String, Object>에서 검색된 필드를 저장하는 데에만 사용하고 있습니다 ResultSet.

설치된 소프트웨어: Apache/2.4.7(Ubuntu), Mysql: 5.5.40(InnoDB), Tomcat: 8.0.15, Java: 1.8.0_25.

서버가 정지되는 이유에 대한 제안 사항이 있습니까?

답변1

어쩌면 mysql을 다시 시작한 다음 db에 대한 연결을 닫고 다시 열어야 하는 logrotate일 수도 있습니다.

관련 정보