私はデータベース接続を作成して返すユーティリティクラスを持っています:
Public Shared Function GetConnection() as OracleConnection
dim c as New OracleConnection()
... set connection string...
c.Open()
Return c
End Function
同時呼び出しが同じ接続を返すリスクはありますか? 接続文字列はプーリングを有効にします。
私はデータベース接続を作成して返すユーティリティクラスを持っています:
Public Shared Function GetConnection() as OracleConnection
dim c as New OracleConnection()
... set connection string...
c.Open()
Return c
End Function
同時呼び出しが同じ接続を返すリスクはありますか? 接続文字列はプーリングを有効にします。
同時呼び出しの問題をしばらく忘れてください。接続プールが行われている場合は、同じオブジェクトを使用していなくても、基盤となる同じデータベース接続を完全に再利用できます。
DBへの接続を開くことはコストのかかる操作になる可能性があるため、これは一般的に望ましいことです。
別の呼び出し元の下から接続オブジェクトを閉じることを心配していますか?もしそうなら、別の回答が指摘したように、私はあなたが提供したコードで安全だと思います。
毎回新しい接続を返すため、同時実行の問題は発生しません。メソッドを使用して同じShared
インスタンスへの複数の参照を返す場合、それは問題になる可能性がありますが、ここで行っていることはそうではありません。
You are safe to use this method in this way as long as you are always returning a new instance of your database connection object each time. Any connection pooling will also work the same as it always would - you won't need to worry about your Shared
method usage created problems there either.
私はそうは思わない。
cはローカル変数(「スタック変数」)であり、静的変数ではないため、すべての呼び出しには独自のcのインスタンスがあります。次に、新しいオブジェクト(接続)を作成し、これを返します。
各呼び出しは新しい接続であるため、同時実行性に問題はありません。
ただし、1つの変更を加える可能性があります。メソッドを作成しprivate
ます。
これにより、すべてのデータアクセスコードを1つのクラスに配置し、プッシュして、優れた個別のデータアクセス層を作成する必要があります。少なくともinternal
、データアクセス層が単一のアセンブリ(コードの他の部分とは別)に限定されるようにします。