2011-07-12 17 views
2

私は、コードを次ています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

mysql一般クエリログにエラーがありますか?

私は、これはそれ自体があなたの質問をイマイチ実感していますが、各家のためのちょうど単一の行を持つ別のテーブルを持っているならば、それはそれはあなたのメインhouseテーブルに

+0

私は1つの家しか持っていません:)それはすべてのゲームルームから家が得られる総額を保持します。それはスカラーのグローバルな価値のようなものです。私は家をユーザーテーブルに入れようと考えていましたが、セキュリティ上の問題のために、隔離された1列テーブルでそれを分離することにしました:) – Kovasandra

1

house_moneyを移動するために、より理にかなっていることを私に聞こえます私はこの1つの方法があまりにも多くをやっていると言うでしょう。

私は3つの別々のメソッドに渡して、すべてのトランザクションを管理します。

UPDATESのいずれかを削除する最適化があるのだろうかと思います。

これらをすべてバッチして、各ユーザーごとに往復をしないようにしたいと思います。ユーザー数が増加するとパフォーマンスが低下します。

+0

こんにちは、ユーザー数は常に2と6の間です。ゲームルームで、ゲームが終わるたびにもちろん、ゲームルームがたくさんあることもありますので、どうすればユーザーの更新プログラムをバッチすることができますか? – Kovasandra

+0

確かに、java.sql.StatementのaddBatch()メソッドとexecuteBatch()メソッドを使用してください:http://download.oracle.com/javase/6/docs/api/ – duffymo

+0

ありがとう、ありがとうございました。それは素晴らしい機能です:) – Kovasandra

関連する問題