Mycat\atlas\sharding-jdbc

2024-04-15 18:32
文章标签 jdbc atlas sharding mycat

本文主要是介绍Mycat\atlas\sharding-jdbc,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

背景

数据库中间件选型思考
官网上安装、配置信息零散,需要使用者收集整理信息,在理解基础上正确配置,才能保证运行成功。这个工作比较耗时,希望读者看到此博客能快速run起来。

网络博客上也有很多人写Mycat和Atlas,绝大多数是针对Mycat和Atlas读写分离场景配置的。对Atlas,奇虎360在GitHub上开源了2个版本,一个版本为纯代理版,支持分表功能,另一个为Sharding版本。本次配置分库分表场景。

环境准备

部署架构

部署架构图

部署环境

MySQL:申请4个节点配置相同(虚拟机或物理机都可以),每个节点创建一个数据库,名称相同都为dbproxy,接着每个库创建一个相同表sbtest1
Mycat:下载Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
Atlas:下载Atlas-sharding_1.0.1-el6.x86_64.rpm
创建一个表:sbtest1
sbtest1表结构为:

CREATE TABLE `sbtest1` (`id` int(10) unsigned NOT NULL,`k` int(10) unsigned NOT NULL DEFAULT '0',`c` char(120) NOT NULL DEFAULT '',`pad` char(60) NOT NULL DEFAULT '',PRIMARY KEY (`id`),KEY `k_1` (`k`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

sbtest1表结构为使用sysbench工具创建生成的,去掉了自增主键设置,后续就可以直接使用扩展版sysbench测试

中间件安装配置

Mycat安装配置

Mycat服务有2种配置方式,其一为在zookeeper上配置,启动后也会把内容写到*.xml几个文件中,其二是直接到*.xml修改配置,本次采用第二种方式简单方便。

安装

tar xzvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz

配置

server.xml账号和资源配置

<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/"><system><property name="useSqlStat">0</property>  <!-- 1为开启实时统计、0为关闭 --><property name="useGlobleTableCheck">0</property>  <!-- 1为开启全加班一致性检测、0为关闭 --><property name="sequnceHandlerType">2</property><property name="processorBufferPoolType">0</property><property name="serverPort">8066</property><property name="managerPort">9066</property> <property name="idleTimeout">300000</property> <property name="bindIp">0.0.0.0</property> <property name="processorExecutor">32</property>    <property name="handleDistributedTransactions">0</property><property name="useOffHeapForMerge">1</property><property name="memoryPageSize">1m</property><property name="spillsFileBufferSize">1k</property><property name="useStreamOutput">0</property><property name="systemReserveMemorySize">384m</property><property name="useZKSwitch">true</property></system><user name="root"><property name="password">123456</property><property name="schemas">testdb</property></user><user name="user"><property name="password">123456</property><property name="schemas">testdb</property><property name="readOnly">true</property></user>
</mycat:server>

Mycat会对数据库访问资源进行管理,有2种类型账号,分为管理员、普通用户;管理员负责中间件各种资源管理(后端数据库访问)、查看、分配等,普通用户只能对数据库进行DDL和DML操作。每个用户配置了访问具体数据库资源,由schemas参数决定,未配置则无法访问。

schema.xml逻辑库配置

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/"><schema name="testdb" checkSQLschema="false" sqlMaxLimit="10000" ><table name="sbtest1" primaryKey="id" dataNode="dn01,dn02,dn03,dn04" rule="mod-long" /></schema><dataNode name="dn01" dataHost="dbp1" database="dbproxy" /><dataNode name="dn02" dataHost="dbp2" database="dbproxy" /><dataNode name="dn03" dataHost="dbp3" database="dbproxy" /><dataNode name="dn04" dataHost="dbp4" database="dbproxy" /><dataHost name="dbp1" maxCon="2000" minCon="1000" balance="3" writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100"><heartbeat>select user()</heartbeat><writeHost host="dbpHostM1" url="ip01:3306" user="zhitao" password="iyw_=EseXx94"></writeHost>            </dataHost><dataHost name="dbp2" maxCon="2000" minCon="1000" balance="3" writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100"><heartbeat>select user()</heartbeat><writeHost host="dbpHostM2" url="ip02:3306" user="zhitao" password="iyw_=EseXx94"></writeHost></dataHost> <dataHost name="dbp3" maxCon="2000" minCon="1000" balance="3" writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100"><heartbeat>select user()</heartbeat><writeHost host="dbpHostM3" url="ip03:3306" user="zhitao" password="iyw_=EseXx94"></writeHost></dataHost><dataHost name="dbp4" maxCon="2000" minCon="1000" balance="3" writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100"><heartbeat>select user()</heartbeat><writeHost host="dbpHostM4" url="ip04:3306" user="zhitao" password="iyw_=EseXx94"></writeHost></dataHost>
</mycat:schema>

以上配置了4个逻辑库,只有主库没配从库,如有需要读者可以加上,一个表sbtest1数据切分到4个逻辑库上。其中’rule=”mod-long”‘表示选择取模算法,对应下面的配置

rule.xml分片规则配置

......<function name="mod-long" class="io.mycat.route.function.PartitionByMod"><!-- how many data nodes --><property name="count">4</property></function>
......

表示id % 4 = 路由到对应逻辑库上(dbp1|dbp2|dbp3|dbp4)
数据分片规则

成功执行一条SQL语句:
成功执行一条SQL语句


Atlas安装配置

Atlas配置相对较简单,配置项和文件都比Mycat要少

安装

1.执行如下命令
sudo rpm –i Atlas-XX.el6.x86_64.rpm
默认安装目录:/usr/local/mysql-proxy
2.配置test.cnf
进入conf目录

[mysql-proxy]
admin-username = user
admin-password = 123456
#配置代理或读写分离主库配置
admin-lua-script = /usr/local/mysql-proxy/lib/mysql-proxy/lua/admin.lua#Atlas后端连接的MySQL主库的IP和端口,可设置多项,用逗号分隔
#proxy-backend-addresses = ip01:3306,ip02:3306#Atlas后端连接的MySQL从库的IP和端口,@后面的数字代表权重,用来作负载均衡,若省略则默认为1,可设置多项,用逗号分隔
#proxy-read-only-backend-addresses = readonlyIP01:3306,readonlyIP02:3306#示例,配置代理主库配置
proxy-backend-addresses = ipxxx:3306daemon = true
keepalive = false
#libevent线程数配置
event-threads = 32
log-level = error
#日志路径
log-path = /usr/local/mysql-proxy/log
sql-log = OFF
#代理端口配置,用于操作数据库
proxy-address = 0.0.0.0:1234
#管理端口配置,用于管理资源,监控,系统信息操作、查看等
admin-address = 0.0.0.0:2345
charset = UTF8
wait-timeout = 3600
#Atlas密码需要加密,安装Atlas进入bin目录,执行:./encrypt mysql数据库密码;生成加密串拷贝上去
pwds = zhitao:If2Il8Bd7YgWZ+vzsw3ZlQ==[shardrule-0]
table = dbproxy.sbtest1
# sharding类型:range或hash,本次
type = hash  
# 分片字段名
shard-key = id
# 0:0-999,1:1000-1999 #分片的group,如果是range类型的sharding,则groups的格式是:group_id:id范围。如果是hash类型的sharding,则groups的格式是:group_id。例如groups = 0, 1
groups = 0,1,2,3[group-0]
# master
proxy-backend-addresses=ip01:3306[group-1]
proxy-backend-addresses=ip02:3306[group-2]
proxy-backend-addresses=ip03:3306[group-3]
proxy-backend-addresses=ip04:3306

登录Atlas:
登录Atlas

执行SQL Atlas:
执行SQL Atlas

 

注意:配置分库分表时,只有指定的分表才会执行shardrule流程,其他表走正常请求流程,所以要配置proxy-backend-addresses,从库配置视部署情况可选

 

 

Sharding-JDBC介绍:

整合spring+mybatis+sharding-jdbc

Sharding-JDBC直接封装JDBC API,可以理解为增强版的JDBC驱动,旧代码迁移成本几乎为零:

  • 可适用于任何基于javaORM框架,如:JPAHibernateMybatisSpring JDBC Template或直接使用JDBC
  • 可基于任何第三方的数据库连接池,如:DBCPC3P0BoneCPDruid等。
  • 理论上可支持任意实现JDBC规范的数据库。虽然目前仅支持MySQL,但已有支持OracleSQLServerDB2等数据库的计划。

Sharding-JDBC定位为轻量级java框架,使用客户端直连数据库,以jar包形式提供服务,未使用中间层,无需额外部署,无其他依赖,DBA也无需改变原有的运维方式。SQL解析使用Druid解析器,是目前性能最高的SQL解析器。

Sharding-JDBC功能灵活且全面:

  • 分片策略灵活,可支持=BETWEENIN等多维度分片,也可支持多分片键共用。
  • SQL解析功能完善,支持聚合,分组,排序,LimitOR等查询,并且支持Binding Table以及笛卡尔积的表查询。
  • 支持柔性事务(目前仅最大努力送达型)。
  • 支持读写分离。

Sharding-JDBC配置多样:

  • 可支持YAML和Spring命名空间配置
  • 灵活多样的inline方式

pom.xml

[java] view plain copy print?

  1. <span style="white-space:pre">    </span><dependency>  
  2.     <span style="white-space:pre">    </span><groupId>com.dangdang</groupId>  
  3.         <artifactId>sharding-jdbc-core</artifactId>  
  4.         <version>1.3.2</version>  
  5.     </dependency>  
  6.     <dependency>  
  7.         <groupId>com.dangdang</groupId>  
  8.         <artifactId>sharding-jdbc-config-spring</artifactId>  
  9.         <version>1.3.2</version>  
  10.     </dependency>  
  11.     <dependency>  
  12.         <groupId>com.dangdang</groupId>  
  13.         <artifactId>sharding-jdbc-config-common</artifactId>  
  14.         <version>1.3.2</version>  
  15.     </dependency>  
<span style="white-space:pre">	</span><dependency><span style="white-space:pre">	</span><groupId>com.dangdang</groupId><artifactId>sharding-jdbc-core</artifactId><version>1.3.2</version></dependency><dependency><groupId>com.dangdang</groupId><artifactId>sharding-jdbc-config-spring</artifactId><version>1.3.2</version></dependency><dependency><groupId>com.dangdang</groupId><artifactId>sharding-jdbc-config-common</artifactId><version>1.3.2</version></dependency>

创建三个库,一主(dbtal_0_master)两从(dbtal_0_slave_0、dbtal_0_slave_1

建表语句

[sql] view plain copy print?

  1. SET FOREIGN_KEY_CHECKS=0;  
  2.   
  3. -- ----------------------------  
  4. -- Table structure for t_user_0  
  5. -- ----------------------------  
  6. DROP TABLE IF EXISTS `t_user_0`;  
  7. CREATE TABLE `t_user_0` (  
  8.   `id` int(11) NOT NULL AUTO_INCREMENT,  
  9.   `user_id` int(11) NOT NULL,  
  10.   `name` varchar(255) NOT NULL,  
  11.   `age` int(11) NOT NULL,  
  12.   PRIMARY KEY (`id`)  
  13. ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;  
  14.   
  15. -- ----------------------------  
  16. -- Table structure for t_user_1  
  17. -- ----------------------------  
  18. DROP TABLE IF EXISTS `t_user_1`;  
  19. CREATE TABLE `t_user_1` (  
  20.   `id` int(11) NOT NULL AUTO_INCREMENT,  
  21.   `user_id` int(11) NOT NULL,  
  22.   `name` varchar(255) NOT NULL,  
  23.   `age` int(11) NOT NULL,  
  24.   PRIMARY KEY (`id`)  
  25. ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;  
  26.   
  27. -- ----------------------------  
  28. -- Table structure for t_user_2  
  29. -- ----------------------------  
  30. DROP TABLE IF EXISTS `t_user_2`;  
  31. CREATE TABLE `t_user_2` (  
  32.   `id` int(11) NOT NULL AUTO_INCREMENT,  
  33.   `user_id` int(11) NOT NULL,  
  34.   `name` varchar(255) NOT NULL,  
  35.   `age` int(11) NOT NULL,  
  36.   PRIMARY KEY (`id`)  
  37. ) ENGINE=InnoDB AUTO_INCREMENT=30 DEFAULT CHARSET=utf8;  
SET FOREIGN_KEY_CHECKS=0;-- ----------------------------
-- Table structure for t_user_0
-- ----------------------------
DROP TABLE IF EXISTS `t_user_0`;
CREATE TABLE `t_user_0` (`id` int(11) NOT NULL AUTO_INCREMENT,`user_id` int(11) NOT NULL,`name` varchar(255) NOT NULL,`age` int(11) NOT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;-- ----------------------------
-- Table structure for t_user_1
-- ----------------------------
DROP TABLE IF EXISTS `t_user_1`;
CREATE TABLE `t_user_1` (`id` int(11) NOT NULL AUTO_INCREMENT,`user_id` int(11) NOT NULL,`name` varchar(255) NOT NULL,`age` int(11) NOT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;-- ----------------------------
-- Table structure for t_user_2
-- ----------------------------
DROP TABLE IF EXISTS `t_user_2`;
CREATE TABLE `t_user_2` (`id` int(11) NOT NULL AUTO_INCREMENT,`user_id` int(11) NOT NULL,`name` varchar(255) NOT NULL,`age` int(11) NOT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=30 DEFAULT CHARSET=utf8;

User.java

[java] view plain copy print?

  1. /**     
  2.  * @filename User.java      
  3.  * @version www.mindai.com   
  4.  * @date 2016年10月26日      
  5.  */  
  6. package com.mjkf.demo.domain.model;  
  7.   
  8. import javax.persistence.Id;  
  9. import javax.persistence.Table;  
  10.   
  11. import com.mjkf.framework.core.base.model.BaseModel;  
  12.   
  13. /**       
  14.  * @author farrell     
  15.  * @date 2016年10月26日    
  16.  */  
  17.   
  18. @Table(name="t_user")  
  19. public class User extends BaseModel {  
  20.   
  21.     /**     
  22.      * serialVersionUID       
  23.      * @since Ver 1.1     
  24.      */      
  25.       
  26.     private static final long serialVersionUID = -4044598743926228429L;  
  27.       
  28.     @Id  
  29.     private Integer id;  
  30.       
  31.     private Integer userId;  
  32.       
  33.     private String name;  
  34.       
  35.     private Integer age;  
  36.   
  37.     public Integer getId() {  
  38.         return id;  
  39.     }  
  40.   
  41.     public void setId(Integer id) {  
  42.         this.id = id;  
  43.     }  
  44.   
  45.     public Integer getUserId() {  
  46.         return userId;  
  47.     }  
  48.   
  49.     public void setUserId(Integer userId) {  
  50.         this.userId = userId;  
  51.     }  
  52.   
  53.     public String getName() {  
  54.         return name;  
  55.     }  
  56.   
  57.     public void setName(String name) {  
  58.         this.name = name;  
  59.     }  
  60.   
  61.     public Integer getAge() {  
  62.         return age;  
  63.     }  
  64.   
  65.     public void setAge(Integer age) {  
  66.         this.age = age;  
  67.     }  
  68.   
  69.     @Override  
  70.     public String toString() {  
  71.         return "User [id=" + id + ", userId=" + userId + ", name=" + name + ", age=" + age + "]";  
  72.     }  
  73. }  
/**    * @filename User.java     * @version www.mindai.com  * @date 2016年10月26日     */
package com.mjkf.demo.domain.model;import javax.persistence.Id;
import javax.persistence.Table;import com.mjkf.framework.core.base.model.BaseModel;/**      * @author farrell    * @date 2016年10月26日   */@Table(name="t_user")
public class User extends BaseModel {/**    * serialVersionUID      * @since Ver 1.1    */    private static final long serialVersionUID = -4044598743926228429L;@Idprivate Integer id;private Integer userId;private String name;private Integer age;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public Integer getUserId() {return userId;}public void setUserId(Integer userId) {this.userId = userId;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}@Overridepublic String toString() {return "User [id=" + id + ", userId=" + userId + ", name=" + name + ", age=" + age + "]";}
}

UserMapper.java

[java] view plain copy print?

  1. /**     
  2.  * @filename UserMapper.java      
  3.  * @version www.mindai.com   
  4.  * @date 2016年10月26日      
  5.  */  
  6. package com.mjkf.demo.mapper;  
  7.   
  8. import com.mjkf.demo.domain.model.User;  
  9. import com.mjkf.framework.core.base.mapper.IBaseMapper;  
  10.   
  11. /**       
  12.  * @author farrell     
  13.  * @date 2016年10月26日    
  14.  */  
  15. public interface UserMapper extends IBaseMapper<User>{  
  16.   
  17. }  
/**    * @filename UserMapper.java     * @version www.mindai.com  * @date 2016年10月26日     */
package com.mjkf.demo.mapper;import com.mjkf.demo.domain.model.User;
import com.mjkf.framework.core.base.mapper.IBaseMapper;/**      * @author farrell    * @date 2016年10月26日   */
public interface UserMapper extends IBaseMapper<User>{}

IUserService.java

[java] view plain copy print?

  1. /**     
  2.  * @filename IUserService.java      
  3.  * @version www.mindai.com   
  4.  * @date 2016年10月26日      
  5.  */  
  6. package com.mjkf.demo.service;  
  7.   
  8. import com.mjkf.demo.domain.model.User;  
  9. import com.mjkf.framework.core.base.service.IService;  
  10. import com.mjkf.framework.mybatis.mapper.entity.Example;  
  11.   
  12. /**       
  13.  * @author farrell     
  14.  * @date 2016年10月26日    
  15.  */  
  16. public interface IUserService extends IService<User>{  
  17.   
  18.     void updateByExample(User user,Example example);  
  19. }  
/**    * @filename IUserService.java     * @version www.mindai.com  * @date 2016年10月26日     */
package com.mjkf.demo.service;import com.mjkf.demo.domain.model.User;
import com.mjkf.framework.core.base.service.IService;
import com.mjkf.framework.mybatis.mapper.entity.Example;/**      * @author farrell    * @date 2016年10月26日   */
public interface IUserService extends IService<User>{void updateByExample(User user,Example example);
}

UserServiceImpl.java

[java] view plain copy print?

  1. package com.mjkf.demo.service.impl;  
  2.   
  3. import org.springframework.beans.factory.annotation.Autowired;  
  4. import org.springframework.stereotype.Service;  
  5.   
  6. import com.mjkf.demo.domain.model.User;  
  7. import com.mjkf.demo.mapper.UserMapper;  
  8. import com.mjkf.demo.service.IUserService;  
  9. import com.mjkf.framework.core.base.service.BaseService;  
  10. import com.mjkf.framework.mybatis.mapper.entity.Example;  
  11.   
  12. @Service  
  13. public class UserServiceImpl extends BaseService<User> implements IUserService{  
  14.       
  15.     @Autowired  
  16.     UserMapper userMapper;  
  17.   
  18.     @Override  
  19.     public void updateByExample(User record,Example example) {  
  20.         userMapper.updateByExampleSelective(record, example);  
  21.     }  
  22.   
  23. }  
package com.mjkf.demo.service.impl;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import com.mjkf.demo.domain.model.User;
import com.mjkf.demo.mapper.UserMapper;
import com.mjkf.demo.service.IUserService;
import com.mjkf.framework.core.base.service.BaseService;
import com.mjkf.framework.mybatis.mapper.entity.Example;@Service
public class UserServiceImpl extends BaseService<User> implements IUserService{@AutowiredUserMapper userMapper;@Overridepublic void updateByExample(User record,Example example) {userMapper.updateByExampleSelective(record, example);}}

MySingleKeyTableShardingAlgorithm.java

[java] view plain copy print?

  1. /**     
  2.  * @filename SingleKeyTableShardingAlgorithm.java      
  3.  * @version www.mindai.com   
  4.  * @date 2016年10月25日      
  5.  */  
  6. package com.mjkf.demo.sharding;  
  7.   
  8. import java.util.Collection;  
  9. import java.util.LinkedHashSet;  
  10.   
  11. import com.dangdang.ddframe.rdb.sharding.api.ShardingValue;  
  12. import com.dangdang.ddframe.rdb.sharding.api.strategy.table.SingleKeyTableShardingAlgorithm;  
  13. import com.google.common.collect.Range;  
  14. /**       
  15.  * @author farrell     
  16.  * @date 2016年10月25日    
  17.  */  
  18. public class MySingleKeyTableShardingAlgorithm implements SingleKeyTableShardingAlgorithm<Integer>{  
  19.   
  20.     /** 
  21.      * sql 中 = 操作时,table的映射  
  22.      */  
  23.     @Override  
  24.     public String doEqualSharding(final Collection<String> tableNames, final ShardingValue<Integer> shardingValue) {  
  25.         for (String each : tableNames) {  
  26.             if (each.endsWith(shardingValue.getValue() % 3 + "")) {  
  27.                 return each;  
  28.             }  
  29.         }  
  30.         throw new UnsupportedOperationException();  
  31.     }  
  32.       
  33.     /** 
  34.      * sql 中 in 操作时,table的映射  
  35.      */  
  36.     @Override  
  37.     public Collection<String> doInSharding(final Collection<String> tableNames, final ShardingValue<Integer> shardingValue) {  
  38.         Collection<String> result = new LinkedHashSet<>(tableNames.size());  
  39.         for (Integer value : shardingValue.getValues()) {  
  40.             for (String tableName : tableNames) {  
  41.                 if (tableName.endsWith(value % 3 + "")) {  
  42.                     result.add(tableName);  
  43.                 }  
  44.             }  
  45.         }  
  46.         return result;  
  47.     }  
  48.       
  49.     /** 
  50.      * sql 中 between 操作时,table的映射  
  51.      */  
  52.     @Override  
  53.     public Collection<String> doBetweenSharding(final Collection<String> tableNames, final ShardingValue<Integer> shardingValue) {  
  54.         Collection<String> result = new LinkedHashSet<>(tableNames.size());  
  55.         Range<Integer> range = shardingValue.getValueRange();  
  56.         for (Integer i = range.lowerEndpoint(); i <= range.upperEndpoint(); i++) {  
  57.             for (String each : tableNames) {  
  58.                 if (each.endsWith(i % 3 + "")) {  
  59.                     result.add(each);  
  60.                 }  
  61.             }  
  62.         }  
  63.         return result;  
  64.     }  
  65. }  
/**    * @filename SingleKeyTableShardingAlgorithm.java     * @version www.mindai.com  * @date 2016年10月25日     */
package com.mjkf.demo.sharding;import java.util.Collection;
import java.util.LinkedHashSet;import com.dangdang.ddframe.rdb.sharding.api.ShardingValue;
import com.dangdang.ddframe.rdb.sharding.api.strategy.table.SingleKeyTableShardingAlgorithm;
import com.google.common.collect.Range;
/**      * @author farrell    * @date 2016年10月25日   */
public class MySingleKeyTableShardingAlgorithm implements SingleKeyTableShardingAlgorithm<Integer>{/*** sql 中 = 操作时,table的映射 */@Overridepublic String doEqualSharding(final Collection<String> tableNames, final ShardingValue<Integer> shardingValue) {for (String each : tableNames) {if (each.endsWith(shardingValue.getValue() % 3 + "")) {return each;}}throw new UnsupportedOperationException();}/*** sql 中 in 操作时,table的映射 */@Overridepublic Collection<String> doInSharding(final Collection<String> tableNames, final ShardingValue<Integer> shardingValue) {Collection<String> result = new LinkedHashSet<>(tableNames.size());for (Integer value : shardingValue.getValues()) {for (String tableName : tableNames) {if (tableName.endsWith(value % 3 + "")) {result.add(tableName);}}}return result;}/*** sql 中 between 操作时,table的映射 */@Overridepublic Collection<String> doBetweenSharding(final Collection<String> tableNames, final ShardingValue<Integer> shardingValue) {Collection<String> result = new LinkedHashSet<>(tableNames.size());Range<Integer> range = shardingValue.getValueRange();for (Integer i = range.lowerEndpoint(); i <= range.upperEndpoint(); i++) {for (String each : tableNames) {if (each.endsWith(i % 3 + "")) {result.add(each);}}}return result;}
}

UserMapper.xml

[html] view plain copy print?

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "mybatis-3-mapper.dtd" >  
  3. <mapper namespace="com.mjkf.demo.mapper.UserMapper">  
  4. </mapper>  
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "mybatis-3-mapper.dtd" >
<mapper namespace="com.mjkf.demo.mapper.UserMapper">
</mapper>

applicationContext.xml

[html] view plain copy print?

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
  4.        xmlns:p="http://www.springframework.org/schema/p"  
  5.        xmlns:aop="http://www.springframework.org/schema/aop"   
  6.        xmlns:tx="http://www.springframework.org/schema/tx"  
  7.        xmlns:context="http://www.springframework.org/schema/context"  
  8.        xmlns:jee="http://www.springframework.org/schema/jee"   
  9.        xmlns:util="http://www.springframework.org/schema/util"  
  10.        xmlns:rdb="http://www.dangdang.com/schema/ddframe/rdb"  
  11.        xsi:schemaLocation="  
  12.        http://www.springframework.org/schema/context   
  13.        http://www.springframework.org/schema/context/spring-context-3.2.xsd   
  14.        http://www.springframework.org/schema/beans   
  15.        http://www.springframework.org/schema/beans/spring-beans-3.2.xsd   
  16.        http://www.springframework.org/schema/tx   
  17.        http://www.springframework.org/schema/tx/spring-tx-3.2.xsd   
  18.        http://www.springframework.org/schema/aop   
  19.        http://www.springframework.org/schema/aop/spring-aop-3.2.xsd   
  20.        http://www.springframework.org/schema/jee   
  21.        http://www.springframework.org/schema/jee/spring-jee-3.2.xsd   
  22.        http://www.springframework.org/schema/util   
  23.        http://www.springframework.org/schema/util/spring-util-3.2.xsd  
  24.        http://www.dangdang.com/schema/ddframe/rdb   
  25.        http://www.dangdang.com/schema/ddframe/rdb/rdb.xsd ">  
  26.   
  27.     <description>Spring公共配置</description>  
  28.   
  29.     <!--开启注解 -->  
  30.     <context:annotation-config/>  
  31.       
  32.     <context:component-scan base-package="com.mjkf">  
  33.         <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />  
  34.     </context:component-scan>  
  35.   
  36.     <!-- 定义受环境影响易变的变量 -->  
  37.     <bean id="propertyConfigurer" class="com.mjkf.framework.utils.properties.WebPropertyPlaceholderConfigurer">  
  38.         <property name="locations">  
  39.             <list>  
  40.                 <value>classpath:jdbc.properties</value>  
  41.             </list>  
  42.         </property>  
  43.     </bean>  
  44.       
  45.     <!-- 阿里 druid数据库连接池 -->  
  46.     <!-- 写数据源-->  
  47.     <bean id="dataSource_master" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">  
  48.         <property name="url" value="${jdbc0.url}" />  
  49.         <property name="username" value="${jdbc0.username}" />  
  50.         <property name="password" value="${jdbc0.password}" />  
  51. <!--         <property name="driverClass" value="${jdbc_driver0}" /> -->  
  52.         <!-- 初始化连接大小 -->  
  53.         <property name="initialSize" value="0" />  
  54.         <!-- 连接池最大使用连接数量 -->  
  55.         <property name="maxActive" value="20" />  
  56.         <!-- 连接池最小空闲 -->  
  57.         <property name="minIdle" value="0" />  
  58.         <!-- 获取连接最大等待时间 -->  
  59.         <property name="maxWait" value="60000" />  
  60.         <property name="validationQuery" value="${validationQuery}" />  
  61.         <property name="testOnBorrow" value="false" />  
  62.         <property name="testOnReturn" value="false" />  
  63.         <property name="testWhileIdle" value="true" />  
  64.         <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->  
  65.         <property name="timeBetweenEvictionRunsMillis" value="60000" />  
  66.         <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->  
  67.         <property name="minEvictableIdleTimeMillis" value="25200000" />  
  68.         <!-- 打开removeAbandoned功能 -->  
  69.         <property name="removeAbandoned" value="true" />  
  70.         <!-- 1800秒,也就是30分钟 -->  
  71.         <property name="removeAbandonedTimeout" value="1800" />  
  72.         <!-- 关闭abanded连接时输出错误日志 -->  
  73.         <property name="logAbandoned" value="true" />  
  74.         <property name="filters" value="stat" />  
  75.     </bean>  
  76.     <!-- 读数据源一,可多个-->  
  77.     <bean id="dataSource_slave" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">  
  78.         <property name="url" value="${jdbc1.url}" />  
  79.         <property name="username" value="${jdbc1.username}" />  
  80.         <property name="password" value="${jdbc1.password}" />  
  81. <!--         <property name="driverClass" value="${jdbc_driver1}" /> -->  
  82.         <!-- 初始化连接大小 -->  
  83.         <property name="initialSize" value="0" />  
  84.         <!-- 连接池最大使用连接数量 -->  
  85.         <property name="maxActive" value="20" />  
  86.         <!-- 连接池最小空闲 -->  
  87.         <property name="minIdle" value="0" />  
  88.         <!-- 获取连接最大等待时间 -->  
  89.         <property name="maxWait" value="60000" />  
  90.         <property name="validationQuery" value="${validationQuery}" />  
  91.         <property name="testOnBorrow" value="false" />  
  92.         <property name="testOnReturn" value="false" />  
  93.         <property name="testWhileIdle" value="true" />  
  94.         <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->  
  95.         <property name="timeBetweenEvictionRunsMillis" value="60000" />  
  96.         <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->  
  97.         <property name="minEvictableIdleTimeMillis" value="25200000" />  
  98.         <!-- 打开removeAbandoned功能 -->  
  99.         <property name="removeAbandoned" value="true" />  
  100.         <!-- 1800秒,也就是30分钟 -->  
  101.         <property name="removeAbandonedTimeout" value="1800" />  
  102.         <!-- 关闭abanded连接时输出错误日志 -->  
  103.         <property name="logAbandoned" value="true" />  
  104.         <property name="filters" value="stat" />  
  105.     </bean>  
  106.       
  107.     <!-- 配置主从 -->  
  108.     <rdb:master-slave-data-source id="datasource_01" master-data-source-ref="dataSource_master" slave-data-sources-ref="dataSource_slave" />  
  109.       
  110.     <rdb:strategy id="userTableStrategy" sharding-columns="USER_ID" algorithm-class="com.mjkf.demo.sharding.MySingleKeyTableShardingAlgorithm"/>  
  111.       
  112.     <rdb:data-source id="shardingDataSource">  
  113.         <rdb:sharding-rule data-sources="datasource_01">  
  114.             <rdb:table-rules>  
  115.                 <rdb:table-rule logic-table="t_user" actual-tables="t_user_0,t_user_1,t_user_2" table-strategy="userTableStrategy"/>  
  116.             </rdb:table-rules>  
  117.         </rdb:sharding-rule>  
  118.     </rdb:data-source>  
  119.   
  120.     <!-- mybatis文件 -->  
  121.     <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">  
  122.         <property name="dataSource" ref="shardingDataSource" />  
  123.         <!-- 自动扫描entity目录, 省掉Configuration.xml里的手工配置 -->  
  124.         <property name="mapperLocations">  
  125.             <array>  
  126.                 <value>classpath:mapper/*Mapper.xml</value>  
  127.             </array>  
  128.         </property>  
  129.         <property name="typeAliasesPackage" value="com.mjkf.demo.domain.model" />  
  130.         <property name="configLocation" value="classpath:mybatis-config.xml"/>  
  131.     </bean>  
  132.       
  133.     <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate" scope="prototype">  
  134.         <constructor-arg index="0" ref="sqlSessionFactory"/>  
  135.         <constructor-arg index="1" value="BATCH" />  
  136.     </bean>  
  137.       
  138.     <bean class="com.mjkf.framework.mybatis.spring.mapper.MapperScannerConfigurer">  
  139.         <property name="basePackage" value="com.mjkf.demo.mapper" />  
  140.         <property name="markerInterface" value="com.mjkf.framework.core.base.mapper.IBaseMapper"/>  
  141.     </bean>  
  142.       
  143.     <!-- 开启注解事务 只对当前配置文件有效 -->  
  144.     <tx:annotation-driven transaction-manager="transactionManager" />  
  145.   
  146.     <bean id="transactionManager"  
  147.         class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  
  148.         <property name="dataSource" ref="shardingDataSource" />  
  149.     </bean>  
  150.   
  151.     <!-- 拦截器方式配置事物 -->  
  152.     <tx:advice id="transactionAdvice" transaction-manager="transactionManager">  
  153.         <tx:attributes>  
  154.             <tx:method name="do*" propagation="REQUIRED" />  
  155.             <tx:method name="save*" propagation="REQUIRED" />  
  156.             <tx:method name="update*" propagation="REQUIRED" />  
  157.             <tx:method name="delete*" propagation="REQUIRED" />  
  158.             <tx:method name="process*" propagation="REQUIRED" />  
  159.             <tx:method name="inser*" propagation="REQUIRED" />  
  160.             <tx:method name="send*" propagation="REQUIRED" />  
  161.               
  162.             <tx:method name="put*" read-only="true"/>  
  163.             <tx:method name="query*" read-only="true"/>  
  164.             <tx:method name="page*" read-only="true"/>  
  165.             <tx:method name="get*" read-only="true" />  
  166.             <tx:method name="count*" read-only="true" />  
  167.             <tx:method name="find*" read-only="true" />  
  168.             <tx:method name="list*" read-only="true" />  
  169.               
  170.             <tx:method name="*" propagation="REQUIRED"/>  
  171.         </tx:attributes>  
  172.     </tx:advice>  
  173.   
  174.     <aop:aspectj-autoproxy proxy-target-class="true" />  
  175.       
  176.     <aop:config expose-proxy="true">  
  177.         <!-- 只对业务逻辑层实施事务 -->  
  178.         <aop:pointcut id="transactionPointCut" expression="execution(* com.mjkf.*.*.impl.*Impl.*(..))" />  
  179.         <aop:advisor pointcut-ref="transactionPointCut" advice-ref="transactionAdvice" />  
  180.     </aop:config>  
  181. </beans>  
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"xmlns:context="http://www.springframework.org/schema/context"xmlns:jee="http://www.springframework.org/schema/jee" xmlns:util="http://www.springframework.org/schema/util"xmlns:rdb="http://www.dangdang.com/schema/ddframe/rdb"xsi:schemaLocation="http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.2.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.2.xsdhttp://www.dangdang.com/schema/ddframe/rdb http://www.dangdang.com/schema/ddframe/rdb/rdb.xsd "><description>Spring公共配置</description><!--开启注解 --><context:annotation-config/><context:component-scan base-package="com.mjkf"><context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" /></context:component-scan><!-- 定义受环境影响易变的变量 --><bean id="propertyConfigurer" class="com.mjkf.framework.utils.properties.WebPropertyPlaceholderConfigurer"><property name="locations"><list><value>classpath:jdbc.properties</value></list></property></bean><!-- 阿里 druid数据库连接池 --><!-- 写数据源--><bean id="dataSource_master" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close"><property name="url" value="${jdbc0.url}" /><property name="username" value="${jdbc0.username}" /><property name="password" value="${jdbc0.password}" />
<!-- 		<property name="driverClass" value="${jdbc_driver0}" /> --><!-- 初始化连接大小 --><property name="initialSize" value="0" /><!-- 连接池最大使用连接数量 --><property name="maxActive" value="20" /><!-- 连接池最小空闲 --><property name="minIdle" value="0" /><!-- 获取连接最大等待时间 --><property name="maxWait" value="60000" /><property name="validationQuery" value="${validationQuery}" /><property name="testOnBorrow" value="false" /><property name="testOnReturn" value="false" /><property name="testWhileIdle" value="true" /><!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 --><property name="timeBetweenEvictionRunsMillis" value="60000" /><!-- 配置一个连接在池中最小生存的时间,单位是毫秒 --><property name="minEvictableIdleTimeMillis" value="25200000" /><!-- 打开removeAbandoned功能 --><property name="removeAbandoned" value="true" /><!-- 1800秒,也就是30分钟 --><property name="removeAbandonedTimeout" value="1800" /><!-- 关闭abanded连接时输出错误日志 --><property name="logAbandoned" value="true" /><property name="filters" value="stat" /></bean><!-- 读数据源一,可多个--><bean id="dataSource_slave" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close"><property name="url" value="${jdbc1.url}" /><property name="username" value="${jdbc1.username}" /><property name="password" value="${jdbc1.password}" />
<!-- 		<property name="driverClass" value="${jdbc_driver1}" /> --><!-- 初始化连接大小 --><property name="initialSize" value="0" /><!-- 连接池最大使用连接数量 --><property name="maxActive" value="20" /><!-- 连接池最小空闲 --><property name="minIdle" value="0" /><!-- 获取连接最大等待时间 --><property name="maxWait" value="60000" /><property name="validationQuery" value="${validationQuery}" /><property name="testOnBorrow" value="false" /><property name="testOnReturn" value="false" /><property name="testWhileIdle" value="true" /><!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 --><property name="timeBetweenEvictionRunsMillis" value="60000" /><!-- 配置一个连接在池中最小生存的时间,单位是毫秒 --><property name="minEvictableIdleTimeMillis" value="25200000" /><!-- 打开removeAbandoned功能 --><property name="removeAbandoned" value="true" /><!-- 1800秒,也就是30分钟 --><property name="removeAbandonedTimeout" value="1800" /><!-- 关闭abanded连接时输出错误日志 --><property name="logAbandoned" value="true" /><property name="filters" value="stat" /></bean><!-- 配置主从 --><rdb:master-slave-data-source id="datasource_01" master-data-source-ref="dataSource_master" slave-data-sources-ref="dataSource_slave" /><rdb:strategy id="userTableStrategy" sharding-columns="USER_ID" algorithm-class="com.mjkf.demo.sharding.MySingleKeyTableShardingAlgorithm"/><rdb:data-source id="shardingDataSource"><rdb:sharding-rule data-sources="datasource_01"><rdb:table-rules><rdb:table-rule logic-table="t_user" actual-tables="t_user_0,t_user_1,t_user_2" table-strategy="userTableStrategy"/></rdb:table-rules></rdb:sharding-rule></rdb:data-source><!-- mybatis文件 --><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="shardingDataSource" /><!-- 自动扫描entity目录, 省掉Configuration.xml里的手工配置 --><property name="mapperLocations"><array><value>classpath:mapper/*Mapper.xml</value></array></property><property name="typeAliasesPackage" value="com.mjkf.demo.domain.model" /><property name="configLocation" value="classpath:mybatis-config.xml"/></bean><bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate" scope="prototype"><constructor-arg index="0" ref="sqlSessionFactory"/><constructor-arg index="1" value="BATCH" /></bean><bean class="com.mjkf.framework.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="com.mjkf.demo.mapper" /><property name="markerInterface" value="com.mjkf.framework.core.base.mapper.IBaseMapper"/></bean><!-- 开启注解事务 只对当前配置文件有效 --><tx:annotation-driven transaction-manager="transactionManager" /><bean id="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="shardingDataSource" /></bean><!-- 拦截器方式配置事物 --><tx:advice id="transactionAdvice" transaction-manager="transactionManager"><tx:attributes><tx:method name="do*" propagation="REQUIRED" /><tx:method name="save*" propagation="REQUIRED" /><tx:method name="update*" propagation="REQUIRED" /><tx:method name="delete*" propagation="REQUIRED" /><tx:method name="process*" propagation="REQUIRED" /><tx:method name="inser*" propagation="REQUIRED" /><tx:method name="send*" propagation="REQUIRED" /><tx:method name="put*" read-only="true"/><tx:method name="query*" read-only="true"/><tx:method name="page*" read-only="true"/><tx:method name="get*" read-only="true" /><tx:method name="count*" read-only="true" /><tx:method name="find*" read-only="true" /><tx:method name="list*" read-only="true" /><tx:method name="*" propagation="REQUIRED"/></tx:attributes></tx:advice><aop:aspectj-autoproxy proxy-target-class="true" /><aop:config expose-proxy="true"><!-- 只对业务逻辑层实施事务 --><aop:pointcut id="transactionPointCut" expression="execution(* com.mjkf.*.*.impl.*Impl.*(..))" /><aop:advisor pointcut-ref="transactionPointCut" advice-ref="transactionAdvice" /></aop:config>
</beans>

MainTest.java

[java] view plain copy print?

  1. /**     
  2.  * @filename MainTest.java      
  3.  * @version www.mindai.com   
  4.  * @date 2016年10月25日      
  5.  */  
  6. package test.mjkf;  
  7.   
  8. import java.util.List;  
  9.   
  10. import org.junit.Test;  
  11. import org.junit.runner.RunWith;  
  12. import org.springframework.beans.factory.annotation.Autowired;  
  13. import org.springframework.test.context.ContextConfiguration;  
  14. import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;  
  15.   
  16. import com.mjkf.demo.domain.model.User;  
  17. import com.mjkf.demo.service.IUserService;  
  18. import com.mjkf.framework.mybatis.mapper.entity.Example;  
  19. import com.mjkf.framework.mybatis.mapper.entity.Example.Criteria;  
  20.   
  21. /**       
  22.  * @author farrell     
  23.  * @date 2016年10月25日    
  24.  */  
  25.   
  26. @RunWith(SpringJUnit4ClassRunner.class)  
  27. @ContextConfiguration(locations = { "classpath*:spring/applicationContext.xml" })  
  28. public class MainTest {  
  29.       
  30.     @Autowired  
  31.     IUserService userService;  
  32.   
  33.     @Test  
  34.     public void test(){  
  35.         System.out.println("sharding-demo start................");  
  36.         User entity = new User();  
  37.         entity.setUserId(1);  
  38.         List<User> list = userService.find(entity);  
  39.         System.out.println(list.size());  
  40.         for (User user : list) {  
  41.             System.out.println(user.getUserId()+"------->"+user.getName());  
  42.         }  
  43.         System.out.println("======================分割线===========================");  
  44.         List<User> users = userService.findAll();  
  45.         for (User user : users) {  
  46.             System.out.println(user.getUserId()+"------->"+user.getName());  
  47.         }  
  48.           
  49.         System.out.println("执行插入语句");  
  50.         User user = new User();  
  51.         user.setUserId(1002);  
  52.         user.setName("李四");  
  53.         user.setAge(18);  
  54.         userService.save(user);  
  55.         System.out.println("======================分割线===========================");  
  56.           
  57.         System.out.println("执行更新语句");  
  58.         User user1 = new User();  
  59.         user1.setId(24);  
  60.         user1.setUserId(1001);  
  61.         user1.setName("李四update");  
  62.         user1.setAge(18);  
  63.         userService.update(user1);  
  64.         System.out.println("======================分割线===========================");  
  65.           
  66. //      System.out.println("执行删除语句");  
  67. //      User user2 = new User();  
  68. //      user2.setUserId(1001);  
  69. //      userService.delete(user2);  
  70. //      System.out.println("======================分割线===========================");  
  71.           
  72.         Example example = new Example(User.class);  
  73.         Criteria criteria = example.createCriteria();  
  74.         criteria.andEqualTo("userId", 1001);  
  75.         User user2 = new User();  
  76.         user2.setName("李四update2");  
  77.         user2.setUserId(1001);  
  78.         user2.setAge(19);  
  79.         userService.updateByExample(user2,example);  
  80.            
  81.     }  
  82. }  
/**    * @filename MainTest.java     * @version www.mindai.com  * @date 2016年10月25日     */
package test.mjkf;import java.util.List;import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import com.mjkf.demo.domain.model.User;
import com.mjkf.demo.service.IUserService;
import com.mjkf.framework.mybatis.mapper.entity.Example;
import com.mjkf.framework.mybatis.mapper.entity.Example.Criteria;/**      * @author farrell    * @date 2016年10月25日   */@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath*:spring/applicationContext.xml" })
public class MainTest {@AutowiredIUserService userService;@Testpublic void test(){System.out.println("sharding-demo start................");User entity = new User();entity.setUserId(1);List<User> list = userService.find(entity);System.out.println(list.size());for (User user : list) {System.out.println(user.getUserId()+"------->"+user.getName());}System.out.println("======================分割线===========================");List<User> users = userService.findAll();for (User user : users) {System.out.println(user.getUserId()+"------->"+user.getName());}System.out.println("执行插入语句");User user = new User();user.setUserId(1002);user.setName("李四");user.setAge(18);userService.save(user);System.out.println("======================分割线===========================");System.out.println("执行更新语句");User user1 = new User();user1.setId(24);user1.setUserId(1001);user1.setName("李四update");user1.setAge(18);userService.update(user1);System.out.println("======================分割线===========================");//		System.out.println("执行删除语句");
//		User user2 = new User();
//		user2.setUserId(1001);
//		userService.delete(user2);
//		System.out.println("======================分割线===========================");Example example = new Example(User.class);Criteria criteria = example.createCriteria();criteria.andEqualTo("userId", 1001);User user2 = new User();user2.setName("李四update2");user2.setUserId(1001);user2.setAge(19);userService.updateByExample(user2,example);}
}

 

输出日志如下:

[html] view plain copy print?

  1. 2016-10-28 17:20:15 [DEBUG]-[org.mybatis.spring.SqlSessionUtils] Creating a new SqlSession  
  2. 2016-10-28 17:20:15 [DEBUG]-[org.mybatis.spring.SqlSessionUtils] SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@1c05239a] was not registered for synchronization because synchronization is not active  
  3. 2016-10-28 17:20:15 [DEBUG]-[org.springframework.jdbc.datasource.DataSourceUtils] Fetching JDBC Connection from DataSource  
  4. 2016-10-28 17:20:15 [DEBUG]-[org.mybatis.spring.transaction.SpringManagedTransaction] JDBC Connection [com.dangdang.ddframe.rdb.sharding.jdbc.ShardingConnection@58e6b9bc] will not be managed by Spring  
  5. 2016-10-28 17:20:15 [DEBUG]-[com.mjkf.demo.mapper.UserMapper.select] ==>  Preparing: SELECT ID,USER_ID,NAME,AGE FROM t_user WHERE USER_ID = ?   
  6. 2016-10-28 17:20:15 [DEBUG]-[com.mjkf.demo.mapper.UserMapper.select] ==> Parameters: 1(Integer)  
  7. 2016-10-28 17:20:15 [DEBUG]-[com.dangdang.ddframe.rdb.sharding.parser.SQLParserFactory] Logic SQL: SELECT ID,USER_ID,NAME,AGE  FROM t_user  WHERE  USER_ID = ?  
  8. 2016-10-28 17:20:15 [DEBUG]-[com.dangdang.ddframe.rdb.sharding.parser.SQLParseEngine] Parsed SQL result: SQLParsedResult(routeContext=RouteContext(tables=[Table(name=t_user, alias=Optional.absent())], sqlStatementType=null, sqlBuilder=null), conditionContexts=[ConditionContext(conditions={Condition.Column(columnName=USER_ID, tableName=t_user)=Condition(column=Condition.Column(columnName=USER_ID, tableName=t_user), operator==, values=[1], valueIndices=[0])})], mergeContext=MergeContext(orderByColumns=[], groupByColumns=[], aggregationColumns=[], limit=null))  
  9. 2016-10-28 17:20:15 [DEBUG]-[com.dangdang.ddframe.rdb.sharding.parser.SQLParseEngine] Parsed SQL: SELECT ID, USER_ID, NAME, AGE FROM [Token(t_user)] WHERE USER_ID = ?  
  10. 2016-10-28 17:20:15 [DEBUG]-[com.dangdang.ddframe.rdb.sharding.router.SQLRouteEngine] final route result:[SQLExecutionUnit(dataSource=datasource_01, sql=SELECT ID, USER_ID, NAME, AGE FROM t_user_1 WHERE USER_ID = ?, sqlBuilder=SELECT ID, USER_ID, NAME, AGE FROM [Token(t_user_1)] WHERE USER_ID = ?)]  
  11. 2016-10-28 17:20:15 [DEBUG]-[com.dangdang.ddframe.rdb.sharding.router.SQLRouteEngine] merge context:MergeContext(orderByColumns=[], groupByColumns=[], aggregationColumns=[], limit=null)  
  12. 2016-10-28 17:20:15 [DEBUG]-[com.mjkf.demo.mapper.UserMapper.select] <==      Total: 0  
  13. 2016-10-28 17:20:15 [DEBUG]-[org.mybatis.spring.SqlSessionUtils] Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@1c05239a]  
  14. 2016-10-28 17:20:15 [DEBUG]-[org.springframework.jdbc.datasource.DataSourceUtils] Returning JDBC Connection to DataSource  
  15. 0  
  16. ======================分割线===========================  
  17. 2016-10-28 17:20:15 [DEBUG]-[org.mybatis.spring.SqlSessionUtils] Creating a new SqlSession  
  18. 2016-10-28 17:20:15 [DEBUG]-[org.mybatis.spring.SqlSessionUtils] SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@438c1676] was not registered for synchronization because synchronization is not active  
  19. 2016-10-28 17:20:15 [DEBUG]-[org.springframework.jdbc.datasource.DataSourceUtils] Fetching JDBC Connection from DataSource  
  20. 2016-10-28 17:20:15 [DEBUG]-[org.mybatis.spring.transaction.SpringManagedTransaction] JDBC Connection [com.dangdang.ddframe.rdb.sharding.jdbc.ShardingConnection@2216bf9f] will not be managed by Spring  
  21. 2016-10-28 17:20:15 [DEBUG]-[com.mjkf.demo.mapper.UserMapper.selectAll] ==>  Preparing: SELECT ID,USER_ID,NAME,AGE FROM t_user   
  22. 2016-10-28 17:20:15 [DEBUG]-[com.mjkf.demo.mapper.UserMapper.selectAll] ==> Parameters:   
  23. 2016-10-28 17:20:15 [DEBUG]-[com.dangdang.ddframe.rdb.sharding.parser.SQLParserFactory] Logic SQL: SELECT ID,USER_ID,NAME,AGE  FROM t_user  
  24. 2016-10-28 17:20:15 [DEBUG]-[com.dangdang.ddframe.rdb.sharding.parser.SQLParseEngine] Parsed SQL result: SQLParsedResult(routeContext=RouteContext(tables=[Table(name=t_user, alias=Optional.absent())], sqlStatementType=null, sqlBuilder=null), conditionContexts=[ConditionContext(conditions={})], mergeContext=MergeContext(orderByColumns=[], groupByColumns=[], aggregationColumns=[], limit=null))  
  25. 2016-10-28 17:20:15 [DEBUG]-[com.dangdang.ddframe.rdb.sharding.parser.SQLParseEngine] Parsed SQL: SELECT ID, USER_ID, NAME, AGE FROM [Token(t_user)]  
  26. 2016-10-28 17:20:15 [DEBUG]-[com.dangdang.ddframe.rdb.sharding.router.SQLRouteEngine] final route result:[SQLExecutionUnit(dataSource=datasource_01, sql=SELECT ID, USER_ID, NAME, AGE FROM t_user_0, sqlBuilder=SELECT ID, USER_ID, NAME, AGE FROM [Token(t_user_0)]), SQLExecutionUnit(dataSource=datasource_01, sql=SELECT ID, USER_ID, NAME, AGE FROM t_user_2, sqlBuilder=SELECT ID, USER_ID, NAME, AGE FROM [Token(t_user_2)]), SQLExecutionUnit(dataSource=datasource_01, sql=SELECT ID, USER_ID, NAME, AGE FROM t_user_1, sqlBuilder=SELECT ID, USER_ID, NAME, AGE FROM [Token(t_user_1)])]  
  27. 2016-10-28 17:20:15 [DEBUG]-[com.dangdang.ddframe.rdb.sharding.router.SQLRouteEngine] merge context:MergeContext(orderByColumns=[], groupByColumns=[], aggregationColumns=[], limit=null)  
  28. 2016-10-28 17:20:15 [DEBUG]-[com.dangdang.ddframe.rdb.sharding.merger.ShardingResultSets$WrapperResultSet] 747195039 join pipeline  
  29. 2016-10-28 17:20:15 [DEBUG]-[com.dangdang.ddframe.rdb.sharding.merger.ShardingResultSets$WrapperResultSet] 1770136464 join pipeline  
  30. 2016-10-28 17:20:15 [DEBUG]-[com.dangdang.ddframe.rdb.sharding.merger.ResultSetFactory] Sharding-JDBC: Sharding result sets type is 'MULTIPLE'  
  31. 2016-10-28 17:20:15 [DEBUG]-[com.dangdang.ddframe.rdb.sharding.merger.pipeline.reducer.IteratorReducerResultSet] 1721468812 join pipeline  
  32. 2016-10-28 17:20:15 [DEBUG]-[com.mjkf.demo.mapper.UserMapper.selectAll] <==      Total: 10  
  33. 2016-10-28 17:20:15 [DEBUG]-[org.mybatis.spring.SqlSessionUtils] Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@438c1676]  
  34. 2016-10-28 17:20:15 [DEBUG]-[org.springframework.jdbc.datasource.DataSourceUtils] Returning JDBC Connection to DataSource  
  35. 1002------->李四  
  36. 1002------->李四  
  37. 1002------->李四  
  38. 1002------->李四  
  39. 1001------->李四update2  
  40. 1001------->李四update2  
  41. 1001------->李四update2  
  42. 1001------->李四update2  
  43. 1001------->李四update2  
  44. 1001------->李四update2  
  45. 执行插入语句  
  46. 2016-10-28 17:20:15 [DEBUG]-[org.mybatis.spring.SqlSessionUtils] Creating a new SqlSession  
  47. 2016-10-28 17:20:15 [DEBUG]-[org.mybatis.spring.SqlSessionUtils] SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@1e7ae447] was not registered for synchronization because synchronization is not active  
  48. 2016-10-28 17:20:15 [DEBUG]-[org.springframework.jdbc.datasource.DataSourceUtils] Fetching JDBC Connection from DataSource  
  49. 2016-10-28 17:20:15 [DEBUG]-[org.mybatis.spring.transaction.SpringManagedTransaction] JDBC Connection [com.dangdang.ddframe.rdb.sharding.jdbc.ShardingConnection@716acd11] will not be managed by Spring  
  50. 2016-10-28 17:20:15 [DEBUG]-[com.mjkf.demo.mapper.UserMapper.insert] ==>  Preparing: INSERT INTO t_user ( ID,USER_ID,NAME,AGE ) VALUES( ?,?,?,? )   
  51. 2016-10-28 17:20:15 [DEBUG]-[com.mjkf.demo.mapper.UserMapper.insert] ==> Parameters: null, 1002(Integer), 李四(String), 18(Integer)  
  52. 2016-10-28 17:20:15 [DEBUG]-[com.dangdang.ddframe.rdb.sharding.parser.SQLParserFactory] Logic SQL: INSERT INTO t_user  ( ID,USER_ID,NAME,AGE ) VALUES( ?,?,?,? )  
  53. 2016-10-28 17:20:15 [DEBUG]-[com.dangdang.ddframe.rdb.sharding.parser.SQLParseEngine] Parsed SQL result: SQLParsedResult(routeContext=RouteContext(tables=[Table(name=t_user, alias=Optional.absent())], sqlStatementType=null, sqlBuilder=null), conditionContexts=[ConditionContext(conditions={Condition.Column(columnName=USER_ID, tableName=t_user)=Condition(column=Condition.Column(columnName=USER_ID, tableName=t_user), operator==, values=[1002], valueIndices=[1])})], mergeContext=MergeContext(orderByColumns=[], groupByColumns=[], aggregationColumns=[], limit=null))  
  54. 2016-10-28 17:20:15 [DEBUG]-[com.dangdang.ddframe.rdb.sharding.parser.SQLParseEngine] Parsed SQL: INSERT INTO [Token(t_user)] (ID, USER_ID, NAME, AGE) VALUES (?, ?, ?, ?)  
  55. 2016-10-28 17:20:15 [DEBUG]-[com.dangdang.ddframe.rdb.sharding.router.SQLRouteEngine] final route result:[SQLExecutionUnit(dataSource=datasource_01, sql=INSERT INTO t_user_0 (ID, USER_ID, NAME, AGE) VALUES (?, ?, ?, ?), sqlBuilder=INSERT INTO [Token(t_user_0)] (ID, USER_ID, NAME, AGE) VALUES (?, ?, ?, ?))]  
  56. 2016-10-28 17:20:15 [DEBUG]-[com.dangdang.ddframe.rdb.sharding.router.SQLRouteEngine] merge context:MergeContext(orderByColumns=[], groupByColumns=[], aggregationColumns=[], limit=null)  
  57. 2016-10-28 17:20:15 [DEBUG]-[org.mybatis.spring.SqlSessionUtils] Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@1e7ae447]  
  58. 2016-10-28 17:20:15 [DEBUG]-[org.springframework.jdbc.datasource.DataSourceUtils] Returning JDBC Connection to DataSource  
  59. ======================分割线===========================  
  60. 执行更新语句  
  61. 2016-10-28 17:20:15 [DEBUG]-[org.mybatis.spring.SqlSessionUtils] Creating a new SqlSession  
  62. 2016-10-28 17:20:15 [DEBUG]-[org.mybatis.spring.SqlSessionUtils] SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@722ca338] was not registered for synchronization because synchronization is not active  
  63. 2016-10-28 17:20:15 [DEBUG]-[org.springframework.jdbc.datasource.DataSourceUtils] Fetching JDBC Connection from DataSource  
  64. 2016-10-28 17:20:15 [DEBUG]-[org.mybatis.spring.transaction.SpringManagedTransaction] JDBC Connection [com.dangdang.ddframe.rdb.sharding.jdbc.ShardingConnection@508fec17] will not be managed by Spring  
  65. 2016-10-28 17:20:15 [DEBUG]-[com.mjkf.demo.mapper.UserMapper.updateByPrimaryKeySelective] ==>  Preparing: UPDATE t_user SET USER_ID = ?,NAME = ?,AGE = ? WHERE ID = ?   
  66. 2016-10-28 17:20:15 [DEBUG]-[com.mjkf.demo.mapper.UserMapper.updateByPrimaryKeySelective] ==> Parameters: 1001(Integer), 李四update(String), 18(Integer), 24(Integer)  
  67. 2016-10-28 17:20:15 [DEBUG]-[com.dangdang.ddframe.rdb.sharding.parser.SQLParserFactory] Logic SQL: UPDATE t_user  SET USER_ID = ?,NAME = ?,AGE = ? WHERE  ID = ?  
  68. 2016-10-28 17:20:15 [DEBUG]-[com.dangdang.ddframe.rdb.sharding.parser.SQLParseEngine] Parsed SQL result: SQLParsedResult(routeContext=RouteContext(tables=[Table(name=t_user, alias=Optional.absent())], sqlStatementType=null, sqlBuilder=null), conditionContexts=[ConditionContext(conditions={})], mergeContext=MergeContext(orderByColumns=[], groupByColumns=[], aggregationColumns=[], limit=null))  
  69. 2016-10-28 17:20:15 [DEBUG]-[com.dangdang.ddframe.rdb.sharding.parser.SQLParseEngine] Parsed SQL: UPDATE [Token(t_user)] SET USER_ID = ?, NAME = ?, AGE = ? WHERE ID = ?  
  70. 2016-10-28 17:20:15 [DEBUG]-[com.dangdang.ddframe.rdb.sharding.router.SQLRouteEngine] final route result:[SQLExecutionUnit(dataSource=datasource_01, sql=UPDATE t_user_0 SET USER_ID = ?, NAME = ?, AGE = ? WHERE ID = ?, sqlBuilder=UPDATE [Token(t_user_0)] SET USER_ID = ?, NAME = ?, AGE = ? WHERE ID = ?), SQLExecutionUnit(dataSource=datasource_01, sql=UPDATE t_user_1 SET USER_ID = ?, NAME = ?, AGE = ? WHERE ID = ?, sqlBuilder=UPDATE [Token(t_user_1)] SET USER_ID = ?, NAME = ?, AGE = ? WHERE ID = ?), SQLExecutionUnit(dataSource=datasource_01, sql=UPDATE t_user_2 SET USER_ID = ?, NAME = ?, AGE = ? WHERE ID = ?, sqlBuilder=UPDATE [Token(t_user_2)] SET USER_ID = ?, NAME = ?, AGE = ? WHERE ID = ?)]  
  71. 2016-10-28 17:20:15 [DEBUG]-[com.dangdang.ddframe.rdb.sharding.router.SQLRouteEngine] merge context:MergeContext(orderByColumns=[], groupByColumns=[], aggregationColumns=[], limit=null)  
  72. 2016-10-28 17:20:15 [DEBUG]-[org.mybatis.spring.SqlSessionUtils] Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@722ca338]  
  73. 2016-10-28 17:20:15 [DEBUG]-[org.springframework.jdbc.datasource.DataSourceUtils] Returning JDBC Connection to DataSource  
  74. ======================分割线===========================  
  75. 2016-10-28 17:20:15 [DEBUG]-[org.springframework.jdbc.datasource.DataSourceTransactionManager] Creating new transaction with name [com.mjkf.demo.service.impl.UserServiceImpl.updateByExample]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT  
  76. 2016-10-28 17:20:15 [DEBUG]-[org.springframework.jdbc.datasource.DataSourceTransactionManager] Acquired Connection [com.dangdang.ddframe.rdb.sharding.jdbc.ShardingConnection@52ffd2a3] for JDBC transaction  
  77. 2016-10-28 17:20:15 [DEBUG]-[org.springframework.jdbc.datasource.DataSourceTransactionManager] Switching JDBC Connection [com.dangdang.ddframe.rdb.sharding.jdbc.ShardingConnection@52ffd2a3] to manual commit  
  78. 2016-10-28 17:20:15 [DEBUG]-[org.springframework.transaction.support.TransactionSynchronizationManager] Bound value [org.springframework.jdbc.datasource.ConnectionHolder@68c04a7c] for key [com.dangdang.ddframe.rdb.sharding.spring.datasource.SpringShardingDataSource@45ce43b9] to thread [main]  
  79. 2016-10-28 17:20:15 [DEBUG]-[org.springframework.transaction.support.TransactionSynchronizationManager] Initializing transaction synchronization  
  80. 2016-10-28 17:20:15 [DEBUG]-[org.springframework.transaction.interceptor.TransactionInterceptor] Getting transaction for [com.mjkf.demo.service.impl.UserServiceImpl.updateByExample]  
  81. 2016-10-28 17:20:15 [DEBUG]-[org.mybatis.spring.SqlSessionUtils] Creating a new SqlSession  
  82. 2016-10-28 17:20:15 [DEBUG]-[org.mybatis.spring.SqlSessionUtils] Registering transaction synchronization for SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@40595670]  
  83. 2016-10-28 17:20:15 [DEBUG]-[org.springframework.transaction.support.TransactionSynchronizationManager] Bound value [org.mybatis.spring.SqlSessionHolder@2e1de495] for key [org.apache.ibatis.session.defaults.DefaultSqlSessionFactory@5adc783a] to thread [main]  
  84. 2016-10-28 17:20:15 [DEBUG]-[org.springframework.transaction.support.TransactionSynchronizationManager] Retrieved value [org.springframework.jdbc.datasource.ConnectionHolder@68c04a7c] for key [com.dangdang.ddframe.rdb.sharding.spring.datasource.SpringShardingDataSource@45ce43b9] bound to thread [main]  
  85. 2016-10-28 17:20:15 [DEBUG]-[org.springframework.transaction.support.TransactionSynchronizationManager] Retrieved value [org.springframework.jdbc.datasource.ConnectionHolder@68c04a7c] for key [com.dangdang.ddframe.rdb.sharding.spring.datasource.SpringShardingDataSource@45ce43b9] bound to thread [main]  
  86. 2016-10-28 17:20:15 [DEBUG]-[org.mybatis.spring.transaction.SpringManagedTransaction] JDBC Connection [com.dangdang.ddframe.rdb.sharding.jdbc.ShardingConnection@52ffd2a3] will be managed by Spring  
  87. 2016-10-28 17:20:15 [DEBUG]-[com.mjkf.demo.mapper.UserMapper.updateByExampleSelective] ==>  Preparing: UPDATE t_user SET USER_ID = ?,NAME = ?,AGE = ? WHERE ( USER_iD = ? )   
  88. 2016-10-28 17:20:15 [DEBUG]-[com.mjkf.demo.mapper.UserMapper.updateByExampleSelective] ==> Parameters: 1001(Integer), 李四update2(String), 19(Integer), 1001(Integer)  
  89. 2016-10-28 17:20:15 [DEBUG]-[com.dangdang.ddframe.rdb.sharding.parser.SQLParserFactory] Logic SQL: UPDATE t_user  SET USER_ID = ?,NAME = ?,AGE = ? WHERE (  USER_iD = ? )  
  90. 2016-10-28 17:20:15 [DEBUG]-[com.dangdang.ddframe.rdb.sharding.parser.SQLParseEngine] Parsed SQL result: SQLParsedResult(routeContext=RouteContext(tables=[Table(name=t_user, alias=Optional.absent())], sqlStatementType=null, sqlBuilder=null), conditionContexts=[ConditionContext(conditions={})], mergeContext=MergeContext(orderByColumns=[], groupByColumns=[], aggregationColumns=[], limit=null))  
  91. 2016-10-28 17:20:15 [DEBUG]-[com.dangdang.ddframe.rdb.sharding.parser.SQLParseEngine] Parsed SQL: UPDATE [Token(t_user)] SET USER_ID = ?, NAME = ?, AGE = ? WHERE USER_iD = ?  
  92. 2016-10-28 17:20:15 [DEBUG]-[com.dangdang.ddframe.rdb.sharding.router.SQLRouteEngine] final route result:[SQLExecutionUnit(dataSource=datasource_01, sql=UPDATE t_user_2 SET USER_ID = ?, NAME = ?, AGE = ? WHERE USER_iD = ?, sqlBuilder=UPDATE [Token(t_user_2)] SET USER_ID = ?, NAME = ?, AGE = ? WHERE USER_iD = ?), SQLExecutionUnit(dataSource=datasource_01, sql=UPDATE t_user_0 SET USER_ID = ?, NAME = ?, AGE = ? WHERE USER_iD = ?, sqlBuilder=UPDATE [Token(t_user_0)] SET USER_ID = ?, NAME = ?, AGE = ? WHERE USER_iD = ?), SQLExecutionUnit(dataSource=datasource_01, sql=UPDATE t_user_1 SET USER_ID = ?, NAME = ?, AGE = ? WHERE USER_iD = ?, sqlBuilder=UPDATE [Token(t_user_1)] SET USER_ID = ?, NAME = ?, AGE = ? WHERE USER_iD = ?)]  
  93. 2016-10-28 17:20:15 [DEBUG]-[com.dangdang.ddframe.rdb.sharding.router.SQLRouteEngine] merge context:MergeContext(orderByColumns=[], groupByColumns=[], aggregationColumns=[], limit=null)  
  94. 2016-10-28 17:20:15 [DEBUG]-[org.springframework.transaction.support.TransactionSynchronizationManager] Retrieved value [org.mybatis.spring.SqlSessionHolder@2e1de495] for key [org.apache.ibatis.session.defaults.DefaultSqlSessionFactory@5adc783a] bound to thread [main]  
  95. 2016-10-28 17:20:15 [DEBUG]-[org.springframework.transaction.support.TransactionSynchronizationManager] Retrieved value [org.mybatis.spring.SqlSessionHolder@2e1de495] for key [org.apache.ibatis.session.defaults.DefaultSqlSessionFactory@5adc783a] bound to thread [main]  
  96. 2016-10-28 17:20:15 [DEBUG]-[org.mybatis.spring.SqlSessionUtils] Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@40595670]  
  97. 2016-10-28 17:20:15 [DEBUG]-[org.springframework.transaction.interceptor.TransactionInterceptor] Completing transaction for [com.mjkf.demo.service.impl.UserServiceImpl.updateByExample]  
  98. 2016-10-28 17:20:15 [DEBUG]-[org.springframework.jdbc.datasource.DataSourceTransactionManager] Triggering beforeCommit synchronization  
  99. 2016-10-28 17:20:15 [DEBUG]-[org.mybatis.spring.SqlSessionUtils] Transaction synchronization committing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@40595670]  
  100. 2016-10-28 17:20:16 [DEBUG]-[org.springframework.jdbc.datasource.DataSourceTransactionManager] Triggering beforeCompletion synchronization  
  101. 2016-10-28 17:20:16 [DEBUG]-[org.mybatis.spring.SqlSessionUtils] Transaction synchronization deregistering SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@40595670]  
  102. 2016-10-28 17:20:16 [DEBUG]-[org.springframework.transaction.support.TransactionSynchronizationManager] Removed value [org.mybatis.spring.SqlSessionHolder@2e1de495] for key [org.apache.ibatis.session.defaults.DefaultSqlSessionFactory@5adc783a] from thread [main]  
  103. 2016-10-28 17:20:16 [DEBUG]-[org.mybatis.spring.SqlSessionUtils] Transaction synchronization closing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@40595670]  
  104. 2016-10-28 17:20:16 [DEBUG]-[org.springframework.transaction.support.TransactionSynchronizationManager] Retrieved value [org.springframework.jdbc.datasource.ConnectionHolder@68c04a7c] for key [com.dangdang.ddframe.rdb.sharding.spring.datasource.SpringShardingDataSource@45ce43b9] bound to thread [main]  
  105. 2016-10-28 17:20:16 [DEBUG]-[org.springframework.jdbc.datasource.DataSourceTransactionManager] Initiating transaction commit  
  106. 2016-10-28 17:20:16 [DEBUG]-[org.springframework.jdbc.datasource.DataSourceTransactionManager] Committing JDBC transaction on Connection [com.dangdang.ddframe.rdb.sharding.jdbc.ShardingConnection@52ffd2a3]  
  107. 2016-10-28 17:20:16 [DEBUG]-[org.springframework.jdbc.datasource.DataSourceTransactionManager] Triggering afterCommit synchronization  
  108. 2016-10-28 17:20:16 [DEBUG]-[org.springframework.jdbc.datasource.DataSourceTransactionManager] Triggering afterCompletion synchronization  
  109. 2016-10-28 17:20:16 [DEBUG]-[org.springframework.transaction.support.TransactionSynchronizationManager] Clearing transaction synchronization  
  110. 2016-10-28 17:20:16 [DEBUG]-[org.springframework.transaction.support.TransactionSynchronizationManager] Removed value [org.springframework.jdbc.datasource.ConnectionHolder@68c04a7c] for key [com.dangdang.ddframe.rdb.sharding.spring.datasource.SpringShardingDataSource@45ce43b9] from thread [main]  
  111. 2016-10-28 17:20:16 [DEBUG]-[org.springframework.jdbc.datasource.DataSourceUtils] Resetting read-only flag of JDBC Connection [com.dangdang.ddframe.rdb.sharding.jdbc.ShardingConnection@52ffd2a3]  
  112. 2016-10-28 17:20:16 [DEBUG]-[org.springframework.jdbc.datasource.DataSourceTransactionManager] Releasing JDBC Connection [com.dangdang.ddframe.rdb.sharding.jdbc.ShardingConnection@52ffd2a3] after transaction  
  113. 2016-10-28 17:20:16 [DEBUG]-[org.springframework.jdbc.datasource.DataSourceUtils] Returning JDBC Connection to DataSource  
  114. 2016-10-28 17:20:16 [DEBUG]-[org.springframework.test.context.TestContextManager] afterTestMethod(): instance [test.mjkf.MainTest@5b0f7c0d], method [public void test.mjkf.MainTest.test()], exception [null]  
  115. 2016-10-28 17:20:16 [DEBUG]-[org.springframework.test.context.support.AbstractDirtiesContextTestExecutionListener] After test method: context [DefaultTestContext@29ae5edf testClass = MainTest, testInstance = test.mjkf.MainTest@5b0f7c0d, testMethod = test@MainTest, testException = [null], mergedContextConfiguration = [MergedContextConfiguration@76d697d9 testClass = MainTest, locations = '{classpath*:spring/applicationContext.xml}', classes = '{}', contextInitializerClasses = '[]', activeProfiles = '{}', propertySourceLocations = '{}', propertySourceProperties = '{}', contextLoader = 'org.springframework.test.context.support.DelegatingSmartContextLoader', parent = [null]]], class annotated with @DirtiesContext [false] with mode [null], method annotated with @DirtiesContext [false] with mode [null].  
  116. 2016-10-28 17:20:16 [DEBUG]-[org.springframework.test.context.TestContextManager] afterTestClass(): class [test.mjkf.MainTest]  
  117. 2016-10-28 17:20:16 [DEBUG]-[org.springframework.test.context.support.AbstractDirtiesContextTestExecutionListener] After test class: context [DefaultTestContext@29ae5edf testClass = MainTest, testInstance = [null], testMethod = [null], testException = [null], mergedContextConfiguration = [MergedContextConfiguration@76d697d9 testClass = MainTest, locations = '{classpath*:spring/applicationContext.xml}', classes = '{}', contextInitializerClasses = '[]', activeProfiles = '{}', propertySourceLocations = '{}', propertySourceProperties = '{}', contextLoader = 'org.springframework.test.context.support.DelegatingSmartContextLoader', parent = [null]]], class annotated with @DirtiesContext [false] with mode [null].  
  118. 2016-10-28 17:20:16 [INFO]-[org.springframework.context.support.GenericApplicationContext] Closing org.springframework.context.support.GenericApplicationContext@7d7c88d4: startup date [Fri Oct 28 17:20:13 CST 2016]; root of context hierarchy  
  119. 2016-10-28 17:20:16 [DEBUG]-[org.springframework.context.support.GenericApplicationContext] Publishing event in org.springframework.context.support.GenericApplicationContext@7d7c88d4: org.springframework.context.event.ContextClosedEvent[source=org.springframework.context.support.GenericApplicationContext@7d7c88d4: startup date [Fri Oct 28 17:20:13 CST 2016]; root of context hierarchy]  
  120. 2016-10-28 17:20:16 [DEBUG]-[org.springframework.beans.factory.support.DefaultListableBeanFactory] Returning cached instance of singleton bean 'sqlSessionFactory'  
  121. 2016-10-28 17:20:16 [DEBUG]-[org.springframework.beans.factory.support.DefaultListableBeanFactory] Returning cached instance of singleton bean 'lifecycleProcessor'  
  122. 2016-10-28 17:20:16 [DEBUG]-[org.springframework.beans.factory.support.DefaultListableBeanFactory] Destroying singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@45f0d31e: defining beans [org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.annotation.internalPersistenceAnnotationProcessor,org.springframework.context.event.internalEventListenerProcessor,org.springframework.context.event.internalEventListenerFactory,userServiceImpl,emailServer,propertyConfigurer,dataSource_master,dataSource_slave,datasource_01,userTableStrategy,shardingDataSource,sqlSessionFactory,sqlSession,com.mjkf.framework.mybatis.spring.mapper.MapperScannerConfigurer#0,org.springframework.transaction.config.internalTransactionalEventListenerFactory,org.springframework.aop.config.internalAutoProxyCreator,org.springframework.transaction.annotation.AnnotationTransactionAttributeSource#0,org.springframework.transaction.interceptor.TransactionInterceptor#0,org.springframework.transaction.config.internalTransactionAdvisor,transactionManager,transactionAdvice,transactionPointCut,org.springframework.aop.support.DefaultBeanFactoryPointcutAdvisor#0,org.springframework.context.annotation.ConfigurationClassPostProcessor.importAwareProcessor,org.springframework.context.annotation.ConfigurationClassPostProcessor.enhancedConfigurationProcessor,userMapper]; root of factory hierarchy  
  123. 2016-10-28 17:20:16 [DEBUG]-[org.springframework.beans.factory.support.DefaultListableBeanFactory] Retrieved dependent beans for bean '(inner bean)#a1848dc#1': [datasource_01]  
  124. 2016-10-28 17:20:16 [DEBUG]-[org.springframework.beans.factory.support.DisposableBeanAdapter] Invoking destroy method 'close' on bean with name '(inner bean)#a1848dc#1'  
  125. 2016-10-28 17:20:16 [DEBUG]-[org.springframework.beans.factory.support.DisposableBeanAdapter] Invoking destroy method 'close' on bean with name 'dataSource_slave'  
  126. 2016-10-28 17:20:16 [DEBUG]-[org.springframework.beans.factory.support.DefaultListableBeanFactory] Retrieved dependent beans for bean 'userServiceImpl': [test.mjkf.MainTest]  
  127. 2016-10-28 17:20:16 [DEBUG]-[org.springframework.beans.factory.support.DefaultListableBeanFactory] Retrieved dependent beans for bean '(inner bean)#213466fe': [transactionAdvice]  
  128. 2016-10-28 17:20:16 [DEBUG]-[org.springframework.beans.factory.support.DefaultListableBeanFactory] Retrieved dependent beans for bean 'sqlSessionFactory': [sqlSession]  
  129. 2016-10-28 17:20:16 [DEBUG]-[org.springframework.beans.factory.support.DefaultListableBeanFactory] Retrieved dependent beans for bean '(inner bean)#44b56ed9': [shardingDataSource]  
  130. 2016-10-28 17:20:16 [DEBUG]-[org.springframework.beans.factory.support.DefaultListableBeanFactory] Retrieved dependent beans for bean '(inner bean)#1d04e75b': [(inner bean)#44b56ed9]  
  131. 2016-10-28 17:20:16 [DEBUG]-[org.springframework.beans.factory.support.DefaultListableBeanFactory] Retrieved dependent beans for bean '(inner bean)#a1848dc': [(inner bean)#1d04e75b]  
  132. 2016-10-28 17:20:16 [DEBUG]-[org.springframework.beans.factory.support.DisposableBeanAdapter] Invoking destroy method 'close' on bean with name '(inner bean)#a1848dc'  
  133. 2016-10-28 17:20:16 [INFO]-[com.alibaba.druid.pool.DruidDataSource] {dataSource-2} closed  
  134. 2016-10-28 17:20:16 [DEBUG]-[org.springframework.beans.factory.support.DisposableBeanAdapter] Invoking destroy method 'close' on bean with name 'dataSource_master'  
  135. 2016-10-28 17:20:16 [INFO]-[com.alibaba.druid.pool.DruidDataSource] {dataSource-1} closed  

 

 

 

 

 

这篇关于Mycat\atlas\sharding-jdbc的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/906590

相关文章

JavaWeb 学习笔记 spring+jdbc整合开发初步

JdbcTemplate类是Spring的核心类之一,可以在org.springframework.jdbc.core中找到它。JdbcTemplate类在内部已经处理数据库的建立和释放,可以避免一些常见的错误。JdbcTemplate类可直接通过数据源的应用实例化,然后在服务中使用,也可在xml配置中作为JavaBean应用给服务使用直接上一个实例步骤1.xml配置 <?xml version

Sharding(切片)技术(解决数据库分库一致性问题)

Sharding(切片) 不是一门新技术,而是一个相对简朴的软件理念,就是当我们的数据库单机无法承受高强度的i/o时,我们就考虑利用 sharding 来把这种读写压力分散到各个主机上去。 所以Sharding 不是一个某个特定数据库软件附属的功能,而是在具体技术细节之上的抽象处理,是Horizontal Partitioning 水平扩展(或横向扩展)的解决方案,其主要目的是为突破单节点数

JDBC连接数据库 prepareStatement

import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import team.JDBCTest;public class DBCStudent {// 定

JDBC是什么?

JDBC(Java Database Connectivity)称为Java数据库连接,它是一种用于数据库访问的应用程序API,由一组用Java语言编写的类和接口组成。以下是关于JDBC的详细说明: 1. 定义 JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。通过JDBC,Java程序可以连接到关系型数据库并执行查询和更新操作。 2. 功能

Java中的JDBC编程:从数据库连接到高级查询

Java中的JDBC编程:从数据库连接到高级查询 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 在现代应用程序开发中,与数据库的交互是一个非常常见的需求。Java数据库连接(JDBC)是一种用于执行SQL语句的Java API,它为访问关系型数据库提供了统一的接口。本文将详细介绍如何使用JDBC进行数据库编程,从基本的数据库

JDBC之API(DriverManager)详解

之前在 JDBC 的快速入门写代码的时候,遇到了很多的API。这篇博客主要学习一些API。 目录 一、API(介绍) 二、JDBC之API——DriverManager (1)DriverManager (获取 Connection 的连接对象) 1、翻译 2、作用 3、常用的静态方法 4、详细介绍(首先是注册驱动) 5、注意 6、详细介绍(获取数据库连接对象) 1.

Java/JSP中使用JDBC连接SQL Server 2005(转自 秋忆)

接触Java或者JSP,难免会使用到数据库SQL Server 2000/2005(我使用2005标准版[9.0.3054]测试),经过自己的搜索和研究,使用JDBC连接SQL Server成功,特此整理方法(使用Eclipse 3.2)如下。 准备工作 首先,操作系统中安装好SQL Server 2000/2005,如果系统中都装有2000和2005版,记得停用一个,只开一个

jdbc和hibernate的对比

jdbc的优点与缺点:        * 优点:                 * 效率要高;(因为直接与底层打交道)                 * Connection pool        * 缺点:                 * 代码比较繁琐,此在大量的try{}catch{}finally{};                 *  没有data pool

JDBC上关于数据库中多表操作一对多关系和多对多关系的实现方法

我们知道,在设计一个JAVA bean的时候,要把这些BEAN 的数据存放在数据库中的表结构,然而这些数据库中的表直接又有些特殊的关系,例如员工与部门直接有一对多的关系,学生与老师直接又多对多的关系,那么这些表的关系如何表示呢? 首先在建立数据库的时候就应该建立这样的对应关系。 一对多 ,只要建立两个表就能建立这样的关系,因为你可以把多方的那个表设置一个Foreign Key 属性 ,下面

动态代理在JDBC的DataSource中的应用

目的:为数据连接池中的每一个Connection创建一个代理,当需要使用Connection对象操作数据库时,先判断是否超过连接池的最大连接数,如果没有超过,取得连接,否则不进行连接。 1、抽象对象角色 JDBC提供了Connection接口 2、定义我们自己的数据连接池,实现DataSource接口 public class MyDataSource implements DataSou