2011-08-10 7 views
0

データベース接続にsingleton design-patternを使用しています。シングルトンデータベース接続の問題

私の方法です。

 private static Connection con=null; 
public static Connection getConnection(){ 
    try { 
     if(con==null){ 
     Class.forName("com.mysql.jdbc.Driver").newInstance(); 
     con = DriverManager.getConnection("jdbc:mysql://localhost/mydb", "root", ""); 
     }else if(con.isClosed()){ 
     Class.forName("com.mysql.jdbc.Driver").newInstance(); 
     con = DriverManager.getConnection("jdbc:mysql://localhost/mydb", "root", ""); 
     } 
    } catch (Exception ex) { 

    } 
    return con; 
} 

mysqlサービスを再起動するたびに、次のエラーが生成され、アプリケーションを再起動して再度実行する必要があります。

エラー:

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

は、誰もがこのエラーを回避するために、これを実現するための正しい方法であるかを示すことはできますか?

ありがとうございました。 MySQLサーバは、いくつかの方法をあなたの接続を切断している場合はconnection-pooling.

あなたのメカニズムのために行く必要があります

+0

私はあなたが完全なスタックトレースを提供するべきだと思います。 – Swagatika

+0

おかげでJanydee、joostschouten.iは私がそれを見逃していることが分かった。 – sampathpremarathna

答えて

1

同じConnectionオブジェクトを再利用しています...まあ、すべてです。シングルトンは毎回新しい接続を返すConnectionFactoryである必要があります。

誰かがすでに指摘したように、新しい接続を作成/閉じるのではなく、接続プールを使用します。あなた自身で書く必要はありません。C3POやDBCPなどのオープンソースの実装がすぐに利用できます。

もう一度このホイールを再改造するのではなく、DataSourceを使用してください。 Springを使うことができるのであれば、これだけのためにDriverManagerDataSourceの実装があります。そうでなければ、それがどのように書かれているかを見て自由に書いてください(私はSpringが '許可された'技術ではないときにこれを少なくとも1度やったことがあります)。

最後に、Tomcat、JBoss、Glassfishな​​どのコンテナで実行している場合は、DataSourceをJNDIにバインドして使用できます。これにより、アプリケーションでプーリングや設定/デプロイメントの問題(データベースユーザー名&パスワードなど)自体を処理する必要がなくなります。

2

は動作しません。