把数据库里面的数据放到cache里面

本文介绍了一种利用缓存技术优化数据库访问效率的方法,并详细解释了一个用于筛选和更新博客中敏感词汇的类实现。该机制能够有效减少数据库的负担,通过缓存敏感词汇列表,在发布博客时快速检查并替换敏感词汇。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

using System;
using System.Data;

namespace BadWord
{
    /// <summary>
    ///Sift 的摘要说明
    /// </summary>//LawlessDiary
    public class LawlessDiary
    {
        private System.Data.DataSet ds;
        private System.Data.IDataReader idr;
        private SiftWord.SiftWordDB db;

        public LawlessDiary()
        {
            //
            //TODO: 在此处添加构造函数逻辑   应用了cache ,把数据库里面的数据放到cache里面,以后就不用每次都要连接数据库了,是个好方法啊!GOOD GOOD
            //
        }

        public string[] WordSift(int bolgid, string title, string context) //筛选并跟新,然后返回title和content。
        {
            string words;
            words = title + context;

            string now = DateTime.Parse(Convert.ToString(System.DateTime.Now)).ToString("yyyy-MM-dd");  //获取当前时间
            DateTime nows = DateTime.Now; //具体时间

            if (System.Web.HttpContext.Current.Cache["keyword"] == null)
            {
                LawlessDiary si = new LawlessDiary();
                DataSet ds = si.GetKeyWord();
                string[] arr;
                arr = new string[ds.Tables[0].Rows.Count];
                for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
                {
                    arr[i] = ds.Tables[0].Rows[i][0].ToString();//取出每个非法关键字,去比较
                    title = title.Replace(arr[i], " ");
                    context = context.Replace(arr[i], "");
                }
                System.Web.HttpContext.Current.Cache.Insert("keyword", arr);


                string all = title + context;

                if (all != words)
                {
                    db = new SiftWord.SiftWordDB();
                    db.StoreName = "sp_update";
                    db.StoreInParameter("@sqlTmp", DbType.String, "UPDATE Communion.dbo.WebBlog_FaB SET DiaryState = 1, Publishdate = '" + now + "',biaot='" + title + "',zhengw='" + context + "' WHERE (BlogID = '" + bolgid + "')"); ///怎么插入使代码自动增加呢。
                    db.StoreOutParameter("@backinfo ", DbType.Int32, 0);
                    try
                    {
                        db.ExecDataSet();
                    }
                    catch (Exception)
                    {
                    }

                    string[] brr = { title, context };
                    return brr;
                }
                else
                {
                    db = new SiftWord.SiftWordDB();
                    db.StoreName = "sp_update";
                    db.StoreInParameter("@sqlTmp", DbType.String, "UPDATE Communion.dbo.WebBlog_FaB SET DiaryState = 0, Publishdate = '" + now + "',biaot='" + title + "',zhengw='" + context + "' WHERE (BlogID = '" + bolgid + "')"); ///怎么插入使代码自动增加呢。
                    db.StoreOutParameter("@backinfo ", DbType.Int32, 0);
                    try
                    {
                        db.ExecDataSet();
                    }
                    catch (Exception)
                    {
                    }

                    string[] brr = { title, context };
                    return brr;
                }

            }
            else    //当Cache不为空的时候,把cache里面的值 赋值给 string[] 数组,那么子尧对这个数组操作就行,就不用连接数据库,节约了数据库宝贵的临界资源
            {
                string[] arr = System.Web.HttpContext.Current.Cache["keyword"] as string[];
                int length = arr.Length;
                for (int i = 0; i < length; i++)
                {
                    title = title.Replace(arr[i], " ");
                    context = context.Replace(arr[i], " ");
                }
                string all = title + context;

                if (words != all)
                {
                    db = new SiftWord.SiftWordDB();
                    db.StoreName = "sp_update";
                    db.StoreInParameter("@sqlTmp", DbType.String, "UPDATE Communion.dbo.WebBlog_FaB SET DiaryState = 1, Publishdate = '" + now + "',biaot='" + title + "',zhengw='" + context + "' WHERE (BlogID = '" + bolgid + "')"); ///怎么插入使代码自动增加呢。
                    db.StoreOutParameter("@backinfo ", DbType.Int32, 0);
                    try
                    {
                        db.ExecDataSet();
                    }
                    catch (Exception)
                    {
                    }

                    string[] brr = { title, context };
                    return brr;
                }
                else
                {
                    db = new SiftWord.SiftWordDB();
                    db.StoreName = "sp_update";
                    db.StoreInParameter("@sqlTmp", DbType.String, "UPDATE Communion.dbo.WebBlog_FaB SET DiaryState = 0, Publishdate = '" + now + "',biaot='" + title + "',zhengw='" + context + "' WHERE (BlogID = '" + bolgid + "')"); ///怎么插入使代码自动增加呢。
                    db.StoreOutParameter("@backinfo ", DbType.Int32, 0);
                    try
                    {
                        db.ExecDataSet();
                    }
                    catch (Exception)
                    {
                    }

                    string[] brr = { title, context };
                    return brr;
                }
            }

        } //有标题和内容的。

        DataSet GetKeyWord() //获取非法关键字
        {
            db = new SiftWord.SiftWordDB();
            db.StoreName = "sp_select";
            db.StoreInParameter("@sqlTmp", DbType.String, "SELECT keylist FROM Communion.dbo.KeyWord");

            try
            {
                ds = db.ExecDataSet();
            }
            catch (Exception)
            {
            }
            return ds;
        }

        /// <summary>
        ///
        /// </summary>
        /// <param name="str">返回过滤后字符</param>
        /// <returns></returns>
        public string StringSift(string str)  //检验一个字符串有没有非法关键字
        {
            if (System.Web.HttpContext.Current.Cache["keyword"] == null)
            {
                LawlessDiary si = new LawlessDiary();
                DataSet ds = si.GetKeyWord();
                string[] arr;
                arr = new string[ds.Tables[0].Rows.Count];
                for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
                {
                    arr[i] = ds.Tables[0].Rows[i][0].ToString();//取出每个非法关键字,去比较
                    str = str.Replace(arr[i], "");
                }
                System.Web.HttpContext.Current.Cache.Insert("keyword", arr);

                ds.Dispose();
                return str;
            }
            else    //当Cache不为空的时候,把cache里面的值 赋值给 string[] 数组,那么子尧对这个数组操作就行,就不用连接数据库,节约了数据库宝贵的临界资源
            {
                string[] arr = System.Web.HttpContext.Current.Cache["keyword"] as string[];
                int length = arr.Length;
                for (int i = 0; i < length; i++)
                {
                    str = str.Replace(arr[i], "");
                }
                ds.Dispose();
                return str;
            }
        }

        /// <summary>
        ///
        /// </summary>
        /// <param name="id">BlagID</param>
        /// <returns></returns>
        public bool checklock(int id)
        {
            int state;
            db = new SiftWord.SiftWordDB();
            db.StoreName = "sp_select";
            db.StoreInParameter("@sqlTmp", DbType.String, "select diarystate from Communion.dbo.WebBlog_FaB where blogid='" + id + "'");
            try
            {
                ds = db.ExecDataSet();
            }
            catch (Exception)
            {
            }
            state = Convert.ToInt32(ds.Tables[0].Rows[0][0].ToString());
            if (state == 3)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
    }
}

当在C#中尝试将大量数据库数据填充到DataGridView控件时,如果一次性加载的数据量过大,可能会遇到性能问题或内存溢出错误。这是因为DataGridView试图一次性加载所有数据,这可能导致程序无法处理。为了解决这个问题,你可以采取以下几个策略: 1. **分页加载**:使用DbDataAdapter的`Fill()`方法时,指定`startRow`和`recordCount`参数,只加载部分数据。例如,你可以循环读取数据并逐页添加到DataGridView。 ```csharp int pageSize = 100; // 每页显示的数量 int offset = 0; while (offset < totalRows) { int count = Math.Min(pageSize, totalRows - offset); SqlDataAdapter.Fill(dt, "your_table", null, offset, count); dataGridView.DataSource = dt; offset += pageSize; } ``` 2. **虚拟模式(Virtual Mode)**:对于非常大的数据集,可以启用DataGridView的虚拟模式,它仅在需要时动态加载行。设置DataGridView的`DataSource`属性为一个自定义的`ICollectionView`实例。 ```csharp ICollectionView collectionView = new BindingSource(); collectionView.DataSource = yourDataTable; dataGridView.DataSource = collectionView; dataGridView.AutoGenerateColumns = false; dataGridView.VirtualMode = true; ``` 3. **优化查询**:尽量减少从数据库获取不必要的字段,只选择你需要展示给用户的列。 4. **使用缓存或延迟加载**:考虑使用缓存技术(如MemoryCache或Redis),或者在用户滚动时才从数据库加载更多数据。 如果你仍然遇到报错,请检查具体的错误信息,以便找到解决特定问题的方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值