Oracleクエリが発生し、その後は返されない

ado.net asp.net database-connection oracle10g

私のASP.NETアプリケーションで、Oracleのクエリの一部がサーバーに送信されても​​返されないという問題があります。 今まで それは私のアプリのいくつかの場所で起こります、そして私はそれを説明することができません。 これが、この動作を見ている特定のシナリオです。

アプリケーションの起動時に、データを非同期にアプリケーション状態にプリフェッチしています(キャッシュの代わりにアプリ状態を使用することを選択しました)。

アクションAddApplicationState =(文字列名、オブジェクトデータ)=> {Application.Lock(); Application.Add(name、data); Application.UnLock(); ;

Func GetFullNames =()=> Database.GetAllNames(); Func GetProvinceNames =()=> Database.GetProvinceNames(); Func GetTribeNames =()=> Database.GetTribeNames();

GetFullNames.BeginInvoke(result => AddApplicationState( "AllNames"、GetFullNames.EndInvoke(result))、null); GetProvinceNames.BeginInvoke(result => AddApplicationState( "ProvinceNames"、GetProvinceNames.EndInvoke(result))、null); GetTribeNames.BeginInvoke(result => AddApplicationState( "TribeNames"、GetTribeNames.EndInvoke(result))、null);

2番目の2つは問題なく戻りますが、最初の2つは決して戻らないか、約10分後に戻ります。 Oracle SQL Developerを起動したら、「セッションの監視」ツールに移動して、問合せに対する単一のセッションを確認できます。 完了したように見えます。b / c待機時間は(null)で、セッションは非アクティブです。 これは、データベースを照会するために使用されるADO.NETコードです。

public static DataTable GetAllNames(){using(OracleConnection oracon = GetConnection()){using(OracleCommand oracmd = GetCommand(oraconn)){var sql = new StringBuilder(); sql.AppendLine( "SELECT NAME_ID、NATIVE_NAME、NVL(FREQUENCY、0)\" FREQUENCY \ "、CULTURE_ID、"); sql.AppendLine( "ENGLISH_NAME、REGEXP_REPLACE(ENGLISH_NAME、 '[^ A-Za-z]'、null)\" ENGLISH_NAME_STRIPPED \ ""); sql.AppendLine( "FROM NAMES"); oracmd.CommandText = sql.ToString(); var orada = new OracleDataAdapter(oracmd); var dtAllNames = new DataTable(); orada.Fill(dtAllNames); dtAllNamesを返します。 }}}

public static DataTable GetTribeNames(){using(OracleConnection oraconn = GetConnection()){using(OracleCommand oracmd = GetCommand(oraconn)){var sql = new StringBuilder();} sql.AppendLine( "SELECT DISTINCT NAME_ID、英語名\" TRIBE_NAME_ENGLISH \ "、"); sql.AppendLine( "REGEXP_REPLACE(英語名、 '[^ A-Za-z]'、null)\" TRIBE_ENGLISH_NAME_STRIPPED \ "、"); sql.AppendLine( "NATIVE_NAME \" TRIBE_NATIVE_NAME \ ""); sql.AppendLine( "FROM NAMES"); sql.AppendLine( "WHERE NAME_ID IN"); sql.AppendLine( "(TRIBESからSELECT NAME_ID_TRIBE UNION SELECT NAME_ID_FAMILYからTRIBES)"); sql.AppendLine( "ORDER BY English_Name"); oracmd.CommandText = sql.ToString(); var orada = new OracleDataAdapter(oracmd); var dt = new DataTable(); orada.Fill(dt); dtを返します。 }}}

public static DataTable GetProvinceNames(){using(OracleConnection oraconn = GetConnection()){using(OracleCommand oracmd = GetCommand(oraconn)){oracmd.CommandText = "SELECT DISTINCT PROVINCE_ID、PROVINCE_NAME_NATIVE、PROVINCE_NAME PROVINCE_ENGLISH"; var orada = new OracleDataAdapter(oracmd); var dtRC = new DataTable(); orada.Fill(dtRC); dtRCを返します。 }}}

ご覧のとおり、ADO.NETコードはかなり標準的なもの(そして退屈なものです)です。 SQL Developerで実行した場合、クエリは1秒以内に返されます。 最初のクエリはx行、2番目のx行、3番目のx行を返します。 しかし、クエリが実行されても返されないというこの問題は頻繁に発生するため、問題を突き止めることはできません。 誰か何か考えがありますか?

そして最後に、コードとはまったく関係ないことがわかったので、このアプリケーションをWindows XP SP3マシン上で(Visual Studioから)ローカルに実行し、Windows 2003 Server上で実行されるリモートのOracle 10g EnterpriseインスタンスにVPN経由で接続します。 ローカルに、Oracle Data Access Components v11.1.0.6.20をインストールしました。

ありがとうございます。

  1  1


ベストアンサー

あなたは何らかの例外についてあなたの出力ウィンドウを見ていますか? あなたのコードにキャッチブロックはありません。

OracleのODP.netは、ADOとほぼ同じ構文を使用していますが、多くの状況でパフォーマンスが向上します。 Oracleのみを使用している場合は、一見の価値があります。

StringBuilderを使用する理由はありますか? 単一の文字列変数のほうがパフォーマンスがよくなり、コードが読みやすくなります。

1


クエリのパフォーマンスが悪く、帯域幅が狭く、大量の行が返されるため、クエリが実際に返されるのは非常に時間がかかるようです。 VSデバッガは、これらの長時間実行されるクエリを数秒後にあきらめているようです。 ただし、数分間放置しておくと、ブレークポイントが発生し、予想どおりに機能します。

返信/コメントをありがとう!

0


タイトルとURLをコピーしました