小编之前开发过一个机房收费系统,当初年幼无知。。只知道功能实现就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>
<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>
1.尽量减少从数据量大的表中去select数据,这样会降低数据检索的效率。
2.一次调用IO操作,如果没有特殊的要求,尽量获取更多的需要的信息,提高IO操作的效率。
3.善于使用抽象和封装的思维去减少重复性的工作。
4.当你的程序运行的时候,打开任务管理器看看,或许你的代码需要优化了。