ExecuteQuery挂起原因不明。精疲力竭的常见解决方案

时间:2016-09-08 18:58:25

标签: java mysql tomcat prepared-statement jdbctemplate

日志停在logger.warn(“Start:preparedStatement.executeQuery()”);并且无限期地挂起。日志中不会抛出任何异常。查询不会显示在info列下的SHOW FULL PROCESSLIST中,这意味着查询甚至不会被执行。我能够在命令行中执行查询,并且返回所有行只需不到一秒钟。显示OPEN表格IN_USE<> 0返回一个空集,因此没有锁定表。使用JDK 1.8,MySQL 1.6,InnoDB。 *编辑:这是在AWS上运行的,我注意到挂起之前CPU利用率大幅上升。

public void setup(StringBuilder sql, String[] args, RowMapper<I> rowMapper) throws SQLException{
    this.rowMapper = rowMapper;
    //Create prepared statement
    connection.setAutoCommit(false);
    logger.warn("Start: Connection.preparedStatement");
    preparedStatement = connection.prepareStatement(sql.toString(),ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
    logger.warn("End: Connection.preparedStatement");
    preparedStatement.setFetchSize(fetchSize);
    //Setting SQL arguments
    int i = 1;
    for(String var: args){
        preparedStatement.setString(i++, var);
    }
    logger.warn("Start: preparedStatement.executeQuery()");
    resultSet = preparedStatement.executeQuery();
    logger.warn("End: preparedStatement.executeQuery()");
}

1 个答案:

答案 0 :(得分:0)

解决了它。在第1373行的StatementImpl.class版本1.5中有一个同步锁定,它等待锁定脱落,这就是线程挂起的原因。我有多个结果集同时打开,所以我最终给每个结果集它自己的连接并将获取大小设置为Integer.MIN_VALUE并且应用程序现在不会被卡住。