基于sharding-jdbc 之spring+mybatis+sharding-jdbc整合

基于sharding-jdbc 之spring+mybatis+sharding-jdbc整合

官方介绍文档: http://dangdangdotcom.github.io/sharding-jdbc/00-overview/

本文参考: http://blog.csdn.net/clypm/article/details/54378523

 

0.环境

ip :192.168.1.121

端口号:3306数据库1:sharding_0

数据库2:sharding_1

 

1.创建多个分库

create database sharding_0;
create database sharding_1;

 

2.在各个分库上,创建多张分表

 

SET FOREIGN_KEY_CHECKS=0; 
-- 逻辑表 t_user
-- 分表: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 DEFAULT CHARSET=utf8; 
-- 分表: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 DEFAULT CHARSET=utf8; 

-- 分表: 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 DEFAULT CHARSET=utf8; 

 
DROP TABLE IF EXISTS `t_student_0`; 
CREATE TABLE `t_student_0` ( 
  `id` int(11) NOT NULL AUTO_INCREMENT, 
  `student_id` int(11) NOT NULL, 
  `name` varchar(255) NOT NULL, 
  `age` int(11) NOT NULL, 
  PRIMARY KEY (`id`) 
) ENGINE=InnoDB  DEFAULT CHARSET=utf8; 
 
DROP TABLE IF EXISTS `t_student_1`; 
CREATE TABLE `t_student_1` ( 
  `id` int(11) NOT NULL AUTO_INCREMENT, 
  `student_id` int(11) NOT NULL, 
  `name` varchar(255) NOT NULL, 
  `age` int(11) NOT NULL, 
  PRIMARY KEY (`id`) 
) ENGINE=InnoDB  DEFAULT CHARSET=utf8; 

-- 学生表:测试事务时使用
DROP TABLE IF EXISTS `t_student_0`;
CREATE TABLE `t_student_0` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `student_id` int(11) NOT NULL,
  `name` varchar(255) NOT NULL,
  `age` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

DROP TABLE IF EXISTS `t_student_1`;
CREATE TABLE `t_student_1` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `student_id` int(11) NOT NULL,
  `name` varchar(255) NOT NULL,
  `age` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

 

3.案例:sharding-jdbc-mybatis-demo

3.1 组件

需要jar包:见 pom.xml ,加粗的标识



    4.0.0

    com.eshop
    sharding-jdbc-mybatis-demo 
    0.0.1-SNAPSHOT
    jar

     
        UTF-8  
        3.2.5.RELEASE  
        3.2.4  
      
  
      
          
            junit  
            junit  
            4.10  
          
        
          
            org.springframework  
            spring-orm  
            ${spring.version}  
          
          
            commons-dbcp  
            commons-dbcp  
            1.4  
          
          
            org.mybatis  
            mybatis-spring  
            1.2.2  
          
          
            org.mybatis  
            mybatis  
            ${mybatis.version}  
          
  
          
            org.springframework  
            spring-expression  
            ${spring.version}  
          
          
            org.springframework  
            spring-aop  
            ${spring.version}  
          
          
            org.springframework  
            spring-beans  
            ${spring.version}  
          
          
            org.springframework  
            spring-context  
            ${spring.version}  
          
          
            org.springframework  
            spring-context-support  
            ${spring.version}  
          
          
            org.springframework  
            spring-test  
            ${spring.version}  
          
          
            org.springframework  
            spring-tx  
            ${spring.version}  
          
          
            log4j  
            log4j  
            1.2.16  
          
          
            org.slf4j  
            slf4j-log4j12  
            1.7.5  
          
        
         
        	org.springframework 
        	spring-webmvc 
        	3.2.4.RELEASE 
        
        
        
          
            com.dangdang  
            sharding-jdbc-core  
            1.4.2 
          
        
   		  
             com.dangdang  
             sharding-jdbc-config-spring  
             1.4.2  
        
        
          
            mysql  
            mysql-connector-java  
            5.1.28  
            

	
		javax.servlet
		servlet-api
		2.5
	          
        
       
  

 错误分析:

 
Unsatisfied dependency expressed through constructor argument with index 1 of type [boolean]: Could not convert constructor argument value of type [java.util.ArrayList] to required type [boolean]
 问题解决:在rdb的配置方法里,就可以使用,而且分布式主键的包需要1.4.2版本

3.2 主配置文件applicationContext.xml




	
	

	
		
	

	
	

 

3.3 配置文件spring-database.xml

  
  
          
	
	
	     
          
          
          
          
          
          
          
          
          
          
          
          
          
          
          
          
          
          
          
          
          
          
         
        
      
          
    
          
          
          
    
      
    
          
          
          
    
  
 
 

3.4 配置文件spring-sharding.xml

  
  
          
	
		
		
	
    
       
          
        
    
      
    

      
          
    
    
      
      
          
          
              
                  
                  
              
          
       
    
      
      
          
              
                  
                          
              
          
            
      
      
      
          
          
              
                t_user_0  
                t_user_1  
                t_user_2  
              
          
          
          
           
      
      
      
      
          
          
              
          
      
      
      
      
        
        
              
          
      
    
      
      
          
      
  
      
          
  
 

3.5 log.xml

      
    
    
      
      
         
         
         
           
         
      
    
      
      
         
         
         
         
         
        
         
       
    
       
       
         
         
         
         
         
         
            
         
       
    
       
       
         
         
         
         
         
        
         
       
    
       
       
          
          
          
       
    
       
       
           
           
           
          
          
       
  

 

 

4.相关的类

 

4.1ShardingTmInterceptor

在跨库查询时,必须加这个类实现HandlerInterceptorAdapter,否则报错

package com.eshop.sharding.jdbc.aop;

import java.util.Date;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.AbstractPlatformTransactionManager;
import org.springframework.transaction.support.TransactionCallbackWithoutResult;
import org.springframework.transaction.support.TransactionTemplate;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

public class ShardingTmInterceptor extends HandlerInterceptorAdapter  {

	@Override
	public void afterCompletion(HttpServletRequest request,
			HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		// TODO Auto-generated method stub
		super.afterCompletion(request, response, handler, ex);
	}

	@Override
	public void afterConcurrentHandlingStarted(HttpServletRequest request,
			HttpServletResponse response, Object handler) throws Exception {
		// TODO Auto-generated method stub
		super.afterConcurrentHandlingStarted(request, response, handler);
	}

	@Override
	public void postHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		// TODO Auto-generated method stub
		super.postHandle(request, response, handler, modelAndView);
	}

	@Override
	public boolean preHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler) throws Exception {
		
		AbstractApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
		//获取分库分表数据源
		DataSource shardingDataSource = (DataSource) ctx.getBean("shardingDataSource");
		//创建jdbcTemplate
		final JdbcTemplate jdbcTemplate = new JdbcTemplate(shardingDataSource);
		//获取事务管理器
		AbstractPlatformTransactionManager transactionManager = (AbstractPlatformTransactionManager) ctx.getBean("transactionManager");
		//创建事务模板
		TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager);
		//执行SQL(product是逻辑表名,id是分库分表键)
		transactionTemplate.execute(new TransactionCallbackWithoutResult() {
			
			@Override
			protected void doInTransactionWithoutResult(TransactionStatus arg0) {
				//HintManager hintManager = HintManager.getInstance();
				//hintManager.setMasterRouteOnly();
				
				String sql = "insert into product(id,title,last_modified) values(?,?,?)";
				jdbcTemplate.update(sql,1L,"title",new Date());
				
				//jdbcTemplate.queryForList("select id,title from product where id = ?",1L);
				
			}
		});
		
		
		return super.preHandle(request, response, handler);
	}
	
}

 

4.2  持久层接口类

UserDao

package com.eshop.sharding.jdbc.dao;  
  
import java.util.List;

import com.eshop.sharding.jdbc.domain.User;
  
public interface UserDao {
      
    Integer insert(User u);  
      
    List findAll();  
      
    List findByUserIds(List userIds);  
      
  
} 

 对应的Mapper文件UserDao.xml

  
  


                    

你可能感兴趣的:(数据扩容-应用层面&中间件)