【非常优秀的MySQLProxy程序启动分析】
1、程序启动代码分析:
Proxy 是单例模式的代理启动类,调用CommunicationThread类
public static void main(String[] args){
Proxy.getInstance().run();
}
CommunicationThread解析
CommunicationThread是个多线程类,用于front前段和back后端连接的桥梁,读取front前端的消息,发送给back后端,然后把back后端的返回结果,通过front写给前端工具(navcat or 应用程序),整个连接过程分四步走:
/**
Phase 1: From server to client. Send handshake packet.
Phase 2: From client to server. Send auth packet.
Phase 3: From server to client. send OK/ERROR packet.
Start communication.
*/
估计开源项目Mycat也是在此基础上面发展起来的
二、启动测试:
启动需要修改Backend中的后端数据库IP地址和端口号,以及前端连接对外的响应端口,根据个人需要,你也可以不修改前端端口,默认是50001,但是后端必须改。
public class Backend {
private static final int SERVER_PORT = 3306;
private static final String host = "127.0.0.1";
}
运行结果:
Get a connection.
SERVER:5.5.47
CLIENT:root
SERVER: OK
CLIENT:3:SET NAMES utf8
SERVER:OK affectedRows:0 message:null
CLIENT:1:
Get a connection.
SERVER:5.5.47
CLIENT:root
SERVER: OK
CLIENT:3:SET NAMES utf8
SERVER:OK affectedRows:0 message:null
CLIENT:3:SHOW VARIABLES LIKE 'lower_case_%'
SERVER:
-----------------------------------------------
Variable_nameValue
lower_case_file_systemON
lower_case_table_names1
-----------------------------------------------
CLIENT:3:SHOW VARIABLES LIKE 'profiling'
SERVER:
-----------------------------------------------
Variable_nameValue
profilingOFF
-----------------------------------------------
CLIENT:3:SHOW DATABASES
SERVER:
-----------------------------------------------
Database
information_schema
db1
db2
db3
mysql
performance_schema
test
-----------------------------------------------
Get a connection.
SERVER:5.5.47
CLIENT:root
SERVER: OK
CLIENT:3:SET NAMES utf8
SERVER:OK affectedRows:0 message:null
CLIENT:2:db1
SERVER:OK affectedRows:0 message:null
CLIENT:3:SELECT @@character_set_database, @@collation_database
SERVER:
-----------------------------------------------
@@[email protected]@collation_database
utf8utf8_general_ci
-----------------------------------------------
CLIENT:3:SHOW FULL TABLES WHERE Table_type != 'VIEW'
SERVER:
-----------------------------------------------
Tables_in_db1Table_type
studentBASE TABLE
t_areaBASE TABLE
t_gaojsBASE TABLE
t_userBASE TABLE
-----------------------------------------------
Get a connection.
SERVER:5.5.47
CLIENT:root
SERVER: OK
CLIENT:3:SET NAMES utf8
SERVER:OK affectedRows:0 message:null
CLIENT:2:db1
SERVER:OK affectedRows:0 message:null
CLIENT:3:SHOW CREATE TABLE `student`
SERVER:
-----------------------------------------------
TableCreate Table
studentCREATE TABLE `student` (
`NO` char(20) NOT NULL DEFAULT '',
`name` varchar(20) DEFAULT NULL,
PRIMARY KEY (`NO`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
-----------------------------------------------
CLIENT:3:SELECT * FROM `student` LIMIT 0, 1000
SERVER:
-----------------------------------------------
NOname
2012001gaojs
2012002gaojingsong
-----------------------------------------------
CLIENT:3:SHOW COLUMNS FROM `db1`.`student`
SERVER:
-----------------------------------------------
FieldTypeNullKeyDefaultExtra
NOchar(20)NOPRI
namevarchar(20)YES
-----------------------------------------------
CLIENT:1:
Get a connection.
SERVER:5.5.47
CLIENT:root
SERVER: OK
CLIENT:3:SET NAMES utf8
SERVER:OK affectedRows:0 message:null
CLIENT:2:db1
SERVER:OK affectedRows:0 message:null
CLIENT:3:SHOW CREATE TABLE `t_area`
SERVER:
-----------------------------------------------
TableCreate Table
t_areaCREATE TABLE `t_area` (
`id` int(11) NOT NULL,
`t_name` varchar(20) DEFAULT NULL,
`_mycat_op_time` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
-----------------------------------------------
CLIENT:3:SELECT * FROM `t_area` LIMIT 0, 1000
SERVER:
-----------------------------------------------
idt_name_mycat_op_time
1北京2017-02-02 10:30:46
-----------------------------------------------
CLIENT:3:SHOW COLUMNS FROM `db1`.`t_area`
SERVER:
-----------------------------------------------
FieldTypeNullKeyDefaultExtra
idint(11)NOPRI
t_namevarchar(20)YES
_mycat_op_timetimestampYESon update CURRENT_TIMESTAMP
-----------------------------------------------
CLIENT:1:
Get a connection.
SERVER:5.5.47
CLIENT:root
SERVER: OK
CLIENT:3:SET NAMES utf8
SERVER:OK affectedRows:0 message:null
CLIENT:2:db1
SERVER:OK affectedRows:0 message:null
CLIENT:3:SHOW CREATE TABLE `t_gaojs`
SERVER:
-----------------------------------------------
TableCreate Table
t_gaojsCREATE TABLE `t_gaojs` (
`uuid` int(11) NOT NULL AUTO_INCREMENT,
`id` int(11) DEFAULT NULL,
`address` varchar(20) DEFAULT NULL,
PRIMARY KEY (`uuid`),
KEY `index_name` (`id`),
KEY `index_address` (`address`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8
-----------------------------------------------
CLIENT:3:SELECT * FROM `t_gaojs` LIMIT 0, 1000
SERVER:
-----------------------------------------------
uuididaddress
13中国3
26中国6
39中国9
-----------------------------------------------
CLIENT:3:SHOW COLUMNS FROM `db1`.`t_gaojs`
SERVER:
-----------------------------------------------
FieldTypeNullKeyDefaultExtra
uuidint(11)NOPRIauto_increment
idint(11)YESMUL
addressvarchar(20)YESMUL
-----------------------------------------------
CLIENT:1:
Get a connection.
SERVER:5.5.47
CLIENT:root
SERVER: OK
CLIENT:3:SET NAMES utf8
SERVER:OK affectedRows:0 message:null
CLIENT:2:db1
SERVER:OK affectedRows:0 message:null
CLIENT:3:SHOW CREATE TABLE `t_user`
SERVER:
-----------------------------------------------
TableCreate Table
t_userCREATE TABLE `t_user` (
`id` int(11) NOT NULL DEFAULT '0',
`userName` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
-----------------------------------------------
CLIENT:3:SELECT * FROM `t_user` LIMIT 0, 1000
SERVER:
-----------------------------------------------
iduserName
10test_mycat
2gaojingsong
-----------------------------------------------
CLIENT:3:SHOW COLUMNS FROM `db1`.`t_user`
SERVER:
-----------------------------------------------
FieldTypeNullKeyDefaultExtra
idint(11)NOPRI0
userNamevarchar(100)YES
-----------------------------------------------
CLIENT:1: