0

クラスファイルの1つに4つの異なるドロップダウンボックスを設定するために、非常にコストのかかるクエリをキャッシュしています。運が悪ければこれを機能させるために、私は知っていることすべてを試すのにあまりにも多くの時間を費やしてきました。初めて、DataSetがキャッシュされ、すべてが正常に見えます。ページを更新すると、コードはキャッシュされたアイテムのnullチェックに合格しますが、キャッシュされたDataSetに行がなく、ドロップダウンにデータが入力されません。

私の知る限り、MSDNや他のサイトのすべての例のようにこれを行っています。キャッシュを固定できません。DataSetには140行しかないため、サイズが制限されることはありません。運がなくても期限切れにならないように設定しようとしました。誰かが私を助けてくれるなら、私はそれを心から感謝します。

アプリプールの設定を確認しましたが、リサイクルするまでに十分な時間がかかるようです。これについての奇妙なことは、DataSetが最初にキャッシュされたときに、データがそこにあるということです。ページを更新すると、DataSet列のヘッダーはキャッシュされたアイテムに含まれていますが、データが含まれていないため、nullチェックに合格しています。私は本当にこれに頭を悩ませています。文字列をキャッシュすることはできますが、何らかの理由で、1回より長いリクエストのDataSetではありません。キャッシュされたアイテムにウォッチを設定してから、メソッドが2回呼び出されるまでハングし、メソッドが開始されると、DataSetが空になります。

デリゲートCacheItemRemovedCallbackを追加しましたが、キャッシュアイテムを手動で削除しない限り、それをトリガーできませんでした。キャッシュされたオブジェクトはキャッシュに残り、消えるのはDataSet行です。キャッシュされたDataSetを開くと、列名があり、行はありません。このため、それは通過しています

if(cacheItem == null)

小切手。文字列を問題なくキャッシュできます。有効期限が切れるまで、または手動で削除するまで、文字列はキャッシュに残ります。私は本当に途方に暮れています。アイテムをキャッシュしようとする他の方法はありますか?セッションが機能するとは思わない。クエリはシステムにとってコストがかかりすぎて、セッションレベルで使用できない。

public DataSet ReturnPhysicianSpecialtyCodes() 
{ 
    string cacheKey = "PhysCodes"; 
    object cacheItem = HttpRuntime.Cache[cacheKey] as DataSet; 
    if(cacheItem == null) 
    { 
        string sqlCommand = 
            "SELECT DISTINCT SPECIALTY_CODE, SPECIALTY " + 
            "FROM   PHARM.PHYSICIAN_SPECIALTY " +
            "ORDER BY SPECIALTY"; 

        cacheItem = OracleHelper.ExecuteDataset(
            this.Connection, 
            CommandType.Text,     
            sqlCommand); 

        HttpRuntime.Cache.Insert( 
            cacheKey, 
            cacheItem, 
            null, 
            Cache.NoAbsoluteExpiration, 
            new TimeSpan(1, 
            0, 0), 
            CacheItemPriority.Default, null); 
        } 
        return (DataSet)cacheItem;            
    }
}

皆様のご協力をよろしくお願いいたします。

4

2 に答える 2

0

List など、他のコンテナーを使用してみてください。cmd.ExecuteDatareader を使用してデータを取り込み、キャッシュに保存します。魅力のように機能します。ドロップダウンのみをバインドする必要がある場合は、データセットを使用することはお勧めできません。

于 2012-08-30T15:15:37.730 に答える
0

私は通常、このようにキャッシングを行います...

public DataSet ReturnPhysicianSpecialtyCodes() {
    HttpContext context = HttpContext.Current;
    string cacheKey = "PhysCodes";
    DataSet cacheItem = (DataSet)context.Cache.Get(cacheKey);
    if(cacheItem == null) {
        string sqlCommand =
            "SELECT DISTINCT SPECIALTY_CODE, SPECIALTY " +
            "FROM PHARM.PHYSICIAN_SPECIALTY " +
            "ORDER BY SPECIALTY";
        cacheItem = OracleHelper.ExecuteDataset(
            this.Connection,
            CommandType.Text,
            sqlCommand);
        context.Cache.Add(
            cacheKey,
            cacheItem,
            null,
            Cache.NoAbsoluteExpiration,
            Cache.NoSlidingExpiration,
            CacheItemPriority.Normal,
            null);
    }
    return (DataSet)cacheItem;
}

これとあなたがやっていることの間に大きな違いがあるというわけではありませんが、これは私にとってはうまくいきます。

于 2012-08-30T15:16:48.590 に答える