0

このメソッドを使用してリクエストをクラスにルーティングする REST サービス アーキテクチャがあります。このメソッドは、データベース接続を開き、値をクエリして、最後にデータベース接続を閉じます。その後、データベースの値から JSON が構築され、REST 経由で返されます。

  public HashMap<Integer, Artifact> queryDBValues(String userNo) {

    DAO dao = getDAO(DB1);
    Connection connection = dao.instantiateConnection();

    ResultSet resultSet = null;
    Statement statement = null;

    HashMap<Integer, Artifact> artifacts = new HashMap<Integer, Artifact>();

    try {
        statement = connection.createStatement();

        String stmntStr = "select * from myTable";

        resultSet = statement.executeQuery(stmntStr);
        int i = 0;
        while (resultSet.next()) {

            Artifact artifact = new Artifact();
            artifact.setArtifactId(resultSet.getString("id"));

            artifacts.put(i, artifact);

        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        dao.closeSQLComponents(resultSet, connection);
    }

    return artifacts;
}

DAO は、getDAO() で渡された値に基づいてインスタンス化される抽象クラスです。これを行うのは、複数のデータベースに接続し、このクラスを拡張するクラスに接続および切断するためです。

接続後、mysql データベースから次のようなエラーを受け取りました: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: データ ソースが接続の確立を拒否しました。

接続は最終的に閉じられています。長期的には、c3p0 接続プーリングを使用する予定です。これは、使用頻度の低い接続をリサイクルするのに十分ですか?

4

1 に答える 1

3

結果セットと接続を閉じるのが少し奇妙であることを除いて、コードに根本的な問題はありませんが、ステートメントは閉じません。

もう 1 つの奇妙な点は、DAO がデータ アクセス コードをカプセル化するオブジェクトであると想定されていることです。JDBC ロジックを含める必要があるのは DAO です。

とはいえ、100,000 行のコードをリファクタリングするのを待つのではなく、今すぐ正しいことを行ってみませんか? できるだけ早く接続プールを使用してください。これには 2 つの大きな利点があります。

  • 接続を開くには非常にコストがかかります。接続を頻繁に開いたり閉じたりすることを避けることで、多くの時間を節約できます
  • プールは、使用量がピークに達した場合に、接続数を妥当な最大値に制限することもできます。あまりにも多くの接続を開くことを回避し、データベースを屈服させることができます。
于 2012-06-06T21:23:34.093 に答える