从零开发分布式数据库中间件 一、读写分离的数据库中间件(转)

<h1>
    <span class="link_title"><a href="/happyheng/article/details/54176951">
    从零开发分布式数据库中间件 一、读写分离的数据库中间件        
       
    </a>
    </span>

     
</h1>
<div class="article_manage clearfix">
    <div class="article_l">
       
    </div>
</div>    <style type="text/css">        
        .embody{
            padding:10px 10px 10px;
            margin:0 -20px;
            border-bottom:solid 1px #ededed;                
        }
        .embody_b{
            margin:0 ;
            padding:10px 0;
        }
        .embody .embody_t,.embody .embody_c{
            display: inline-block;
            margin-right:10px;
        }
        .embody_t{
            font-size: 12px;
            color:#999;
        }
        .embody_c{
            font-size: 12px;
        }
        .embody_c img,.embody_c em{
            display: inline-block;
            vertical-align: middle;               
        }
         .embody_c img{               
            width:30px;
            height:30px;
        }
        .embody_c em{
            margin: 0 20px 0 10px;
            color:#333;
            font-style: normal;
        }
</style>
<script type="text/javascript">
    $(function () {
        try
        {
            var lib = eval("("+$("#lib").attr("value")+")");
            var html = "";
            if (lib.err == 0) {
                $.each(lib.data, function (i) {
                    var obj = lib.data[i];
                    //html += '<img src="' + obj.logo + '"/>' + obj.name + "&nbsp;&nbsp;";
                    html += ' <a href="' + obj.url + '" target="_blank">';
                    html += ' <img src="' + obj.logo + '">';
                    html += ' <em><b>' + obj.name + '</b></em>';
                    html += ' </a>';
                });
                if (html != "") {
                    setTimeout(function () {
                        $("#lib").html(html);                      
                        $("#embody").show();
                    }, 100);
                }
            }      
        } catch (err)
        { }
        
    });
</script>
  <div class="category clearfix">

  在传统的单机体系中,我们在操作数据库时,只需要直接得到数据库的连接,然后操作数据库即可,可是在现在的数据爆炸时代,只靠单机是无法承载如此大的用户量的,即我们不能纵向扩展,那么我们就只能水平进行扩展,即使用读写分离的主从数据库来缓解数据库的压力,而在读写分离之后,如何使程序能正确的得到主数据库的连接或者是从数据库的连接,就是我们今天读写分离的数据库中间件需要实现的。

一、主从数据库介绍:

  主从数据库即为一个主数据库会有对应n个从数据库,而从数据库只能有一个对应的从数据库。主从数据库中写的操作需要使用主数据库,而读操作使用从数据库。主数据库与从数据库始终保持数据一致性。其中保持数据库一致的原理即为当主数据库数据发生变化时,会将操作写入到主数据库日志中,而从数据库会不停的读取主数据库的日志保存到自己的日志系统中,然后进行执行,从而保持了主从数据库一致。


二、开发前准备及ConnectionFactory类的开发:

  在了解了主从数据库后,我们可以进行分布式数据库中间件的开发,由于mysql本身支持主从数据库,但限于篇幅,就不讲mysql的主从配置了,我们先使用本机的mysql作为一主两从的数据库源即可,下面是我本机的数据库连接配置文件,其中有一主两从:

  1. master.driver=com.mysql.jdbc.Driver  
  2. master.dburl=jdbc\:mysql\://127.0.0.1\:3306/master_slave_db  
  3. master.user=root  
  4. master.password=mytestcon  
  5.   
  6. slave1.driver=com.mysql.jdbc.Driver  
  7. slave1.dburl=jdbc\:mysql\://127.0.0.1\:3306/master_slave_db  
  8. slave1.user=root  
  9. slave1.password=mytestcon  
  10.   
  11. slave2.driver=com.mysql.jdbc.Driver  
  12. slave2.dburl=jdbc\:mysql\://127.0.0.1\:3306/master_slave_db  
  13. slave2.user=root  
  14. slave2.password=mytestcon  
有了主从数据库的连接配置后,就可以将配置进行封装。

封装的DataSource类:

  1. public class DataSource {  
  2.   
  3.     private String driver;  
  4.   
  5.     private String url;  
  6.   
  7.     private String user;  
  8.   
  9.     private String password;  
  10.   
  11.   
  12.     public String getDriver() {  
  13.         return driver;  
  14.     }  
  15.   
  16.     public void setDriver(String driver) {  
  17.         this.driver = driver;  
  18.     }  
  19.   
  20.     public String getUrl() {  
  21.         return url;  
  22.     }  
  23.   
  24.     public void setUrl(String url) {  
  25.         this.url = url;  
  26.     }  
  27.   
  28.     public String getUser() {  
  29.         return user;  
  30.     }  
  31.   
  32.     public void setUser(String user) {  
  33.         this.user = user;  
  34.     }  
  35.   
  36.     public String getPassword() {  
  37.         return password;  
  38.     }  
  39.   
  40.     public void setPassword(String password) {  
  41.         this.password = password;  
  42.     }  
  43. }  
在Spring配置文件中,从配置文件中读取配置并将配置转换为封装的DataSource类:
  1. <bean id="masterDataSource" class="com.happyheng.connection.DataSource">  
  2.     <property name="driver" value="${master.driver}"/>  
  3.     <property name="url" value="${master.dburl}"/>  
  4.     <property name="user" value="${master.user}"/>  
  5.     <property name="password" value="${master.password}"/>  
  6. </bean>  
  7.   
  8. <bean id="slaveDataSource1" class="com.happyheng.connection.DataSource">  
  9.     <property name="driver" value="${slave1.driver}"/>  
  10.     <property name="url" value="${slave1.dburl}"/>  
  11.     <property name="user" value="${slave1.user}"/>  
  12.     <property name="password" value="${slave1.password}"/>  
  13. </bean>  
  14.   
  15. <bean id="slaveDataSource2" class="com.happyheng.connection.DataSource">  
  16.     <property name="driver" value="${slave2.driver}"/>  
  17.     <property name="url" value="${slave2.dburl}"/>  
  18.     <property name="user" value="${slave2.user}"/>  
  19.     <property name="password" value="${slave2.password}"/>  
  20. </bean>  
  21.   
  22. <bean id="propertyConfigurer"  
  23.       class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">  
  24.     <property name="locations">  
  25.         <list>  
  26.             <value>classpath:dataSource.properties</value>  
  27.         </list>  
  28.     </property>  
  29. </bean>  
    </div>
 <div class="tracking-ad" data-mod="popu_222"><a href="javascript:void(0);" target="_blank">&nbsp;</a>   </div>
<div class="tracking-ad" data-mod="popu_223"> <a href="javascript:void(0);" target="_blank">&nbsp;</a></div>
<script type="text/javascript">
    function btndigga() {
        $(".tracking-ad[data-mod='popu_222'] a").click();
    }
    function btnburya() {
        $(".tracking-ad[data-mod='popu_223'] a").click();
    }
        </script>
posted @ 2017-12-28 16:25  星朝  阅读(823)  评论(0编辑  收藏  举报