如何提高大数据业务系统的性能

    

    小编之前开发过一个机房收费系统,当初年幼无知。。只知道功能实现就OK了,从来没有考虑过性能问题。现在需要开发一个考试系统,要求在月底上线测试。小编负责代码的性能问题考虑,优化代码和数据库设计。


项目需求:




    1> 有一个题库表(每一个题型一个题库,系统中有六种题型),分为套卷储存A,B,C卷

    2>学生表有学生信息,本条业务线需要学生表中的学院ID信息

    3>答题记录表,因考试数据量大,为了分散数据量,我们采用1-16不同的数字代表不同的学院,以学院为单位区分开放入16张表中。

    4>加载考试主窗体需要涉及三张表,题库,学生信息表,学生答题记录。

    以上有一个问题,就是我如果想加载学生的题目,需要知道他考的是哪个题型,还要知道是哪个学院的去哪张答题记录表中去update数据,这样一来,而且我是六种题型,需要频繁的去选择学号,学院的ID。在几千人的考试中,一个学生的答题记录表可能有几千条数据,学生和答题记录为了尽量避免从表中频繁的取数据。我写了一个学生和试题类型的关系表,就是一个学生考A卷,那么就对应一条数据。

    表的问题解决了,下面就是,如果使用sqlhelper频繁的进行IO操作,系统的效率慢,占用的资源还大,没有可取之处。于是我决定,一次获取,整个生命周期都适用。大家一定想到了全局变量,很遗憾的发现,C#中不存在全局变量,这样我们就需要一个新的技术因为在C#中不存在全局变量这个概念。但是我们可以借签C#中的另外一种技术实现类似于全局变量的概念——既静态类。通过定义静态类的静态字段来记录保存全局状态。就像是BS开发中的session和cookies的原理一样的。


※性能优化:


   ※静态类的定义:

<span style="font-family:KaiTi_GB2312;font-size:18px;">     public static  class MyInfo
     {

         #region  获取学生的ID为全局的方法--周洲==2015年11月21日
        
         /// <summary>
         /// 获取学生的ID为全局的方法--周洲==2015年11月21日
         /// </summary>
         /// <returns></returns>
         public static string MystudentID()
         {
             return   FrmLogin.studentID ;
         }
         #endregion

         #region    //获取全局变量CollegeID-----周洲---2015年11月21日
         /// <summary>
         ///    //获取全局变量CollegeID-----周洲---2015年11月21日
         /// </summary>
         /// <returns></returns>
         public static string MycollegeID()
         {
     
             StudentInfoEntityBLL studentinfobll = new StudentInfoEntityBLL();
             StudentInfoEntity studentinfo = new StudentInfoEntity();
             //获取学生信息
             studentinfo.studentID = MyInfo.MystudentID();
             DataTable dt = studentinfobll.SelectStudentInfoByID(studentinfo);
             //获取全局变量CollegeID
             return dt.Rows[0]["collegeID"].ToString();
         }
         #endregion

         #region 获取全局的学生试卷类型--周洲--2015年11月21日
         
      
         /// <summary>
         /// 获取全局的学生试卷类型--周洲--2015年11月21日
         /// </summary>
         /// <returns></returns>
         public static string MyPaperType() {
             StudentInfoEntityBLL studentinfobll = new StudentInfoEntityBLL();
             StudentInfoEntity studentinfo = new StudentInfoEntity();
             studentinfo.studentID  = MyInfo.MystudentID();
             //获取学生试卷类型信息
             DataTable papertypedt = studentinfobll.SelectPaperTypebyStudentID(studentinfo);
             //给全局变量赋值,传递试卷类型信息
              return  papertypedt.Rows[0]["PaperType"].ToString();
         }
         #endregion
     }
}</span>


※UI中显示题干:

<span style="font-family:KaiTi_GB2312;font-size:18px;">#region 利用全局变量,从题库中加载word试题--周洲--2015年11月21日
            //定义一个word助手类
            WordLoadinfo wordhelper = new WordLoadinfo();
            //定义一个题库类传递Papertype
            WordQuestionEntity wordinfo = new WordQuestionEntity();
            wordinfo.PaperType = MyInfo.MyPaperType();
            //调用word试题load的方法
            DataTable worddt = wordhelper.LoadQuestionContent(wordinfo);
            //将从数据库中取出的字段赋给一个字符串
            string newLine=null;
            //循环DataTable取出里面的值
            for (int i = 0; i < worddt.Rows.Count; i++)
            {
                newLine += worddt.Rows[i]["QuestionContent"].ToString();
                 
            }
            //让字符串按照规律 赋给文本框           
            string[] s = newLine.Split('。');            
            for (int i=0; i < s.Length; i++)
            {
                txtWord.Text += s[i] + "\r\n";
            }            
            #endregion</span>

※题库加载类的封装:

<span style="font-family:KaiTi_GB2312;font-size:18px;">    public class WordLoadinfo 
    {
        public WordQuestionEntityBLL wordquestionbll = new WordQuestionEntityBLL();

        #region 利用全局变量,从题库中加载word试题--周洲--2015年11月21日
        /// <summary>
        /// 获取考试内容的界面
        /// </summary>
        /// <param name="wordinfo">传递考试类型</param>
        /// <returns>返回考试内容</returns>
        public DataTable LoadQuestionContent(WordQuestionEntity wordinfo)
        {
            //根据学号查询该学生要考的试题和试卷类型,
            return wordquestionbll.LoadWordQuestion(wordinfo);
        }
        #endregion
       
    }</span>

    其他五种题干的获取也可以使用这个静态类,这样一次IO操作,可以复用多次,静态类的特点是:不需要实例化,赋值以后,别的地方调用就是最后一次赋值的数据。静态类是不能实例化的,我们直接使用它的属性与方法,静态类最大的特点就是共享。但是有利有弊,程序员需要慎用。


※总结:


    1.尽量减少从数据量大的表中去select数据,这样会降低数据检索的效率。

    2.一次调用IO操作,如果没有特殊的要求,尽量获取更多的需要的信息,提高IO操作的效率。

    3.善于使用抽象和封装的思维去减少重复性的工作。

    4.当你的程序运行的时候,打开任务管理器看看,或许你的代码需要优化了。



评论 41
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值