MYSQL实现主从insert和query分开操作

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
云数据库 RDS MySQL,高可用系列 2核4GB
简介:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
<?php
/**
  * gMysql MySQL数据库的驱动支持
  */
class  gMysql {
    /**
     * 数据库链接句柄
     */
    public  $conn ; // 当前使用的连接
    /**
     * 执行的SQL语句记录
     */
    public  $arrSql ;
 
    // 当前连接ID
    public  $m_link_id  = null;  // 主库连接
    public  $s_link_id  = null;  // 从库连接
         
    // 是否多库
    public  $multi_server  = false;
         
    // 数据库连接参数配置
    public  $dbConfig  array  ();
     public  $dbCurrent  array  ();
 
     /**
     * 构造函数
     *
     * @param dbConfig  数据库配置
     */
    public  function  __construct( $dbConfig )
    {
             $this ->dbConfig =  $dbConfig ;
             $this ->multi_server =  empty  $this ->dbConfig[ 'slave' ] ) ? false : true;
    }
    /**
     * 连接数据库方法
     * @param type $dbConfig 
     */
    public  function  connect ( $db ) {
       $this ->dbCurrent =  $db ;
       $linkfunction  = ( TRUE ==  $db [ 'persistent' ] ) ?  'mysql_pconnect'  'mysql_connect' ;
       $this ->conn =  $linkfunction  $db  [ 'host' ],  $db  [ 'username' ],  $db  [ 'password' ]);
 
       if  (!  $this ->conn) {
             return  false;
       }
       $re  = mysql_select_db( $db [ 'dbname' ],  $this ->conn);
       if (! $re ) {
          return  false;
       }
       mysql_query (  "SET NAMES '"  $db  ['charset '] . "' ",  $this ->conn );            
    }
    
    /**
     * 初始化数据库连接
     * @param type $master 
     */
    public  function  initConnect ( $master  = true) {
       if  ( $master  || ! $this ->multi_server) {
             if ( $this ->m_link_id){
                   $this ->conn =  $this ->m_link_id;
                   $this ->ping( $master );
             else  {
                   $this ->connect (  $this ->dbConfig [ 'master' ] );
                   $this ->m_link_id =  $this ->conn;
             }
       else  {
             if ( $this ->s_link_id){
                   $this ->conn =  $this ->s_link_id;
                   $this ->ping( $master );
             else  {
                   $rand  = rand(0,  count ( $this ->dbConfig [ 'slave' ]) - 1);
                   $this ->connect (  $this ->dbConfig [ 'slave' ][ $rand ] );
                   $this ->s_link_id =  $this ->conn;
             }
       }
     }
 
     /**
     * 按SQL语句获取记录结果,返回数组
     *
     * @param sql  执行的SQL语句
     */
    public  function  getArray( $sql )
    {
       if ( !  $result  $this ->query( $sql ) ) return  FALSE;
       if ( ! mysql_num_rows( $result ) )  return  FALSE;
       $rows  array ();
       while ( $rows [] = mysql_fetch_array( $result ,MYSQL_ASSOC)){}
       mysql_free_result( $result );
       array_pop ( $rows );
       return  $rows ;
    }
 
    /**
     * 返回当前插入记录的主键ID
     */
    public  function  newinsertid()
    {
       return  mysql_insert_id( $this ->conn);
    }
 
    /**
     * 格式化带limit的SQL语句
     */
    public  function  setlimit( $sql $limit )
    {
       return  $sql " LIMIT {$limit}" ;
    }
 
    /**
     * 执行一个SQL语句
     *
     * @param sql 需要执行的SQL语句
     */
    public  function  exec ( $sql )
    {
       $this ->arrSql[] =  $sql ;
         $this ->initConnect ( true );
       
       return  mysql_query( $sql $this ->conn);
    }
     /**
      * 执行一个SQL语句,主要用于查询
      * @param type $sql
      * @param type $master default:false 为true:强制读主库;为false:在有从库的的情况下优先读从库,否则读主库
      */
     public  function  query ( $sql $master  = false) {
         $this ->arrSql[] =  $sql ;
         $this ->initConnect (  $master  );
         return  mysql_query( $sql $this ->conn);
     }
 
    /**
     * 返回影响行数
     */
    public  function  affected_rows()
    {
       return  mysql_affected_rows( $this ->conn);
    }
 
    /**
     * 获取数据表结构
     *
     * @param tbl_name  表名称
     */
    public  function  getTable( $tbl_name )
    {
       return  $this ->getArray( "DESCRIBE {$tbl_name}" );
    }
     
    //防止mysql gone away
     public  function  ping( $master ) {
        if (!@mysql_ping( $this ->conn)){
          @mysql_close( $this ->conn);  //注意:一定要先执行数据库关闭,这是关键
          if ( $master  || ! $this ->multi_server) {
             unset( $this ->m_link_id);
          else  {
             unset( $this ->s_link_id);
          }
          $this ->initConnect( $master );
       }
     }
     
    /**
     * 对特殊字符进行过滤
     *
     * @param value  值
     */
    public  function  __val_escape( $value ) {
       if ( is_null ( $value )) return  'NULL' ;
       if ( is_bool ( $value )) return  $value  ? 1 : 0;
       if ( is_int ( $value )) return  (int) $value ;
       if ( is_float ( $value )) return  (float) $value ;
       if (@get_magic_quotes_gpc()) $value  stripslashes ( $value );
         $this ->conn ||  $this ->initConnect();
       return  '\'' .mysql_real_escape_string( $value $this ->conn). '\'' ;
    }
 
    public  function  escape( $value ) {
       if ( is_null ( $value )) return  'NULL' ;
       if ( is_bool ( $value )) return  $value  ? 1 : 0;
       if ( is_int ( $value )) return  (int) $value ;
       if ( is_float ( $value )) return  (float) $value ;
       if (@get_magic_quotes_gpc()) $value  stripslashes ( $value );
         $this ->conn ||  $this ->initConnect();
       return  mysql_real_escape_string( $value $this ->conn);
    }
    
    /**
     * 析构函数
     */
    public  function  __destruct()
    {
         if ( TRUE != @ $this ->dbCurrent[ 'persistent' ] )@mysql_close( $this ->conn);
    }
}

重点在 initConnect($master)方法里,这里决定加载的配置文件中是连接到主库还是从库

本文转自  陈小龙哈   51CTO博客,原文链接:http://blog.51cto.com/chenxiaolong/1828506

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
SQL 运维 关系型数据库
MySQL 中 GRANT 操作会引起复制中断吗?
GRANT 操作并不是一个原子性操作,不管执行成功与否,都会触发一个隐式重载授权表的行为。 在生产环境中需要规范用户创建及授权的操作,不推荐使用 DML 语句去直接变更 mysql.user 表,可能会引发其他的问题,若使用了 DML 语句进行变更, 需要手工执行 flush privileges。
205 4
|
JavaScript 关系型数据库 MySQL
创建nodejs项目并接入mysql,完成用户相关的增删改查的详细操作
创建nodejs项目并接入mysql,完成用户相关的增删改查的详细操作
184 0
|
SQL 关系型数据库 MySQL
MySQL的match WITH QUERY EXPANSION 模式是什么?如何使用?
【8月更文挑战第29天】MySQL的match WITH QUERY EXPANSION 模式是什么?如何使用?
168 5
|
存储 自然语言处理 关系型数据库
MySQL全文索引源码剖析之Insert语句执行过程
【8月更文挑战第17天】在MySQL中,处理含全文索引的`INSERT`语句涉及多步骤。首先进行语法解析确认语句结构无误;接着语义分析检查数据是否符合表结构及约束。随后存储引擎执行插入操作,若涉及全文索引则进行分词处理,并更新倒排索引结构。此外,事务管理确保了操作的完整性和一致性。通过示例创建含全文索引的表并插入数据,可见MySQL如何高效地处理此类操作,有助于优化数据库性能和提升全文搜索效果。
146 2
|
关系型数据库 MySQL Java
解决com.mysql.cj.jdbc.exceptions.PacketTooBigException: Packet for query is too large
这篇文章提供了解决MySQL JDBC驱动中`com.mysql.cj.jdbc.exceptions.PacketTooBigException: Packet for query is too large`错误的步骤,主要是通过增加配置文件中的`max_allowed_packet`参数值并重启服务来允许更大的数据包传输。
解决com.mysql.cj.jdbc.exceptions.PacketTooBigException: Packet for query is too large
|
关系型数据库 MySQL
解决MySQL insert出现Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘xxx‘ at row 1
解决MySQL insert出现Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘xxx‘ at row 1
901 2
|
存储 关系型数据库 MySQL
在 MySQL 中使用 Insert Into Select
【8月更文挑战第11天】
3548 0
在 MySQL 中使用 Insert Into Select
|
存储 关系型数据库 文件存储
面试题MySQL问题之简单的SELECT操作在MVCC下加锁如何解决
面试题MySQL问题之简单的SELECT操作在MVCC下加锁如何解决
115 2
|
SQL 关系型数据库 MySQL
MySQL 的 WITH QUERY EXPANSION 如何使用举例
【9月更文挑战第2天】MySQL 的 WITH QUERY EXPANSION 如何使用举例
148 0
|
存储 关系型数据库 MySQL
MySQL MATCH 函数如何使用 WITH QUERY EXPANSION?
【9月更文挑战第2天】MySQL MATCH 函数如何使用 WITH QUERY EXPANSION?
153 0

推荐镜像

更多