Sharding-JDBC分库分表简单示例
1. 简介
Sharding是一个简单的分库分表中间件,它不需要依赖于其他的服务,即可快速应用在实际项目的分库分表策略中。
2. 初始化数据库(db0、db1、db2)
1 #创建数据库db0
2 CREATE DATABASE IF NOT EXISTS `db0` DEFAULT CHARACTER SET utf8;
3
4 USE `db0`;
5
6 DROP TABLE IF EXISTS `t_user_0`;
7 CREATE TABLE `t_user_0` (
8 `id` int(11) NOT NULL,
9 `username` varchar(255) DEFAULT NULL,
10 `org_code` int(11) DEFAULT NULL,
11 PRIMARY KEY (`id`)
12 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
13
14 DROP TABLE IF EXISTS `t_user_1`;
15 CREATE TABLE `t_user_1` (
16 `id` int(11) NOT NULL,
17 `username` varchar(255) DEFAULT NULL,
18 `org_code` int(11) DEFAULT NULL,
19 PRIMARY KEY (`id`)
20 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
21
22 DROP TABLE IF EXISTS `t_user_2`;
23 CREATE TABLE `t_user_2` (
24 `id` int(11) NOT NULL,
25 `username` varchar(255) DEFAULT NULL,
26 `org_code` int(11) DEFAULT NULL,
27 PRIMARY KEY (`id`)
28 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
29
30 #创建数据库db1
31 CREATE DATABASE IF NOT EXISTS `db1` DEFAULT CHARACTER SET utf8 ;
32
33 USE `db1`;
34
35 DROP TABLE IF EXISTS `t_user_0`;
36 CREATE TABLE `t_user_0` (
37 `id` int(11) NOT NULL,
38 `username` varchar(255) DEFAULT NULL,
39 `org_code` int(11) DEFAULT NULL,
40 PRIMARY KEY (`id`)
41 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
42
43 DROP TABLE IF EXISTS `t_user_1`;
44 CREATE TABLE `t_user_1` (
45 `id` int(11) NOT NULL,
46 `username` varchar(255) DEFAULT NULL,
47 `org_code` int(11) DEFAULT NULL,
48 PRIMARY KEY (`id`)
49 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
50
51 DROP TABLE IF EXISTS `t_user_2`;
52 CREATE TABLE `t_user_2` (
53 `id` int(11) NOT NULL,
54 `username` varchar(255) DEFAULT NULL,
55 `org_code` int(11) DEFAULT NULL,
56 PRIMARY KEY (`id`)
57 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
58
59 #创建数据库db2
60 CREATE DATABASE IF NOT EXISTS `db2` DEFAULT CHARACTER SET utf8;
61
62 USE `db2`;
63
64 DROP TABLE IF EXISTS `t_user_0`;
65 CREATE TABLE `t_user_0` (
66 `id` int(11) NOT NULL,
67 `username` varchar(255) DEFAULT NULL,
68 `org_code` int(11) DEFAULT NULL,
69 PRIMARY KEY (`id`)
70 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
71
72 DROP TABLE IF EXISTS `t_user_1`;
73 CREATE TABLE `t_user_1` (
74 `id` int(11) NOT NULL,
75 `username` varchar(255) DEFAULT NULL,
76 `org_code` int(11) DEFAULT NULL,
77 PRIMARY KEY (`id`)
78 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
79
80 DROP TABLE IF EXISTS `t_user_2`;
81 CREATE TABLE `t_user_2` (
82 `id` int(11) NOT NULL,
83 `username` varchar(255) DEFAULT NULL,
84 `org_code` int(11) DEFAULT NULL,
85 PRIMARY KEY (`id`)
86 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
3. 搭建工程
- 搭建Maven工程
- 修改pom.xml
1 <project xmlns="http://maven.apache.org/POM/4.0.0"
2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4 <modelVersion>4.0.0</modelVersion>
5 <groupId>com.c3stones</groupId>
6 <artifactId>sharding-jdbc-demo</artifactId>
7 <version>0.0.1-SNAPSHOT</version>
8 <name>sharding-jdbc-demo</name>
9 <description>Sharding JDBC Demo</description>
10
11 <parent>
12 <groupId>org.springframework.boot</groupId>
13 <artifactId>spring-boot-starter-parent</artifactId>
14 <version>2.1.6.RELEASE</version>
15 <relativePath />
16 </parent>
17
18 <properties>
19 <java.version>1.8</java.version>
20 <maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
21 <mybatis-plus.version>3.3.1</mybatis-plus.version>
22 <sharding-jdbc.version>3.1.0</sharding-jdbc.version>
23 </properties>
24
25 <dependencies>
26 <dependency>
27 <groupId>mysql</groupId>
28 <artifactId>mysql-connector-java</artifactId>
29 <scope>runtime</scope>
30 </dependency>
31 <dependency>
32 <groupId>com.baomidou</groupId>
33 <artifactId>mybatis-plus-boot-starter</artifactId>
34 <version>${mybatis-plus.version}</version>
35 </dependency>
36 <dependency>
37 <groupId>io.shardingsphere</groupId>
38 <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
39 <version>${sharding-jdbc.version}</version>
40 </dependency>
41 <dependency>
42 <groupId>io.shardingsphere</groupId>
43 <artifactId>sharding-jdbc-spring-namespace</artifactId>
44 <version>${sharding-jdbc.version}</version>
45 </dependency>
46 <dependency>
47 <groupId>org.projectlombok</groupId>
48 <artifactId>lombok</artifactId>
49 </dependency>
50 <dependency>
51 <groupId>org.springframework.boot</groupId>
52 <artifactId>spring-boot-starter-web</artifactId>
53 </dependency>
54 <dependency>
55 <groupId>org.springframework.boot</groupId>
56 <artifactId>spring-boot-starter-test</artifactId>
57 <scope>test</scope>
58 </dependency>
59 </dependencies>
60
61 <build>
62 <plugins>
63 <plugin>
64 <groupId>org.springframework.boot</groupId>
65 <artifactId>spring-boot-maven-plugin</artifactId>
66 </plugin>
67 </plugins>
68 </build>
69 </project>
- 编写实体类
1 import com.baomidou.mybatisplus.annotation.TableField;
2 import com.baomidou.mybatisplus.annotation.TableName;
3 import com.baomidou.mybatisplus.extension.activerecord.Model;
4
5 import lombok.Data;
6 import lombok.EqualsAndHashCode;
7
8 /**
9 * 用户信息
10 *
11 * @author CL
12 *
13 */
14 @Data
15 @TableName(value = "t_user")
16 @EqualsAndHashCode(callSuper = false)
17 public class User extends Model<User> {
18
19 private static final long serialVersionUID = 1L;
20 private int id;
21 private String username;
22 @TableField(value = "org_code")
23 private int orgCode;
24
25 }
- 编写Mapper
1 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
2 import com.c3stones.entity.User;
3
4 /**
5 * 用户Mapper
6 *
7 * @author CL
8 *
9 */
10 public interface UserMapper extends BaseMapper<User> {
11
12 }
- 编写Service
1 import java.util.List;
2
3 import com.c3stones.entity.User;
4
5 /**
6 * 用户Service
7 *
8 * @author CL
9 *
10 */
11 public interface UserService {
12
13 /**
14 * 查询用户列表
15 *
16 * @return
17 */
18 List<User> findList();
19
20 /**
21 * 保存用户信息
22 *
23 * @param user
24 * @return
25 */
26 boolean save(User user);
27
28 }
1 import java.util.List;
2
3 import org.springframework.stereotype.Service;
4
5 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
6 import com.c3stones.entity.User;
7 import com.c3stones.mapper.UserMapper;
8 import com.c3stones.service.UserService;
9
10 /**
11 * 用户Service实现类
12 *
13 * @author CL
14 *
15 */
16 @Service
17 public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
18
19 /**
20 * 查询用户列表
21 *
22 * @return
23 */
24 @Override
25 public List<User> findList() {
26 return new User().selectAll();
27 }
28
29 /**
30 * 保存用户信息
31 *
32 * @param user
33 * @return
34 */
35 @Override
36 public boolean save(User user) {
37 return super.save(user);
38 }
39
40 }
- 编写Controller
1 import java.util.List;
2
3 import org.springframework.beans.factory.annotation.Autowired;
4 import org.springframework.web.bind.annotation.GetMapping;
5 import org.springframework.web.bind.annotation.PostMapping;
6 import org.springframework.web.bind.annotation.RestController;
7
8 import com.c3stones.entity.User;
9 import com.c3stones.service.UserService;
10
11 /**
12 * 用户Controller
13 *
14 * @author CL
15 *
16 */
17 @RestController
18 public class UserController {
19
20 @Autowired
21 private UserService userService;
22
23 @PostMapping(value = "save")
24 public boolean save(User user) {
25 return userService.save(user);
26 }
27
28 @GetMapping(value = "list")
29 public List<User> findList() {
30 return userService.findList();
31 }
32 }
- 编写启动类
1 import org.mybatis.spring.annotation.MapperScan;
2 import org.springframework.boot.SpringApplication;
3 import org.springframework.boot.autoconfigure.SpringBootApplication;
4
5 /**
6 * 启动类
7 *
8 * @author CL
9 *
10 */
11 @SpringBootApplication
12 @MapperScan(value = "com.c3stones.mapper")
13 public class Application {
14
15 public static void main(String[] args) {
16 SpringApplication.run(Application.class, args);
17 }
18
19 }
- 添加配置文件application.yml
1 spring:
2 main:
3 allow-bean-definition-overriding: true #允许Bean重复注入,后者覆盖前者
4 sharding:
5 jdbc:
6 datasource:
7 names: db0,db1,db2
8 db0:
9 type: com.zaxxer.hikari.HikariDataSource
10 driver-class-name: com.mysql.cj.jdbc.Driver
11 jdbc-url: jdbc:mysql://localhost:3306/db0?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
12 username: root
13 password: root
14 db1:
15 type: com.zaxxer.hikari.HikariDataSource
16 driver-class-name: com.mysql.cj.jdbc.Driver
17 jdbc-url: jdbc:mysql://localhost:3306/db1?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
18 username: root
19 password: root
20 db2:
21 type: com.zaxxer.hikari.HikariDataSource
22 driver-class-name: com.mysql.cj.jdbc.Driver
23 jdbc-url: jdbc:mysql://localhost:3306/db2?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
24 username: root
25 password: root
26 config:
27 props:
28 sql.show: true #打印sql
29 sharding:
30 default-database-strategy: #默认分库策略
31 inline:
32 sharding-column: id
33 algorithm-expression: db$->{id % 3}
34 tables:
35 t_user:
36 actual-data-nodes: db$->{0..2}.t_user_$->{0..2} #实际节点
37 table-strategy: #分表策略
38 inline:
39 sharding-column: org_code
40 algorithm-expression: t_user_$->{org_code % 3}
4. 测试
测试时观察控制台打印的SQL。
- 保存用户信息,id=1
控制台:
2020-04-29 12:41:36.849 INFO 4384 --- [nio-8080-exec-6] ShardingSphere-SQL : Rule Type: sharding
2020-04-29 12:41:36.850 INFO 4384 --- [nio-8080-exec-6] ShardingSphere-SQL : Logic SQL: INSERT INTO t_user ( id,
username,
org_code ) VALUES ( ?,
?,
? )
2020-04-29 12:41:36.850 INFO 4384 --- [nio-8080-exec-6] ShardingSphere-SQL : SQLStatement: InsertStatement(super=DMLStatement(super=io.shardingsphere.core.parsing.parser.sql.dml.insert.InsertStatement@37b6baa2), columns=[Column(name=id, tableName=t_user), Column(name=username, tableName=t_user), Column(name=org_code, tableName=t_user)], generatedKeyConditions=[], insertValues=InsertValues(insertValues=[InsertValue(type=VALUES, expression=( ?,
?,
? ), parametersCount=3)]), columnsListLastPosition=45, generateKeyColumnIndex=-1, insertValuesListLastPosition=67)
2020-04-29 12:41:36.850 INFO 4384 --- [nio-8080-exec-6] ShardingSphere-SQL : Actual SQL: db1 ::: INSERT INTO t_user_2 ( id,
username,
org_code ) VALUES ( ?,
?,
? ) ::: [[1, 张三, 1001]]
- 保存用户信息,id=2
控制台:
1 2020-04-29 12:40:34.611 INFO 4384 --- [nio-8080-exec-3] ShardingSphere-SQL : Rule Type: sharding
2 2020-04-29 12:40:34.611 INFO 4384 --- [nio-8080-exec-3] ShardingSphere-SQL : Logic SQL: INSERT INTO t_user ( id,
3 username,
4 org_code ) VALUES ( ?,
5 ?,
6 ? )
7 2020-04-29 12:40:34.611 INFO 4384 --- [nio-8080-exec-3] ShardingSphere-SQL : SQLStatement: InsertStatement(super=DMLStatement(super=io.shardingsphere.core.parsing.parser.sql.dml.insert.InsertStatement@37b6baa2), columns=[Column(name=id, tableName=t_user), Column(name=username, tableName=t_user), Column(name=org_code, tableName=t_user)], generatedKeyConditions=[], insertValues=InsertValues(insertValues=[InsertValue(type=VALUES, expression=( ?,
8 ?,
9 ? ), parametersCount=3)]), columnsListLastPosition=45, generateKeyColumnIndex=-1, insertValuesListLastPosition=67)
10 2020-04-29 12:40:34.611 INFO 4384 --- [nio-8080-exec-3] ShardingSphere-SQL : Actual SQL: db2 ::: INSERT INTO t_user_0 ( id,
11 username,
12 org_code ) VALUES ( ?,
13 ?,
14 ? ) ::: [[2, 李四, 1002]]
- 保存用户信息,id=3
控制台:
1 2020-04-29 12:42:02.260 INFO 4384 --- [nio-8080-exec-1] ShardingSphere-SQL : Rule Type: sharding
2 2020-04-29 12:42:02.263 INFO 4384 --- [nio-8080-exec-1] ShardingSphere-SQL : Logic SQL: INSERT INTO t_user ( id,
3 username,
4 org_code ) VALUES ( ?,
5 ?,
6 ? )
7 2020-04-29 12:42:02.263 INFO 4384 --- [nio-8080-exec-1] ShardingSphere-SQL : SQLStatement: InsertStatement(super=DMLStatement(super=io.shardingsphere.core.parsing.parser.sql.dml.insert.InsertStatement@37b6baa2), columns=[Column(name=id, tableName=t_user), Column(name=username, tableName=t_user), Column(name=org_code, tableName=t_user)], generatedKeyConditions=[], insertValues=InsertValues(insertValues=[InsertValue(type=VALUES, expression=( ?,
8 ?,
9 ? ), parametersCount=3)]), columnsListLastPosition=45, generateKeyColumnIndex=-1, insertValuesListLastPosition=67)
10 2020-04-29 12:42:02.263 INFO 4384 --- [nio-8080-exec-1] ShardingSphere-SQL : Actual SQL: db0 ::: INSERT INTO t_user_1 ( id,
11 username,
12 org_code ) VALUES ( ?,
13 ?,
14 ? ) ::: [[3, 赵六, 1003]]
- 查询用户信息
控制台:
1 2020-04-29 12:42:15.962 INFO 4384 --- [nio-8080-exec-4] ShardingSphere-SQL : Rule Type: sharding
2 2020-04-29 12:42:15.963 INFO 4384 --- [nio-8080-exec-4] ShardingSphere-SQL : Logic SQL: SELECT id,username,org_code FROM t_user
3 2020-04-29 12:42:15.963 INFO 4384 --- [nio-8080-exec-4] ShardingSphere-SQL : SQLStatement: SelectStatement(super=DQLStatement(super=io.shardingsphere.core.parsing.parser.sql.dql.select.SelectStatement@53468979), containStar=false, firstSelectItemStartPosition=8, selectListLastPosition=29, groupByLastPosition=0, items=[CommonSelectItem(expression=id, alias=Optional.absent()), CommonSelectItem(expression=username, alias=Optional.absent()), CommonSelectItem(expression=org_code, alias=Optional.absent())], groupByItems=[], orderByItems=[], limit=null, subQueryStatement=null, subQueryStatements=[], subQueryConditions=[])
4 2020-04-29 12:42:15.963 INFO 4384 --- [nio-8080-exec-4] ShardingSphere-SQL : Actual SQL: db0 ::: SELECT id,username,org_code FROM t_user_0
5 2020-04-29 12:42:15.963 INFO 4384 --- [nio-8080-exec-4] ShardingSphere-SQL : Actual SQL: db0 ::: SELECT id,username,org_code FROM t_user_1
6 2020-04-29 12:42:15.963 INFO 4384 --- [nio-8080-exec-4] ShardingSphere-SQL : Actual SQL: db0 ::: SELECT id,username,org_code FROM t_user_2
7 2020-04-29 12:42:15.963 INFO 4384 --- [nio-8080-exec-4] ShardingSphere-SQL : Actual SQL: db1 ::: SELECT id,username,org_code FROM t_user_0
8 2020-04-29 12:42:15.963 INFO 4384 --- [nio-8080-exec-4] ShardingSphere-SQL : Actual SQL: db1 ::: SELECT id,username,org_code FROM t_user_1
9 2020-04-29 12:42:15.963 INFO 4384 --- [nio-8080-exec-4] ShardingSphere-SQL : Actual SQL: db1 ::: SELECT id,username,org_code FROM t_user_2
10 2020-04-29 12:42:15.963 INFO 4384 --- [nio-8080-exec-4] ShardingSphere-SQL : Actual SQL: db2 ::: SELECT id,username,org_code FROM t_user_0
11 2020-04-29 12:42:15.963 INFO 4384 --- [nio-8080-exec-4] ShardingSphere-SQL : Actual SQL: db2 ::: SELECT id,username,org_code FROM t_user_1
12 2020-04-29 12:42:15.964 INFO 4384 --- [nio-8080-exec-4] ShardingSphere-SQL : Actual SQL: db2 ::: SELECT id,username,org_code FROM t_user_2
5. 项目地址
https://github.com/C3Stones/blog
Sharding-JDBC分库分表简单示例的更多相关文章
- 分布式事务-Sharding 数据库分库分表
Sharding (转)大型互联网站解决海量数据的常见策略 - - ITeye技术网站 阿里巴巴Cobar架构设计与实践 - 机械机电 - 道客巴巴 阿里分布式数据库服务原理与实践:沈询_文档下载 ...
- Mycat配置分库分表(垂直分库、水平分表)、全局序列
1. Mycat相关文章 Linux安装Mycat1.6.7.4并实现Mysql数据库读写分离简单配置 Linux安装Mysql8.0.20并配置主从复制(一主一从,双主双从) Docke ...
- mysql、oracle分库分表方案之sharding-jdbc使用(非demo示例)
选择开源核心组件的一个非常重要的考虑通常是社区活跃性,一旦项目团队无法进行自己后续维护和扩展的情况下更是如此. 至于为什么选择sharding-jdbc而不是Mycat,可以参考知乎讨论帖子https ...
- Mycat读写分离、主从切换、分库分表的操作记录
系统开发中,数据库是非常重要的一个点.除了程序的本身的优化,如:SQL语句优化.代码优化,数据库的处理本身优化也是非常重要的.主从.热备.分表分库等都是系统发展迟早会遇到的技术问题问题.Mycat是一 ...
- 分库分表技术演进&最佳实践
每个优秀的程序员和架构师都应该掌握分库分表,这是我的观点. 移动互联网时代,海量的用户每天产生海量的数量,比如: 用户表 订单表 交易流水表 以支付宝用户为例,8亿:微信用户更是10亿.订单表更夸张, ...
- 分库分表后跨分片查询与Elastic Search
携程酒店订单Elastic Search实战:http://www.lvesu.com/blog/main/cms-610.html 为什么分库分表后不建议跨分片查询:https://www.jian ...
- 【大数据和云计算技术社区】分库分表技术演进&最佳实践笔记
1.需求背景 移动互联网时代,海量的用户每天产生海量的数量,这些海量数据远不是一张表能Hold住的.比如 用户表:支付宝8亿,微信10亿.CITIC对公140万,对私8700万. 订单表:美团每天几千 ...
- go分库分表 主从分离例子
网上有很多介绍分库分表的文章,方法很多: 分区表切分 垂直切分 水平切分 区间切分 取模切分 这里不细说 分库分表简单,但后期会带来一系列的难题: 事务 Join 分页 数据库: master和sla ...
- 转数据库分库分表(sharding)系列(一) 拆分实施策略和示例演示
本文原文连接: http://blog.csdn.net/bluishglc/article/details/7696085 ,转载请注明出处!本文着重介绍sharding切分策略,如果你对数据库sh ...
随机推荐
- git key生成
1.打开git ssh 2.检查home目录的ssh目录是否存在,没有创建一个,mkdir ~/.ssh 3.运行命名:ssh-keygen -t rsa -C "你的邮箱", 如 ...
- 超强工具集——GitHub 热点速览 Vol.47
作者:HelloGitHub-小鱼干 本周 GitHub 趋势榜精彩至极,先是 JetBrains 开源的图像渲染引擎 Skia 有了 Java 封装,一开源便获得 500+ star,再是支持开发者 ...
- POJ1390 Blocks (区间DP)
题目链接:POJ 1390.Blocks 题意: 有n个方块排成一列,每个方块有颜色即1到n的一个值,每次操作可以把一段相同颜色的方块拿走,长度为k,则获得的分数为 \(k\times k\),求可获 ...
- 3dmax利用静止静态对象功能,制作精准击碎效果
一般情况下,当我们在3D建模中使用RayFire破碎插件来制作一些精准击碎效果时,需要将物体的击中部分定义为休眠对象,将其他未击中的部分定义为静态对象,以实现击中部分出现碎片的效果.但这种方式必须精准 ...
- VMware与Device/Credential Guard不兼容问题
启动虚拟机vmware突然报不兼容错误 解决方法: 1首先打开控制面板>程序>启动或关闭Windows功能, 取消Hyper-v的勾选 2.在往下划,关闭Windows沙盒的勾选沙盒和虚拟 ...
- 分析 5种分布式事务方案,还是选了阿里的 Seata(原理 + 实战)
好长时间没发文了,最近着实是有点忙,当爹的第 43 天,身心疲惫.这又赶上年底,公司冲 KPI 强制技术部加班到十点,晚上孩子隔两三个小时一醒,基本没睡囫囵觉的机会,天天处于迷糊的状态,孩子还时不时起 ...
- Java蓝桥杯——逻辑推理练习题
逻辑推理题 谁是贼? 公安人员审问四名窃贼嫌疑犯.已知,这四人当中仅有一名是窃贼,还知道这四人中每人要么是诚实的,要么总是说谎.在回答公安人员的问题中: 甲说:"乙没有偷,是丁偷的.&quo ...
- Java String 演进全解析
前言 String 是我们使用最频繁的对象,使用不当会对内存.程序的性能造成影响,本篇文章全面介绍一下 Java 的 String 是如何演进的,以及使用 String 的注意事项. 下面的输出结果是 ...
- EntityFramework Core健康检查
前言 .NET Core提供对应方法可进行健康检查,那么在EF Core中是否也提供了相应的方式呢?EF Core 2.2+(包含2.2)版本提供了针对上下文的健康检查,接下来我们直接利用.NET 5 ...
- Python【Python基础】
python的使用 1.python的两个版本:python2.0与python3.0.这两个版本的区别在于python3是不向下兼容python2的组件和扩展的,但是在python2.6和2.7的两 ...