0

バックグラウンド

多くの Prepared/Callable Statements と ResultSet を使用して閉じているため、finally セクションでクリーンアップするグローバルな静的メソッドを作成しました。

ほとんどの場合、それらを null にできないことは明らかです。すぐに閉じるのではなく、null チェックを追加することを確認したいだけです。

これまでのところ、このメソッドを使用してまったく問題はありませんでしたが、このスレッドは安全ですか? そうでない場合、単純な静的メソッドの代わりに同期メソッドを使用する必要がありますか?

使用法その他のスレッド クラス

private PreparedStatement psUpdate = null;
try {....}
catch(Exception e) {...}
finally
{
    Utils.NullCheckClose(this.psUpdate, this.getProcName());
}

宣言ユーティリティ クラス

public static void NullCheckClose(PreparedStatement temp, String threadname)
{
    try
    {
        if(temp != null)
            temp.close();
    }
    catch(Exception msg)
    {
        Logger.erLog(msg, threadname);
    }
    finally
    {
        temp = null;
    }
}

public static void NullCheckClose(CallableStatement temp, String threadname)
{
    try
    {
        if(temp != null)
            temp.close();
    }
    catch(Exception msg)
    {
        Logger.erLog(msg, threadname);
    }
    finally
    {
        temp = null;
    }
}

public static void NullCheckClose(ResultSet temp, String threadname)
{
    try
    {
        if(temp != null)
            temp.close();
    }
    catch(Exception msg)
    {
        Logger.erLog(msg, threadname);
    }
    finally
    {
        temp = null;
    }
}
4

2 に答える 2

1

いいえ。メソッドを使用しているだけの状態はありません。状態を共有する場合は同期が必要です。Utilsはパラメータ値を保存せず、それらを操作するだけなので、同期の必要はありません。

this.psUpdateオブジェクトの状態であるため、同期が必要です。メンバー変数を削除してみてください

Utils.NullCheckClose(this.psUpdate, this.getProcName());,<---this.psUpdate try to remove its as a member variable.

初期化する PreparedStatementCallableStatement、メンバー変数よりもローカル変数として使用することをお勧めします。

于 2012-10-04T05:20:38.350 に答える
1

スレッド間でデータを共有する必要がある場合、スレッドセーフの問題が発生し、アトミック性、可視性などに注意する必要があり
ます。したがって、スレッドセーフです。

于 2012-10-04T05:27:15.920 に答える