我的服务器每天至less挂起一次。 它依然如此,直到我重新启动Tomcat。 我不确定哪个部分会导致这个问题,所以我正在尝试几个假设:
当服务器挂起时,我看到像这样的一些错误。 所以这可能是这个问题在我的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。
有关为什么服务器挂起的任何build议?
也许这是logrotate,这是重新启动MySQL,然后你的连接到数据库需要closures+重新打开?