mango分布式分库分表

mongo 用起来很简单方便,很方便学习使用

下面是mango的一些特性:

  • 超高性能,响应速度接近直接使用JDBC
  • 采用接口与注解的形式定义DAO,完美结合db与cache操作
  • 支持动态sql,可以构造任意复杂的sql语句
  • 支持多数据源,分表,分库,事务
  • 提供拦截器功能,利用拦截器可为mango框架扩展各种自定义插件
  • 独创“函数式调用”功能,能将任意复杂的对象,映射到数据库的表中
  • 高效详细的实时统计系统,方便开发者随时了解自己的系统
  • 独立jar包,不依赖其它jar包
  • 提供便捷的spring插件,与spring无缝集成

表分片

表分片通常也被称为分表,散表。 当某张表的数据量很大时,sql执行效率都会变低,这时通常会把大表拆分成多个小表,以提高sql执行效率。 我们将这种大表拆分成多个小表的策略称之为表分片。

下面我们通过一实际例子,展示如何使用mango框架完成表分片(分表)。

需求描述

数据库中有t_order_0与t_order_1共2张表,我们按照用户ID(后续简称uid)纬度进行表分片:

  • uid小于等于1000时,使用t_order_0表
  • uid大于1000时,时使用t_order_1表

定义表分片策略

public class TableShardingOrderDaoMain {

    public static void main(String[] args) {
        // DataSource ds = ...
        Mango mango = Mango.newInstance(ds);
    }

    @DB(table = "t_order")
    @Sharding(tableShardingStrategy = OrderTableShardingStrategy.class)
    public interface TableShardingOrderDao {

        @SQL("insert into #table(id, uid, price, status) values(:id, :uid, :price, :status)")
        public void addOrder(@TableShardingBy("uid") Order order);

        @SQL("select id, uid, price, status from #table where uid = :1")
        public List<Order> getOrdersByUid(@TableShardingBy int uid);

    }

    static class OrderTableShardingStrategy implements TableShardingStrategy<Integer> {

        @Override
        public String getTargetTable(String table, Integer uid) {
            int num = uid <= 1000 ? 0 : 1;
            return table + "_" + num;
        }

    }

}

数据库分片

数据库分片通常也被称为分库,散库等。 当我们在某个库中,把某张大表拆分成多个小表后还不能满足性能要求,这时我们需要把一部分拆分的表挪到另外一个库中,以提高sql执行效率。

下面我们通过一实际例子,展示如何使用mango框架完成数据库分片(分库)。

需求描述

3个独立数据库db0,db1,db2中,各有1张t_order表,在读写t_order表时,我们按照用户ID(后续简称uid)纬度进行数据库分片:

  • uid模3为0的请求落在数据库db0
  • uid模3为1的请求落在数据库db1
  • uid模3为2的请求落在数据库db2

初始化数据库源工厂

public class DatabaseShardingOrderDaoMain {

    public static void main(String[] args) {
        String driverClassName = "com.mysql.jdbc.Driver";
        String username = "root"; // 这里请使用您自己的用户名
        String password = "root"; // 这里请使用您自己的密码

        int dbNum = 3;
        List<DataSourceFactory> dsfs = new ArrayList<DataSourceFactory>();
        for (int i = 0; i < dbNum; i++) {
            String name = "dsf" + i;
            String url = "jdbc:mysql://localhost:3306/db" + i;
            DataSource ds = new DriverManagerDataSource(driverClassName, url, username, password);
            DataSourceFactory dsf = new SimpleDataSourceFactory(name, ds);
            dsfs.add(dsf);
        }
        Mango mango = Mango.newInstance(dsfs);
    }
}
public class DatabaseShardingOrderDaoMain {

    public static void main(String[] args) {
        // List<DataSourceFactory> dsfs = ...
        Mango mango = Mango.newInstance(dsfs);
    }

    @DB()
    @Sharding(databaseShardingStrategy = OrderDatabaseShardingStrategy.class)
    public interface DatabaseShardingOrderDao {

        @SQL("insert into t_order(id, uid, price, status) values(:id, :uid, :price, :status)")
        public void addOrder(@DatabaseShardingBy("uid") Order order);

        @SQL("select id, uid, price, status from t_order where uid = :1")
        public List<Order> getOrdersByUid(@DatabaseShardingBy int uid);

    }

    static class OrderDatabaseShardingStrategy implements DatabaseShardingStrategy<Integer> {

        @Override
        public String getDataSourceFactoryName(Integer uid) {
            return "dsf" + uid % 3;
        }

    }

}


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值