- PR -

[ASP.NET+ADO.NET]NullReferenceExceptionエラー

投稿者投稿内容
ttcoupe
大ベテラン
会議室デビュー日: 2003/01/17
投稿数: 116
お住まい・勤務地: 大阪市
投稿日時: 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側でのエラーも残されていません。

同様の事象はおきていますでしょうか。対処を教えてください。
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2005-05-11 13:32
引用:

ttcoupeさんの書き込み (2005-05-11 13:23) より:
Dim pOraConn As New OleDb.OleDbConnection()
pOraConn.ConnectionString = Application.Get("OraConnectStr")
 Application.Add("OraConn", pOraConn)
で、Application("OraConn")をOpen()&Close()しています。


どこで(どのタイミングで)Openしてどこで(どのタイミングで)Closeしてるんでしょ?
気になる点はいっぱいあって、
・アプリ内でOleDbConnectionを共有してるの?(なんのため?)
・Closeしたものを使っちゃったり
・OpenしてるものをOpenしちゃったり
・同時に使用したり
・トランザクションが混ざったり
以下省略
ttcoupe
大ベテラン
会議室デビュー日: 2003/01/17
投稿数: 116
お住まい・勤務地: 大阪市
投稿日時: 2005-05-11 13:49
引用:

なちゃさんの書き込み (2005-05-11 13:32) より:
引用:

ttcoupeさんの書き込み (2005-05-11 13:23) より:
Dim pOraConn As New OleDb.OleDbConnection()
pOraConn.ConnectionString = Application.Get("OraConnectStr")
 Application.Add("OraConn", pOraConn)
で、Application("OraConn")をOpen()&Close()しています。


どこで(どのタイミングで)Openしてどこで(どのタイミングで)Closeしてるんでしょ?
気になる点はいっぱいあって、
・アプリ内でOleDbConnectionを共有してるの?(なんのため?)
・Closeしたものを使っちゃったり
・OpenしてるものをOpenしちゃったり
・同時に使用したり
・トランザクションが混ざったり
以下省略



上記の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で接続プールを使用する場合の方法としては不適切でしょうか。
ご教授をください。
ttcoupe
大ベテラン
会議室デビュー日: 2003/01/17
投稿数: 116
お住まい・勤務地: 大阪市
投稿日時: 2005-05-11 14:18
もしかして・・・なのですが、
各関数内でSQLを実行する場合に毎回、
 @接続文字列を設定
 Aオープン
 Bクローズ
を行うのでしょうか?
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2005-05-11 14:23
引用:

ttcoupeさんの書き込み (2005-05-11 14:18) より:
もしかして・・・なのですが、
各関数内でSQLを実行する場合に毎回、
 @接続文字列を設定
 Aオープン
 Bクローズ
を行うのでしょうか?


まあ、いろんなやり方があるので一概には言えませんが、それが基本と思っておいたほうが良いと思います。
少なくとも、コネクションオブジェクト自体をアプリケーションで共有することはしません(特にASP.NETの場合)。

ASP.NETでは、複数のユーザが同時アクセスする(可能性がある)、複数の処理が複数のスレッドで同時に実行される(可能性がある)、ということを忘れないでください。
※どういうことが起こるか想像はつきますか?
ttcoupe
大ベテラン
会議室デビュー日: 2003/01/17
投稿数: 116
お住まい・勤務地: 大阪市
投稿日時: 2005-05-11 15:25
更新系のSQLでなくてもですが、結果が不正になったりですか?
でも今回の様にNull状態にはならないのような気がするのですが・・・。
もしかして、接続のタイムアウトも共有するのでしょうか?
特に設定はしていないので、「最大のタイムアウト」になっていると
思うのですが、それが何秒なのかわからない状況です。
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2005-05-11 15:41
引用:

ttcoupeさんの書き込み (2005-05-11 15:25) より:
更新系のSQLでなくてもですが、結果が不正になったりですか?
でも今回の様にNull状態にはならないのような気がするのですが・・・。


ああ、そう、Nullに関しては確かに良く分からないんですよね。
Glocal.asaxのApplication_Startとかでコネクションを作成しているんですよね?
※正確にはどこでやっていますか?

あと、
> Application("OraConn")に対してNullReferenceExceptionエラーが
> 返されることがあります。
とありましたが、厳密にはどこ(何に対する参照)で発生していますか?
また、エラーが発生する「Application("OraConn")」はどこに記述していますか?

※まあ、いずれにしてもこのやり方はまずいのでやめる必要がありますが。


ちなみに、更新系の処理じゃなくても問題あります。
OleDbConnectionがスレッドセーフじゃないこと、そもそも一つのOleDbConnectionが同時に使用されたら、複数Open複数Closeが簡単に発生すること、ExecuteReaderは一つの接続で一つしか開けないこと、などなど。

※まあ根本的には、接続オブジェクトが一つしかないのに同時に複数箇所から開いて使うなんてのは無理という単純な話ですが。
ttcoupe
大ベテラン
会議室デビュー日: 2003/01/17
投稿数: 116
お住まい・勤務地: 大阪市
投稿日時: 2005-05-11 16:15
引用:

なちゃさんの書き込み (2005-05-11 15:41) より:
引用:

ttcoupeさんの書き込み (2005-05-11 15:25) より:
更新系のSQLでなくてもですが、結果が不正になったりですか?
でも今回の様にNull状態にはならないのような気がするのですが・・・。


ああ、そう、Nullに関しては確かに良く分からないんですよね。
Glocal.asaxのApplication_Startとかでコネクションを作成しているんですよね?
※正確にはどこでやっていますか?

あと、
> Application("OraConn")に対してNullReferenceExceptionエラーが
> 返されることがあります。
とありましたが、厳密にはどこ(何に対する参照)で発生していますか?
また、エラーが発生する「Application("OraConn")」はどこに記述していますか?

※まあ、いずれにしてもこのやり方はまずいのでやめる必要がありますが。


ちなみに、更新系の処理じゃなくても問題あります。
OleDbConnectionがスレッドセーフじゃないこと、そもそも一つのOleDbConnectionが同時に使用されたら、複数Open複数Closeが簡単に発生すること、ExecuteReaderは一つの接続で一つしか開けないこと、などなど。

※まあ根本的には、接続オブジェクトが一つしかないのに同時に複数箇所から開いて使うなんてのは無理という単純な話ですが。




「Application("OraConn")」はApplication_Startイベントで行っています。
ここで作成されたアプリケーションオブジェクトを各関数で使用しています。

エラー発生時にどこのステップでエラーが発生しているかを調べようと、デバッグを行うと
ビルドされるせいなのか、正常に動作してしまいます。
この時、トレースできるのでしょうか?

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