0

JDBC ドライバーを使用するコードを実装しています。

以下は私が作ったコードです。

public class MysqlUtils {
    public Connection conn;
    public ResultSet rs;
    public PreparedStatement stmt;

    public MysqlUtils(String address, String id, String passwd) {
        try {
            conn = DriverManager.getConnection(address, id, passwd);
            stmt = null;
            rs = null;
        } catch (SQLException e) {
            // error management
        }
    }

    public void getSomeData(long id) {
        try {
            stmt = conn.prepareStatement("SELECT * FROM some_table");
            rs = stmt.executeQuery();
            rs.next();
            System.out.println(rs.getString("some_column");
        } catch (SQLException e) {
            // error management
        }
    }
}

Connection conn、ResultSet rs、PreparedStatement stmt をメンバー変数として宣言しました。パフォーマンスを向上させるのに役立つかもしれないと考えたからです。

いくつか質問があります。

  1. getSomeData() を連続して呼び出すと、毎回 stmt と rs に新しいオブジェクトが割り当てられますか?

  2. 上記の質問への回答に関係なく、このコードをマルチスレッド環境 (MysqlUtils クラスを使用する複数のスレッド) で実行すると、getSomeData() で ResultSet rs を宣言していないため、混乱が生じますか?

  3. メンバー変数として Connection conn、ResultSet rs、PreparedStatement stmt を宣言するのは悪い選択でしたか? 言い換えれば、JDBC の私の実装は実行可能なものですか?

助けてくれてありがとう。

4

2 に答える 2

1
  1. はい。メソッドが実行されるため、stmt新しいrs値が取得されます。もちろん、クラスの複数のインスタンスがあり、したがってこれら 2 つのフィールドの複数のインスタンスがある場合があります。
  2. はい。このコードは完全にスレッドセーフです。public フィールドは一般に、ほとんどの場合避けるべきです。特にマルチスレッド環境では
  3. はい、それは悪い選択です。変数のスコープはできるだけ小さくする必要があります。そして、これらの変数は単一のメソッドで使用され、毎回再割り当てされます。それらはローカル変数でなければなりません。

また:

  • メソッドgetSomeData()は、何かを出力するだけでなく、何かを返す必要があります
  • ResultSet と Statement は、finally ブロックで閉じる必要があります。
  • エラー管理が例外を飲み込むことではないことを願っています

spring-jdbc を使用することをお勧めします。これは、すべての配管コードを処理し、コードが現在抱えているすべての問題を回避します。

于 2012-09-21T13:21:19.420 に答える
0

メソッドの外で ResultSet を使用しないでください.... while(rs.next) (rs=resultSet) を使用すると、データベース テーブルをループして値を取得しています!

于 2012-09-21T13:20:33.197 に答える