sharding-jdbc 分库分表

sharding官网:https://shardingsphere.apache.org/

环境:

   jdk8,  springboot + jpa +  sharding-jdbc  实现分表分库

 

导包:

<dependency>
    <groupId>io.shardingsphere</groupId>
    <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
    <version>3.1.0</version>
</dependency>
<dependency>
    <groupId>io.shardingsphere</groupId>
    <artifactId>sharding-jdbc-spring-namespace</artifactId>
    <version>3.1.0</version>
</dependency>

重要配置:

  注意:这里的sharding.jdbc.datasource.grouptest0.jdbc-url的数据库名称是自己命名的,不能是group_test0,sharding框架本身不支持这样的命名方式,所以 这里只能grouptest0的格式

sharding.jdbc.datasource.names=grouptest1,grouptest0
# 第一个数据库
sharding.jdbc.datasource.grouptest1.type=com.zaxxer.hikari.HikariDataSource
sharding.jdbc.datasource.grouptest1.driver-class-name=com.mysql.jdbc.Driver
sharding.jdbc.datasource.grouptest1.jdbc-url=jdbc:mysql://localhost:3306/grouptest1?characterEncoding=utf-8
sharding.jdbc.datasource.grouptest1.username=
sharding.jdbc.datasource.grouptest1.password=
# 第二个数据库
sharding.jdbc.datasource.grouptest0.type=com.zaxxer.hikari.HikariDataSource
sharding.jdbc.datasource.grouptest0.driver-class-name=com.mysql.jdbc.Driver
sharding.jdbc.datasource.grouptest0.jdbc-url=jdbc:mysql://localhost:3306/grouptest0?characterEncoding=utf-8
sharding.jdbc.datasource.grouptest0.username=
sharding.jdbc.datasource.grouptest0.password=

# 分库策略  分库的维度 定义在那张表 的ID来进行分库 例如:tables.t_clientinfo
sharding.jdbc.config.sharding.tables.t_clientinfo.database-strategy.inline.sharding-column=id
sharding.jdbc.config.sharding.tables.t_clientinfo.database-strategy.inline.algorithm-expression=grouptest$->{id %2}
# 水平拆分的数据库(表) 配置分库 + 分表策略 行表达式分片策略
sharding.jdbc.config.sharding.tables.t_clientinfo.actual-data-nodes=grouptest$->{0..1}.t_clientinfo_$->{0..1}
sharding.jdbc.config.sharding.tables.t_clientinfo.table-strategy.inline.sharding-column=connected
sharding.jdbc.config.sharding.tables.t_clientinfo.table-strategy.inline.algorithm-expression=t_clientinfo_$->{connected % 2}

    

实体

@Entity
@Table(name = "t_clientinfo")
public class Clientinfo {


    private  Long  id;
    private Integer connected;
    private Long mostsignbits;
    private Long leastsignbits;
    private Date lastconnecteddate;


    @Id
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public Integer getConnected() {
        return connected;
    }

    public void setConnected(Integer connected) {
        this.connected = connected;
    }

    public Long getMostsignbits() {
        return mostsignbits;
    }

    public void setMostsignbits(Long mostsignbits) {
        this.mostsignbits = mostsignbits;
    }

    public Long getLeastsignbits() {
        return leastsignbits;
    }

    public void setLeastsignbits(Long leastsignbits) {
        this.leastsignbits = leastsignbits;
    }

    public Date getLastconnecteddate() {
        return lastconnecteddate;
    }

    public void setLastconnecteddate(Date lastconnecteddate) {
        this.lastconnecteddate = lastconnecteddate;
    }
}

接口 dao

   注意:这里写sql 用逻辑表

@Repository
public interface ClientinfoDao extends  JpaRepository<Clientinfo,Long> {
    
    @Query(value = " SELECT  * FROM t_clientinfo where id = ?1",nativeQuery = true)
    Clientinfo  findClientinfo(long id);
}

实现接口

 

@Service
public class ClientinfoService {


    @Autowired
    private ClientinfoDao clientinfoDao;


    public Clientinfo save(Clientinfo clientinfo){
       return clientinfoDao.save(clientinfo);
    }

    public Clientinfo get(long id){
//        Optional<Clientinfo>  optional = clientinfoDao.findById(id);
        return clientinfoDao.findClientinfo(id);
//        return  optional.get();
    }

 

controller层

@Controller
public class ClientinfoController {


    @Autowired
    private ClientinfoService   clientinfoService;



    @GetMapping("/sharding")
    @ResponseBody
    public String save(long id,int connected){
        System.out.println("132132123");
        Clientinfo clientinfo = new Clientinfo();
        clientinfo.setId(id);
        Random random = new Random();

        clientinfo.setConnected(connected);
        clientinfo.setLastconnecteddate(new Date());
        clientinfo.setLeastsignbits(Long.parseLong(random.nextInt()+"") );
        clientinfo.setMostsignbits(Long.parseLong(random.nextInt()+"") );

        System.out.println(JSON.toJSONString(clientinfoService.save(clientinfo)));
        return "ok";
    }

    @GetMapping("/shardingjdbc")
    @ResponseBody
    public Clientinfo get(long id){
        System.out.println("132132123");
        return clientinfoService.get(id);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值