您的位置:首页 > 大数据

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

2015-11-21 21:58 731 查看
    

    小编之前开发过一个机房收费系统,当初年幼无知。。只知道功能实现就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.当你的程序运行的时候,打开任务管理器看看,或许你的代码需要优化了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: