一种简单的数据库分流的算法及实现
04年我在制作某省高考报名系统时使用过这种方法,效果很好但是源代码是基于2003的,今天已经不大适合了.
其实方法很简单:
1、目的:将一个大型数据库分散成几个小型的库,一方面加快查询速度,另一方面最主要的是能够将数据库服务分散到几个不同的服务器上从而增强系统的反映能力。
2、方法:将数据库分散开,如果是连续数字的话,最好划分,例如手机号根据号段即可。身份证根据归属地,都可以。对于字符串类型的例如姓名等复杂一些,可以hash以后再想办法。
3、实际:该方法稳定可靠,我们已经在多个系统中使用多年没有出现过问题。
4、不足:分开的多个数据库如果需要合并统计时比较麻烦。
下边是该方法的具体代码:
1、首先应当配置Web.Config文件
<connectionStrings>  
     
<add name="zy00" connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\zhiyuan_Data.MDF;Integrated Security=True;User Instance=True"
         providerName
="System.Data.SqlClient" />    
     
<add name="zy01" connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\zhiyuan_Data.MDF;Integrated Security=True;User Instance=True"
         providerName
="System.Data.SqlClient" />
     
<add name="zy02" connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\zhiyuan_Data.MDF;Integrated Security=True;User Instance=True"
         providerName
="System.Data.SqlClient" />
     
<add name="zy03" connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\zhiyuan_Data.MDF;Integrated Security=True;User Instance=True"
         providerName
="System.Data.SqlClient" />
     
<!--
          以下代码省略:说明zy00代表志愿00库,其实该库并能不使用。只是为了增强程序强壮性,如果不能正确定位其他库才转向此库操作。
    剩余的其他库依次编号更在后边即可,可以有任意多个。
    
-->
 
</connectionStrings>
2、一段根据传入关键字进行转向的代码。(传入的关键字中包含2位地域代码,使用该代码进行转向控制)01代表石家庄、02代表。。。
 1    /// <summary>
 2    /// 根据传入的考生号来决定使用哪个数据库进行操作
 3    /// 目前定向到市级,将来可以扩充
 4    /// </summary>
 5    /// <param name="ksh"/"bmddm"></param>
 6    /// <returns>连接字符串</returns>

 7    public static string changeconbyksh(string ksh)
 8    
 9        ///ksh的第5、6位为地市代码,需要根据相应的地市代码进行判断,取用相应的字符串
10        ///

11        //为了复用该程序,在这里传入的参数可以是ksh 或bmddm需要判断,总位数以及区域代码位置不同
12        string strdishi="00";
13        if (ksh.Trim().Length == 6)
14        {
15            strdishi = ksh.Trim().Substring(02);
16        }

17        else
18        {
19            strdishi = ksh.Substring(42);
20        }

21        //数据库前缀,本例中仅对志愿库操作。
22        string prefixes = "zy";
23        //将要返回的连接
24        string strcon="";
25        switch(strdishi)
26        {
27            case "01":
28                strcon =  ConfigurationManager.ConnectionStrings[prefixes+strdishi].ToString();
29                break;
30            case "02":
31                strcon = ConfigurationManager.ConnectionStrings[prefixes + strdishi].ToString();
32                break;
33            case "03":
34                strcon = ConfigurationManager.ConnectionStrings[prefixes + strdishi].ToString();
35                break;
36                //以下省略。。。           
37            default:     //如果不能正确定位则返回一个预先定义好的垃圾回收库,1、避免返回异常。2、收集数据判断错误原因。       
38                strcon = ConfigurationManager.ConnectionStrings[prefixes + "00"].ToString();
39                break;
40        }
  
41        return strcon;
42    }
3、在程序中调用该转向语句
    //本示例中是使用数据集中的数据适配器的例子,其他的也一样
    zhiyuansTableAdapters.tzhiyuanyxTableAdapter zyapt = new zhiyuansTableAdapters.tzhiyuanyxTableAdapter();       
    
//建好以后的adapt需要根据考生号自动定向连接
    zyapt.Connection.ConnectionString = zhiyuan.changeconbyksh(ksh);
    zhiyuans.tzhiyuanyxDataTable tablezhiyuan 
= new zhiyuans.tzhiyuanyxDataTable();        
    zyapt.getkszhiyuan(tablezhiyuan, ksh, pcdm, zyh);
ok,这样就可以使用了
posted on 2007-08-16 20:55  黄金年代  阅读(3794)  评论(26)    收藏  举报