
Mi servidor empezó a colgarse al menos una vez al día. Sigue así hasta que reinicie Tomcat. Aún no estoy seguro de qué parte causa el problema, por lo que intento trabajar en varias hipótesis:
- Mi sitio web funciona a través de PageSpeed de Google, por lo que dudo que esté bajo un ataque DDoS.
- Cuando se cuelga, tengo que reiniciar Apache2 y Tomcat. Entonces no puedo decir cuál está causando el problema.
- Cuando el servidor se cuelga, reviso la lista de procesos de MySQL y encuentro una docena de conexiones inactivas. Esto significa que la base de datos no está sobrecargada.
Cuando el servidor se cuelga, veo pocos errores como este. Entonces podría darse el caso de que el problema resida en la conexión entre mi código Java y 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)
Mi código centralizado para recuperar resultados de la base de datos es:
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;
}
Mi conexión está agrupada:
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>
y lo estoy usando solo para almacenar los campos recuperados en el archivo ResultSet
.
Software instalado: Apache/2.4.7 (Ubuntu), Mysql: 5.5.40 (InnoDB), Tomcat: 8.0.15, Java: 1.8.0_25.
¿Alguna sugerencia sobre por qué el servidor se bloquea?
Respuesta1
¿Tal vez sea logrotate, que está reiniciando mysql y luego es necesario cerrar y reabrir su conexión a la base de datos?