2012-02-27 4 views
4

MySQLデータベースに接続してすぐに終了し、その後しばらくスリープして終了するJavaプログラムを作成しました。close()の後にMySQL接続が残っています(薄いラッパーで)

Connection conn = DriverManager.getConnection(conn_str); 
    conn.close(); 
    Thread.sleep(30 * 1000); 

上記のコードはかなりうまく動作します。 connは、close()を呼び出した直後に閉じられ、sleep()中には接続が表示されません。その後

、私は薄い接続ラッパーを書いた:

public static Connection CreateConnection(String _connectionStr) throws SQLException { 
     Connection c = null; 
     c = DriverManager.getConnection(_connectionStr); 
     return c; 
    } 

修正されたコードである:

Connection conn = ConnectionWrapper.CreateConnection(conn_str); 
    conn.close(); 
    Thread.sleep(30 * 1000); 

Iは、これら2つの差異を有していない期待し、後者の場合で、接続が持っていましたプログラムが終了するまで(ここでは30秒)閉鎖されたままである。前者のコードではこれは起こりません。

Threads_connectedの値を見て、動作をmysqladmin extend-status | grep connectedと確認しました。

コード抽象化のために後者のラッパーを使用したいと思います。強制的に接続を閉じる動作や回避策があるかどうか教えてください。

おかげで、

- 編集

は: "ラッパー" のコードを修正しました。それは私の間違いでした。

編集:mysqladminからの接続数は、デフォルトでは1(診断1)です。後者のコードが実行されている間は2になり、前者のコードでは2になります。

+0

ラッパーを作成していません。接続を取得するために呼び出すメソッドを作成しました(Java命名規約を尊重することは怠っています)。両方のコードスニペットは厳密に等価です。診断が間違っている可能性があります。 –

+0

実際にメソッド 'CreateConnection(ConnectionType、String)'を直接呼び出しているわけではありません。おそらく 'CreateConnection(String)'メソッドで何か別のことをしていますか? –

+0

私は両方が同等だと信じていましたが、異なる行動をしています。よくわかりません。 –

答えて

0

あなたはこのコードに試してみる...とエラー出力がどうなるかを見ることができます...

try{ 
con.close(); 
    if (con.isClosed()) 
    System.out.println("Connection closed."); 
} catch (java.lang.ClassNotFoundException e) { 
    System.err.println("ClassNotFoundException: " +e.getMessage()); 
} catch (SQLException e) { 
    System.err.println("SQLException: " +e.getMessage()); 
} 
+0

コードは「Connection closed」を出力します。例外はありません。isClosed()は接続が閉じていると言っていますが、接続は 'mysqladmin'コマンド(および' netstat')からクローズされません... –

+1

開いている接続があなたの診断ではないことを確かめてください(mysqladminが状態) ? –

+0

私はそれを確信しています。接続数は「1」です。監視を開始して接続が増えました。 –

-2

あなたのコードを見ているので、しびれているため申し訳ありませんが、[OK]を...あなたが見ることができるように... メソッドの中で接続を作成しました。そのメソッドから抜け出すと、その接続(変数c)を閉じることができません。別の接続に接続をコピーしただけなのでリターン(これはあなたの変数connです)を使って変数を変更しても、接続は残っています。 この記事に見て、私はそれが接続プール(再接続に時間を節約するアイデア...)

だと思うあなたのラッパーとない方法

+0

まあ,,,。多分私は理解します。参照カウントGCの問題に似ています。私はクラスを作成します。どうもありがとうございます。 –

+0

この回答は完全に間違っています。 –

+0

私はこれに関する@JBNizetに同​​意します。任意の数の他の変数から参照されているにもかかわらず、接続を閉じることができます。 –

関連する問題