java - Mysql+JDBC+Linux : executeQuery returns empty result set when it shouldn't

标签 java mysql jdbc centos

我有以下代码:

public boolean updateDatabase(long houseValue, List<Users> userList)
{
    boolean result = false;
    Connection conn = null;
    PreparedStatement stmtUpdateUsers = null;
    PreparedStatement stmtQueryHouse = null;
    PreparedStatement  stmtUpdateHouse = null;
    ResultSet rs = null;

    String updateUsers = "UPDATE users SET money = ? WHERE username = ?";
    String queryHouse = "SELECT * FROM house WHERE house_id = ?";
    String updateHouse = "UPDATE house SET house_money = ? WHERE house_id = ?";

    try
    {
        conn = getConnectionPool().getConnection();
        conn.setAutoCommit(false);      

        stmtUpdateUsers = conn.prepareStatement(updateUsers);

        ...
        // Here is some code that updates Users table in a short loop
        ...

        stmtQueryHouse = conn.prepareStatement(queryHouse);
        stmtQueryHouse.setInt(1, 1); 
        rs = stmtQueryHouse.executeQuery();
        if(rs.next())
        {
            long houseMoney = rs.getLong("house_money");
            houseMoney += houseValue;

            stmtUpdateHouse = conn.prepareStatement(updateHouse);
            stmtUpdateHouse.setLong(1, houseMoney);
            stmtUpdateHouse.setInt(2, 1); 
            stmtUpdateHouse.executeUpdate();
        }
        else
        {               
            throw new SQLException("Failed to update house: unable to query house table");
        }

        conn.commit();
        result = true;
    }
    catch(SQLException e)
    {           
        logger.warn(getStackTrace(e));
        try{conn.rollback();}catch(SQLException excep)
        {
            logger.warn(getStackTrace(excep));
        }
    }
    finally
    {   
        DbUtils.closeQuietly(rs);
        DbUtils.closeQuietly(stmtQueryHouse);
        DbUtils.closeQuietly(stmtUpdateUsers);
        DbUtils.closeQuietly(stmtUpdateHouse);
        try { conn.setAutoCommit(true); } catch (SQLException e) { /* quiet */ }
        DbUtils.closeQuietly(conn);         
    }

    return result       
}

此方法可以从多个线程调用,house 表只是一个包含总收入的单行表。它由不同的线程更新。

问题是 stmtQueryHouse.executeQuery() 返回空集,这不应该发生,因为 house 表总是有(自数据库创建以来)更新的一行(仅更新 house_money 列)。

当我在 Windows(JDBC 驱动程序 + mysql 5.5.13)上运行这段代码时,它工作正常,但是当我在 CentOS(相同的 JDBC 驱动程序 + mysql 5.1.57)上运行它时,它经常返回空结果集(如果不是总是)。知道出了什么问题或我如何检查问题出在哪里?也许我应该使用 select 进行更新,但为什么它适用于 Windows 而不是 Linux?我感谢任何帮助。提前致谢。

最佳答案

查看 mysql 通用查询日志是否有任何错误?

我知道这本身不是你的问题,但如果你有另一个表,每个房子只有一行,我觉得将 house_money 移到你的主表中会更有意义房子

关于java - Mysql+JDBC+Linux : executeQuery returns empty result set when it shouldn't,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6658362/

相关文章:

java - 当在同步块(synchronized block)中使用wait()方法时,JVM在等待notify()时会释放监视器吗?

java - 在 servlet 容器启动后立即调用对 localhost 的请求

java - 返回 json 意外,在 Spring 中将 "links"拼写为 "_links"并且结构不同

java - 如何使用 spring 的 jdbcTemplate 在 SQL 查询中指定参数

mysql - 认证失败 : JDBC Realm in JBoss EAP 6. 1

java - IBM SAAJ 实现过度使用堆

php - 页面速度因循环而变慢

Java和MySql连接问题

MySQL根据条件执行SELECT

java - DatabaseMetaData.getColumns 为同义词返回一个空的结果集