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;
}
}
}