18

選択クエリ用に JDBC を実行している Java プログラムがあります。毎回 DBConnection() を呼び出すたびに testDataBase() を呼び出すことをお勧めしますか、またはすべてのクエリに対して 1 つの接続を再利用する必要があります。前もって感謝します。

private  void testDataBase(String query){
    Connection con = DBConnection();
    Statement st = null;
    ResultSet rs = null;

    try {
        st = con.createStatement();
        rs = st.executeQuery(query);
        boolean flag = true;
        while (rs.next()) {
            String resultString = "";
            for(int i = 1; i <=rs.getMetaData().getColumnCount();i++){
                resultString=resultString+" "+  rs.getString(i);
            }
            System.out.println(resultString);
        }
    } catch (SQLException e) {
        e.printStackTrace();

    } finally {
        if (st != null) {
            try {
                st.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (con != null) {
            try {
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}               



private  Connection DBConnection() {
    final String method_name =  "DBConnection";
    Connection conn = null;
    try{
      Class.forName(driver).newInstance();
      conn = java.sql.DriverManager.getConnection(url,userName,password);

    }catch (ClassNotFoundException e) {
        System.out.println(e.getMessage());
    } catch (SQLException e) {
        System.out.println(e.getMessage());
    } catch (InstantiationException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }

    return conn;
}
4

6 に答える 6

13

DB 接続を開くことは、パフォーマンスの点で高価な操作です。異なるリクエスト間で接続を共有するには、ConnectionPool を使用する必要があります。

于 2013-03-13T10:42:53.507 に答える
6

接続はスレッドセーフではないため、リクエスト間で共有することはお勧めできません。

接続をプールし、そのスコープをできるだけ狭くすることをお勧めします。接続をプールからチェックアウトし、使用し、トランザクション スコープで閉じます。

于 2013-03-13T11:13:35.873 に答える
5

データベース接続の取得は非常にコストのかかる操作であるため、可能であれば接続を再利用することをお勧めします。接続プールの使用も検討してください。これにより、多数の接続が維持されるため、必要なときにプールから1つだけ取得できます。上記のメソッドは変更する必要がない場合があります。呼び出すDBConnection()メソッドによって異なります。

于 2013-03-13T10:44:07.027 に答える
5

データベース接続は長時間実行されるため、クエリ レートが非常に低い場合を除き、再利用する必要があります。

于 2013-03-13T10:42:55.353 に答える
1

@Amir Kost に完全に同意します。パフォーマンスに関しては、実行できる最も遅い操作の 1 つで DB 接続を開きます。リアルタイムの制限が厳しい場合は、大きな問題になる可能性があります。フレームワークを使用しているかどうかはわかりませんが、接続のプールをラップする Bean を公開することをお勧めします。db と直接対話する必要があるたびに、現在開いている接続を取得します (通常はいわゆる「セッション」に相当します)。(フレームワークを使用していない場合でも) この専門性を再現することをお勧めします。

于 2013-03-13T11:12:00.127 に答える
-1

Connectionのインスタンスが1つだけ必要な場合は、シングルトンパターンを利用できます。次のことを検討してください。

public class Connector {

private static final String URL = "jdbc:mysql://localhost/";
private static final String LOGIN = "root";
private static final String PASSWORD = "azerty";
private static final String DBNAME = "videotheque";
private static Connector connector;
private static Connection connection;

private Connector() {
}

public synchronized static Connector getInstance() {
    if (connector == null) {
        connector = new Connector();
    }
    return connector;
}

public static Connection getConnection() {
    if (connection == null) {
        Connection c = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        try {
            c = DriverManager.getConnection(URL + DBNAME, LOGIN, PASSWORD);
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return c;
    }
    return connection;
}

}

そして、あなたは呼び出すことができます:Connector.getInstance().getConnection()

于 2013-03-13T11:17:42.120 に答える