- PR -

asp.net+Oracle10gで複数人が接続時にエラー

1
投稿者投稿内容
norin
会議室デビュー日: 2008/01/25
投稿数: 3
投稿日時: 2008-01-25 20:40
初めて書き込みをさせていただきます。

現在、asp.net+Oracle10gでシステムを開発しておりますが、
複数人で同時に登録処理を行う時、もしくは、複数人で同時に検索を行う際に
エラーが発生いたします。

エラーを見る限りでは、誰かが検索処理が終わりコネクションが閉じた時に、他の人の処理が落ちているように見えます。

ただ、最初はエラーを乱発していましたが、IISのアプリケーションプールのIDの設定をLocalSystemに変えたところエラーの乱発はなくなりました。
しかし、同時更新や同時検索を行う際には前と変わらず、エラーが出ます。

どなたか、このような現象を体験の方もしくは、
何か知っている方は回避策をお教えねがいませんでしょうか。
よろしく、お願いいたします。

環境:ASP.net2.0
Oracle10g(ODP.net接続)
   Windows2003 Server
IIS.6.0

エラー内容:
 (同時登録時)
 Executeが実行されるには、Commandオブジェクトに割り当てられたConnection
 オブジェクトが、保留されているローカルトランザクションで保持されている場合  は、CommandオブジェクトにTransactionオブジェクトが割り当てられている必要があ ります。CommandオブジェクトのTransactionプロパティは初期化されていません。

 (同時検索時)
 操作が無効です。OracleDataRederは閉じています。

[ メッセージ編集済み 編集者: norin 編集日時 2008-01-25 21:03 ]
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2008-01-25 23:16
ありがちなパターンとして、DB関連のオブジェクトを共有していたりしませんか?
norin
会議室デビュー日: 2008/01/25
投稿数: 3
投稿日時: 2008-01-26 09:36
返事をいただきましてありがとうございます。
再度、構成、PG等を確認しましたが、オブジェクトを共有している箇所は特定できませんでした。

私の確認方法がまずいとは、思います。
問題がないか確認をした箇所ですが
・Asp.netの参照追加に作成したDB接続用のDllが追加されている。
・Dll内でのOracleConnectionはPrivate変数で宣言されている。
です。

もし、他に確認すべき箇所があれば、お教えいただけませんでしょうか。
大変、申し訳ございません。よろしく、お願いいたします。

また、OraclueConnectionでのopen,closeは以下のようにやっております。

Private con As OracleConnection = Nothing

Public Sub OpenConnection() Implements DBAccess.OpenConnection
con = New OracleConnection(connectString)
con.Open()

End Sub

Public Sub CloseConnection() Implements DBAccess.CloseConnection
If Not (con Is Nothing) AndAlso
(con.State And ConnectionState.Open) = ConnectionState.Open Then
con.Close()
con = Nothing
End If
End Sub
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2008-01-26 10:14
引用:

norinさんの書き込み (2008-01-26 09:36) より:
返事をいただきましてありがとうございます。
再度、構成、PG等を確認しましたが、オブジェクトを共有している箇所は特定できませんでした。

私の確認方法がまずいとは、思います。
問題がないか確認をした箇所ですが
・Asp.netの参照追加に作成したDB接続用のDllが追加されている。
・Dll内でのOracleConnectionはPrivate変数で宣言されている。
です。


そのdllを使う側で、DB接続用の(dllの)オブジェクト自体を共有しているってことも無いですよね?
norin
会議室デビュー日: 2008/01/25
投稿数: 3
投稿日時: 2008-01-26 10:45
再度の返事をいただきましてありがとうございます。
ご指摘いただきましたDB接続用のオブジェクトですが、下記のように共有した使い方はしてないです。
ただ、getInstanceの部分ですが、Public Overloads Shared Functionでオブジェクトを戻しています。
この部分に問題があるのでしょうか?
何度も手をわずらせて申し訳ございません。よろしく、お願いいたします。

Dim con As DbAccess = Nothing
'接続情報の取得
con = DBAccessFactory.getInstance(A, B)
'コネクションオープン
con.OpenConnection()

sql = " Select * "
sql &= " From A "
ds = con.GetDataSet(sql,"A")

con.CloseConnection()
con = Nothing






[ メッセージ編集済み 編集者: norin 編集日時 2008-01-26 10:46 ]
くまっち
大ベテラン
会議室デビュー日: 2008/01/18
投稿数: 169
お住まい・勤務地: 茨城県のどこか。
投稿日時: 2008-01-28 12:55
本当に同時に複数人で実行した場合にしか例外発生してないのですか?
(一人しか使ってない場合、正常に動いてますか?)

接続共有の線が濃厚ですが・・・
(DB接続用オブジェクトを共有しているような気がします)

可能であればトランザクションの開始〜コマンド発行までのコードを提示してください。
たぶんExecuteしようとしているコマンドオブジェクトが参照する
トランザクションオブジェクトが、nullになっているのではないでしょうか?

【追加】
上記は「同時登録時」のエラー(例外)についてです。
「同時検索時」については、コネクションが閉じているのが原因だと思います。

なちゃ様の指摘は、この2点共に共通する原因として
接続を共有しているが為、どこかで(誰かが)接続を閉じているのでは?ってことだと思います。

[ メッセージ編集済み 編集者: くまっち 編集日時 2008-01-28 13:20 ]
1

スキルアップ/キャリアアップ(JOB@IT)