Mysql + JDBC + Linux:executeQuery不应该返回空结果集

时间:2011-07-12 00:45:53

标签: 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 for update,但那么为什么它适用于Windows而不是Linux?我感谢任何帮助。提前谢谢。

2 个答案:

答案 0 :(得分:1)

在mysql常规查询日志中查找是否有错误?

我知道这本身不是你的问题,但是如果你有另一张桌子,每个House只有一行,那么我觉得将house_money移到你的主{{1}更有意义表}

答案 1 :(得分:1)

我会说这种方法做得太多了。

我将Connection传递给三个不同的方法,并在所有方法之外管理事务。

我想知道是否存在可以消除其中一个更新的优化。

我想批量所有这些,所以我没有为每个用户做一次往返。随着用户数量的增加,它的表现会很差。