2016-07-23 15 views
1

私は最近私のPostgreSQLにアクセスできなかったことに気付きました。私の許可された接続の20すべてが使い果たされました。なぜ私は何も開いていないので、私は理解できませんでした。 PCがシャットダウンした後も物事が開いたままになっているようだ。ローカルで作業するリモートの実データベースを使用しています。同じデータベースを使用してライブをプッシュする場合も使用しています。ここでPostgreSQLメソッドの終了後に接続を閉じる

はニーズが後

私は、このメソッドの最後に接続を閉じる必要がありますどのように
@RequestMapping("/users") 
public String users(Model model) { 
    try { 
     Connection connection = getConnection(); 
     Statement stmt = connection.createStatement(); 
     String sql; 
     sql = "SELECT id, first, last, email, company, city FROM cuser"; 
     ResultSet rs = stmt.executeQuery(sql); 
     StringBuffer sb = new StringBuffer(); 
     List users = new ArrayList<>(); 
     while (rs.next()) { 
      int id = rs.getInt("id"); 
      String first = rs.getString("first"); 
      String last = rs.getString("last"); 
      String email = rs.getString("email"); 
      String company = rs.getString("company"); 
      String city = rs.getString("city"); 
      users.add(new User(id,first, last, email, company, city)); 
     } 
     model.addAttribute("users", users); 
     return "user"; 
    }catch(Exception e) {return e.toString();} 
} 

おかげで時間の答え

+2

あなたは接続プールを使用している必要があります.JebcTemplateやJPAのようなものであれば、Springブートを使用している場合は、人生を楽にすることができます。 – chrylis

+0

はいSpring Boot、JDBC&PostgreSQLを使用しています –

答えて

1

ここにいくつかの問題があります。

まず、データベース接続は実際には最終的にタイムアウトする必要があります。場合によっては、タイムアウトが永久にまたは同様の問題を抱えるレポートのために何かばかげたものにまで拡張されることもありますが、それは反パターンです。接続がタイムアウトになるように接続する必要があります。そのため、孤立した接続のような間違いがあると、データベースはそこから復旧できます。

第2に、接続が完了したら必ず接続を閉じてください。ここで最も簡単な方法は、try-with-resourcesを使用することです。リソースが正しい順序で閉じられ、例外マスキングが発生しないようにします(closeによってスローされる例外は、tryブロックにスローされた前の例外を引き起こしますあなたのコードが失敗した理由を知らないという意味で、あなたのコードが失敗したことを知らないので、悪いです。)第3に、Spring起動アプリケーションでもっと多くのSpringを使うことを検討してください。あなたはコントローラにglommedされたデータアクセスを持っているので、懸念が分かれず、リソースクローズ、名前付きパラメータ、データ例外変換を持つJDBCテンプレートのようなSpring提供の機能を利用していない(例外あなたはjdbcコールの意味を理解して戻ったり、トランザクション処理(同じトランザクション内で複数のDAO呼び出しを行うことができます)。 spring-jdbcのドキュメントについては、this linkを参照してください。

途中で接続プールを使用していることを確認してください。新しい接続を作成するよりも、プールからの既存の接続を要求で使用するほうがはるかに高速です。プールから接続を取得すると、プールへの接続を返すオブジェクトにラップされ、クローズしたときにクリーンアップ(進行中のトランザクションをロールバックするなど)します。

+0

私はそれを理解するためにあなたの答えを何度か読まなければならないでしょう。いいですね。あなたが説明したように、これはすべて実装されています。時間をかけて私を助けてくれてありがとう。その好評 –

0
を取得し、非常に多くの人に使用さ開閉場合、私は思っていた例示的な方法であります

これはどうですか(これは、あなた自身の接続を開くためにJDBCを直接使用していることを前提としています)...

Connection conn = null; 
ResultSet rs = null; 
try { 
    conn = getConnection(); 
    ... 
} catch (Exception ex) { 
    ... 
} finally { 
    if (rs != null) { 
     try { rs.close(); } catch (Exception ex) { ... } 
    } 
    if (conn != null) { 
     try { conn.close(); } catch (Exception ex) { ... } 
    } 
} 
+0

@NathanHughes、あなたは絶対に正しいです...私は単にfinallyブロックの例外ハンドルを省略して、より簡単な例を作成します...私はそれを編集します。ありがとう! –

関連する問題