1

ASP.NET アプリケーションでこの問題が発生し、Oracle クエリの一部がサーバーに送信されて返されません。これまで。アプリのいくつかの場所で発生しますが、説明できません。この動作が見られる特定のシナリオの 1 つを次に示します。

アプリケーションの起動中に、データを非同期的にアプリケーションの状態にプリフェッチしています (アプリの有効期間中にデータが変更されることのないキャッシュ b/c の代わりに、アプリの状態を使用することが選択されました)。

Action<string, object> AddApplicationState = (string name, object data) =>
{
    Application.Lock();
    Application.Add(name, data);
    Application.UnLock();
};

Func<DataTable> GetFullNames = () => Database.GetAllNames();
Func<DataTable> GetProvinceNames = () => Database.GetProvinceNames();
Func<DataTable> 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 oraconn = 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);
            return dtAllNames;
        }
    }
}

public static DataTable GetTribeNames()
{
    using (OracleConnection oraconn = GetConnection())
    {
        using (OracleCommand oracmd = GetCommand(oraconn))
        {
            var sql = new StringBuilder();
            sql.AppendLine("SELECT DISTINCT NAME_ID, English_Name \"TRIBE_NAME_ENGLISH\",");
            sql.AppendLine("REGEXP_REPLACE(English_Name, '[^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("(SELECT NAME_ID_TRIBE FROM TRIBES UNION SELECT NAME_ID_FAMILY FROM TRIBES)");
            sql.AppendLine("ORDER BY English_Name");
            oracmd.CommandText = sql.ToString();
            var orada = new OracleDataAdapter(oracmd);
            var dt = new DataTable();
            orada.Fill(dt);
            return 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_ENGLISH FROM PROVINCES";
            var orada = new OracleDataAdapter(oracmd);
            var dtRC = new DataTable();
            orada.Fill(dtRC);
            return 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 をインストールしました。

ありがとう!

4

2 に答える 2

1

出力ウィンドウで例外を監視していますか? コードに catch ブロックがありません。

Oracle の ODP.net の構文は ADO とほぼ同じですが、多くの状況でより優れたパフォーマンスを発揮します。Oracle のみを使用している場合は、一見の価値があるかもしれません。

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

于 2009-07-20T11:20:22.713 に答える
0

クエリ実際に戻ってきたようですが、クエリのパフォーマンスが低く、帯域幅が狭く、返される行が膨大な量であるため、非常に長い時間がかかりました。VS デバッガーは、これらの実行時間の長いクエリに対して数秒後にあきらめたようです。ただし、数分間そのままにしておくと、ブレークポイントがヒットし、期待どおりに機能します。

返信/コメントありがとうございます!

于 2009-08-31T17:50:51.313 に答える