最奇怪的事情是,只要代码只要Open数据库连接,就会引发删除所有Cache。
我现在很不明白,Open连接和Cache有什么直接关系吗。源码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Caching;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Data.OleDb;namespace MarcomExhibitionMarket
{
  public partial class Default : System.Web.UI.Page
  {
  protected void Page_Load(object sender, EventArgs e)
  {
  if (!IsPostBack)
  {
  LoadDate();
  }
  }  private void LoadDate()
  {
  var obj = new Object();  if (Cache["tempTable"] == null)
  {  string sAccessConnection = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + this.Request.PhysicalApplicationPath + @"\bin\MacomExhibitionMarket.mdb;" + "Persist Security Info=True";//连接字符串
  OleDbConnection conn = new OleDbConnection(sAccessConnection);//OLEDB连接
  conn.Open();  OleDbCommand com = new OleDbCommand("select * from appuser", conn);  OleDbDataAdapter adapter = new OleDbDataAdapter(com);  DataSet ds = new DataSet();  adapter.Fill(ds, "tempTable");  Cache.Insert("tempTable", "123562635");
  }  obj = Cache["tempTable"];  }
  }
}

解决方案 »

  1.   

    public static object GetCache(string CacheKey)
    {
        System.Web.Caching.Cache objCache = HttpRuntime.Cache;
        return objCache[CacheKey];
    }
    public static void SetCache(string CacheKey, object objObject)
    {
        System.Web.Caching.Cache objCache = HttpRuntime.Cache;
        objCache.Insert(CacheKey, objObject);
    }
    string CacheKey = "cachetest";
        object objModel = GetCache(CacheKey);//从缓存中获取
        if (objModel == null)//缓存里没有
        {
             //重新获取缓存
        }
    数据发生变化了,缓存里还是过期的数据
      

  2.   

    Cache.Insert("tempTable", "123562635");我Insert的是一个自定义的数据,和Access没有任何关系,但是只要我打开Access数据连接它就丢失了。所有我可以可能不是数据是否变化的原因。 也许是什么比较隐蔽的规则。
      

  3.   

    chache会一直占用内存空间
    自己设置过期时间
      

  4.   

    Cache.Insert("tempTable", "123562635", null, DateTime.Now.AddMinutes(30), TimeSpan.Zero); 我这样设置后还是一样的结果。没有任何变化
      

  5.   

    CacheItemRemovedCallback onRemove;private void LoadDate()
            {
                var obj = new Object();            if (Cache["tempTable"] == null)
                {                string sAccessConnection = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + this.Request.PhysicalApplicationPath + @"\bin\database.mdb;" + "Persist Security Info=True";//连接字符串
                    OleDbConnection conn = new OleDbConnection(sAccessConnection);//OLEDB连接
                    conn.Open();                OleDbCommand com = new OleDbCommand("select * from Account", conn);                OleDbDataAdapter adapter = new OleDbDataAdapter(com);                DataSet ds = new DataSet();                adapter.Fill(ds, "tempTable");                onRemove = new CacheItemRemovedCallback(this.RemovedCallback);                Cache.Insert("tempTable", "123562635", null, System.Web.Caching.Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(15), CacheItemPriority.High, onRemove); 
                }            obj = Cache["tempTable"];
    //完成A
            }        private void RemovedCallback(string key, object value, CacheItemRemovedReason reason)
            {
     //此处设置断点
            }每当页面执行到"完成A"只有,就就会调用RemovedCallback,通知数据已经被删除。这是查看Cache中所有数据全部没有了。
      

  6.   

    两个疑问:1. 把整个表都放入Cache?2. Session集合数据没有丢失,唯独Cache数据丢失了吗?
      

  7.   

    lz真有你的,把mdb文件放到bin目录下。只告诉你结果吧:asp.net应用程序中只有app_data目录是为放置数据库文件的,之后这个目录下当你修改子目录、文件时才可以确保不会让应用程序重启!请把这个作为asp.net常识,看看大家是否注重常识吧!
      

  8.   

    lz真有你的,把mdb文件放到bin目录下。谢谢 您的提醒 我确实没有主要的这样的问题Session 我没有尝试过,但是Cache确实丢失了
      

  9.   

    这跟asp.net开发者经常说的“Session丢失”是完全同样的问题(尽管那跟应用程序状态管理的InProc模式有关,但是是同一个原因触发的)。在你修改bin下的问题、web.conf等等重要文件,修改删除一些目录,IIS的各种回收应用程序条件到时,等等情况,asp.net应用程序都会自动重启的。所以去租一个虚拟空间,经常会发现每隔十几分钟就丢失一次全部内存中的数据。不过合格的asp.net程序员应该会让用户根本看不出问题,继续正常运行。你把mdb放在bin这个目录,是不对的。
      

  10.   

    首先要明确,只有app_data目录是专门隔动态数据的。
      

  11.   

    感谢吴哥了就是您说的这个问题,我什么代码也没有做调整,只是把数据库转移到App_Data中就OK了