zoukankan      html  css  js  c++  java
  • java环境下的数据库读写分离

    方案很多:阿里的中间件cobar、aop注解方式、com.mysql.jdbc.ReplicationDriver读写分离驱动
    MySQL数据库的同步。

        MySQL是开源的关系型数据库系统。主从同步复制(Replication)是从一台MySQL数据库服务器(主服务器master)复制数据到另一个服务器(从服务器slave)的一个进程。

    配置主服务器(master)
        1、编辑数据库配置文件my.cnf 或 my.ini (windows),一般在/etc/目录下。
        #vi /etc/my.cnf
        在[mysqld]的下面加入下面代码:
    log-bin=mysql-bin
    server-id=1
    innodb_flush_log_at_trx_commit=1
    sync_binlog=1
    binlog-do-db=wordpress
    binlog_ignore_db=mysql

        server-id=1中的1可以任定义,只要是唯一的就行。
        binlog-do-db=wordpress是表示只备份wordpress。
        binlog_ignore_db=mysql表示忽略备份mysql。
        不加binlog-do-db和binlog_ignore_db,那就表示备份全部数据库。
    技术资源库http://www.qi788.com/info
        2、然后重启MySQL:
        #service mysqld restart

        3、登录MySQL服务器。
        #mysql -uroot -p

        在主服务器新建一个用户赋予“REPLICATION SLAVE”的权限。你不需要再赋予其它的权限。在下面的命令,把X.X.X.X替换为从服务器的IP。
        mysql>CREATE USER 'user'@ 'X.X.X.X' IDENTIFIED BY 'password';
        mysql>GRANT REPLICATION SLAVE ON *.* TO 'user'@'X.X.X.X' IDENTIFIED BY 'password';

        4、执行以下命令锁定数据库以防止写入数据。
        mysql>FLUSH TABLES WITH READ LOCK;

        5、退出mysql命令行,导出数据库
        #mysqldump -u root -p123456 --all-databases > /root/all.sql

        6、使用scp命令传输数据库文件all.sql到从服务器。
        #scp /root/all.sql root@www.example.com:/root

        7、再次连接数据库进入mysql命令行查看master状态。
        mysql>SHOW MASTER STATUS;

        请记下显示的信息,配置从服务器会用到。
    +——————+———-+————–+——————+
    | File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
    +——————+———-+————–+——————+
    | mysql-bin.000001| 253| dbispconfig | mysql |
    +——————+———-+————–+——————+
    1 row in set (0.00 sec)

        8、解锁数据表。
        mysql>UNLOCK TABLES;

    配置从服务器(slave)

        登录从服务器。
        1、导入主服务器的数据库。
        #mysql -u root -p123456 < /root/all.sql

        2、编辑配置文件my.cnf,在[mysqld]下面加入:
        server-id=2
        注:2可以自己定义,只要保证唯一的就行。

        3、保存文件并重启mysqld。
        #service mysqld restart

        4、登录mysql服务器,执行以下命令。
    mysql>CHANGE MASTER TO
    MASTER_HOST='X.X.X.X',
    MASTER_USER='user',
    MASTER_PASSWORD='password',
    MASTER_PORT=3306,
    MASTER_LOG_FILE='mysql-bin.000001,
    MASTER_LOG_POS=253,
    MASTER_CONNECT_RETRY=10;

      注:
        MASTER_HOST:主服务器的IP。
        MASTER_USER:配置主服务器时建立的用户名
        MASTER_PASSWORD:用户密码

        MASTER_PORT:主服务器mysql端口,如果未曾修改,默认即可。

        这里master_log_file和master_log_pos就是前面show master status的结果。


      5、启动slave进程。

        mysql>START SLAVE;

        mysql>SHOW SLAVE STATUS;  如果能查出一条记录 那么,配置成功


        6、查看mysql的日志,一般在/var/log/目录下,如果启动成功,你应该会看到类似下面的日志。
        091104 8:42:02 [Note] Slave I/O thread: connected to master ‘root@X.X.X.X:3306?, replication started in log ‘mysql-bin.000001? at position 98

        现在主服务器和从服务器已经配置好了。另外你可能需要设置主服务器的数据库二进制日志的过期时间,可以在配置文件中使用参数expire_logs_days来设定。

    java spring事务设置,方法头部设置

    @Transactional(readOnly=true)


    java  连接 驱动 设置
    jdbc.connection.driver=com.mysql.jdbc.ReplicationDriver
    jdbc.connection.url=jdbc:mysql:replication://192.168.202.190,192.168.202.190/job?useUnicode=true&characterEncoding=utf-8

    //------------------------------------------------------

    在用过Amoeba 和 Cobar,还有dbware 等读写分离组件后,今天我的一个好朋友跟我讲,MySQL自身的也是可以读写分离的,因为他们提供了一个新的驱动,叫 com.mysql.jdbc.ReplicationDriver

    说明文档:http://dev.mysql.com/doc/refman/5.1/en/connector-j-reference-replication-connection.html

    代码例子:

    import java.sql.Connection;
    import java.sql.ResultSet;
    import java.util.Properties;
     
    import com.mysql.jdbc.ReplicationDriver;
     
    public class ReplicationDriverDemo {
     
      public static void main(String[] args) throws Exception {
        ReplicationDriver driver = new ReplicationDriver();
     
        Properties props = new Properties();
     
        // We want this for failover on the slaves
        props.put("autoReconnect", "true");
     
        // We want to load balance between the slaves
        props.put("roundRobinLoadBalance", "true");
     
        props.put("user", "foo");
        props.put("password", "bar");
     
        //
        // Looks like a normal MySQL JDBC url, with a
        // comma-separated list of hosts, the first
        // being the 'master', the rest being any number
        // of slaves that the driver will load balance against
        //
     
        Connection conn =
            driver.connect("jdbc:mysql:replication://master,slave1,slave2,slave3/test",
                props);
     
        //
        // Perform read/write work on the master
        // by setting the read-only flag to "false"
        //
     
        conn.setReadOnly(false);
        conn.setAutoCommit(false);
        conn.createStatement().executeUpdate("UPDATE some_table ....");
        conn.commit();
     
        //
        // Now, do a query from a slave, the driver automatically picks one
        // from the list
        //
     
        conn.setReadOnly(true);
     
        ResultSet rs =
          conn.createStatement().executeQuery("SELECT a,b FROM alt_table");
     
         .......
      }
    }
  • 相关阅读:
    Civil 3D 二次开发 创建Civil 3D 对象—— 01 —— 创建几何空间点
    Civil 3D 二次开发 创建Civil 3D 对象—— 00 ——
    Civil 3D 二次开发 创建AutoCAD对象—— 01 —— 创建直线
    Civil 3D 二次开发 新建CLR项目出现错误C2143
    Civil 3D 二次开发 创建AutoCAD对象—— 00 ——
    了解AutoCAD对象层次结构 —— 6 ——块表记录
    datepicker97使用
    使用angular 外接 templateUrl,使用ng-include
    angularJs 遮罩
    网上找的有关css兼容问题
  • 原文地址:https://www.cnblogs.com/fx2008/p/3985790.html
Copyright © 2011-2022 走看看