Talvez seja logrotate, que está reiniciando o mysql e então sua conexão com o banco de dados precisa ser fechada + reaberta?
Meu servidor começou a travar pelo menos uma vez por dia. Permanece assim até que eu reinicie o Tomcat. Não tenho certeza ainda qual parte causa o problema, por isso estou tentando trabalhar em várias hipóteses:
Quando o servidor trava, vejo alguns erros como este. Assim, pode acontecer que o problema resida na conexão entre o meu código Java e o 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)
Meu código centralizado para recuperar resultados do banco de dados é:
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;
}
Minha conexão é 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
estende LinkedHashMap<String, Object>
e estou usando apenas para armazenar os campos recuperados em ResultSet
.
Software instalado: Apache / 2.4.7 (Ubuntu), MySQL: 5.5.40 (InnoDB), Tomcat: 8.0.15, Java: 1.8.0_25.
Alguma sugestão sobre por que o servidor está pendurado?
Talvez seja logrotate, que está reiniciando o mysql e então sua conexão com o banco de dados precisa ser fechada + reaberta?
Tags java tomcat apache-2.2 mysql5.5