- - PR -
[ASP.NET+ADO.NET]NullReferenceExceptionエラー
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-05-11 13:23
いつも拝見しています。
現在、ASP.NET(VB.NET) + ADO.NET(Provider=ORAOLEDB.ORACLE) + Oracle8.0.5で Webアプリを運用しています。 接続方法は Dim pOraConn As New OleDb.OleDbConnection() pOraConn.ConnectionString = Application.Get("OraConnectStr") Application.Add("OraConn", pOraConn) で、Application("OraConn")をOpen()&Close()しています。 まれに発生する事象なのですが、運用してる時間帯に Application("OraConn")に対してNullReferenceExceptionエラーが 返されることがあります。 原因がわからず、Oracle側でのエラーも残されていません。 同様の事象はおきていますでしょうか。対処を教えてください。 | ||||||||
|
投稿日時: 2005-05-11 13:32
どこで(どのタイミングで)Openしてどこで(どのタイミングで)Closeしてるんでしょ? 気になる点はいっぱいあって、 ・アプリ内でOleDbConnectionを共有してるの?(なんのため?) ・Closeしたものを使っちゃったり ・OpenしてるものをOpenしちゃったり ・同時に使用したり ・トランザクションが混ざったり 以下省略 | ||||||||
|
投稿日時: 2005-05-11 13:49
上記のApplication.Add("OraConn", pOraConn)等の処理は Global.asaxで行っていて、 各関数で、OpenとCloseを行っています。 Dim lOraCmd As New OleDb.OleDbCommand() Dim lOraRead As OleDb.OleDbDataReader Try Application("OraConn").Open() strQuery = <<SQL文>> lOraCmd.Connection = Application("OraConn") lOraCmd.CommandText = strQuery lOraRead = lOraCmd.ExecuteReader If lOraRead.Read Then <<処理>> End If Catch exp As Exception CustomAuthenticate = exp.Message Finally If Not lOraCmd Is Nothing Then If Not lOraRead.IsClosed Then lOraRead.Close() End If lOraCmd.Dispose() End If Application("OraConn").Close() End Try ですので、 ・Closeしたものを使っちゃったり ・OpenしてるものをOpenしちゃったり というのはないと考えていますが、 ・同時に使用したり というのは自身がないです・・・。 ASP.NETで接続プールを使用する場合の方法としては不適切でしょうか。 ご教授をください。 | ||||||||
|
投稿日時: 2005-05-11 14:18
もしかして・・・なのですが、
各関数内でSQLを実行する場合に毎回、 @接続文字列を設定 Aオープン Bクローズ を行うのでしょうか? | ||||||||
|
投稿日時: 2005-05-11 14:23
まあ、いろんなやり方があるので一概には言えませんが、それが基本と思っておいたほうが良いと思います。 少なくとも、コネクションオブジェクト自体をアプリケーションで共有することはしません(特にASP.NETの場合)。 ASP.NETでは、複数のユーザが同時アクセスする(可能性がある)、複数の処理が複数のスレッドで同時に実行される(可能性がある)、ということを忘れないでください。 ※どういうことが起こるか想像はつきますか? | ||||||||
|
投稿日時: 2005-05-11 15:25
更新系のSQLでなくてもですが、結果が不正になったりですか?
でも今回の様にNull状態にはならないのような気がするのですが・・・。 もしかして、接続のタイムアウトも共有するのでしょうか? 特に設定はしていないので、「最大のタイムアウト」になっていると 思うのですが、それが何秒なのかわからない状況です。 | ||||||||
|
投稿日時: 2005-05-11 15:41
ああ、そう、Nullに関しては確かに良く分からないんですよね。 Glocal.asaxのApplication_Startとかでコネクションを作成しているんですよね? ※正確にはどこでやっていますか? あと、 > Application("OraConn")に対してNullReferenceExceptionエラーが > 返されることがあります。 とありましたが、厳密にはどこ(何に対する参照)で発生していますか? また、エラーが発生する「Application("OraConn")」はどこに記述していますか? ※まあ、いずれにしてもこのやり方はまずいのでやめる必要がありますが。 ちなみに、更新系の処理じゃなくても問題あります。 OleDbConnectionがスレッドセーフじゃないこと、そもそも一つのOleDbConnectionが同時に使用されたら、複数Open複数Closeが簡単に発生すること、ExecuteReaderは一つの接続で一つしか開けないこと、などなど。 ※まあ根本的には、接続オブジェクトが一つしかないのに同時に複数箇所から開いて使うなんてのは無理という単純な話ですが。 | ||||||||
|
投稿日時: 2005-05-11 16:15
「Application("OraConn")」はApplication_Startイベントで行っています。 ここで作成されたアプリケーションオブジェクトを各関数で使用しています。 エラー発生時にどこのステップでエラーが発生しているかを調べようと、デバッグを行うと ビルドされるせいなのか、正常に動作してしまいます。 この時、トレースできるのでしょうか? |