私は、コードを次ていますMySQLの+ JDBC + Linuxの:のexecuteQueryは、空の結果セットを返す場合、それはすべきではない
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
}
この方法は、複数のスレッドから呼び出すことができ、家のテーブルが保持しているだけで1行の表であります総収入金。異なるスレッドによって更新されます。
ハウステーブルが(データベース作成後に)更新される1つの行を常に保持するため(house_money列のみが更新されるため)、stmtQueryHouse.executeQuery()は空のセットを返します。
このコードをWindows(JDBCドライバ+ mysql 5.5.13)で実行するとうまくいきますが、CentOS(同じJDBCドライバ+ mysql 5.1.57)で実行すると、非常に頻繁に空の結果セットが返されます常にではない)。どのような問題が起こっているのか、どうすれば問題がどこにあるのか確認できますか?たぶん私は更新プログラムを選択する必要がありますが、なぜそれがWindows上で動作し、Linux上で動作しないのですか?私はどんな助けにも感謝します。前もって感謝します。
私は1つの家しか持っていません:)それはすべてのゲームルームから家が得られる総額を保持します。それはスカラーのグローバルな価値のようなものです。私は家をユーザーテーブルに入れようと考えていましたが、セキュリティ上の問題のために、隔離された1列テーブルでそれを分離することにしました:) – Kovasandra