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 をインストールしました。
ありがとう!