java如何分库
分库的概念与适用场景
分库指将单一数据库拆分为多个数据库实例,通常用于解决单库性能瓶颈、数据量过大或业务模块隔离等问题。适用于高并发、大数据量或需水平扩展的系统。
分库策略
水平分库
按数据行拆分,同一表的数据分布在不同库中。例如按用户ID哈希或范围分片,适合单表数据量大的场景。
垂直分库
按业务模块拆分,不同业务表归属不同库。例如订单库、用户库分离,降低单库压力并提升业务独立性。
技术实现方案
1. 原生JDBC分库路由
通过自定义数据源(如AbstractRoutingDataSource)实现动态切换。需在代码中根据分片键(如用户ID)计算目标库,示例逻辑:

public class ShardingDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
return ShardingContext.getCurrentShardKey(); // 从线程上下文获取分片键
}
}
2. 中间件分库
- ShardingSphere:通过配置YAML定义分片规则,支持SQL解析与路由。
shardingRule: tables: t_order: actualDataNodes: ds_${0..1}.t_order_${0..1} databaseStrategy: inline: shardingColumn: user_id algorithmExpression: ds_${user_id % 2} - MyCat:通过配置文件(如
schema.xml)定义逻辑库与分片规则。
3. 业务层分库
在Service层显式指定数据源,适用于简单场景:
@Transactional
public void saveOrder(Order order) {
String dsKey = "ds_" + (order.getUserId() % 2);
DataSourceContextHolder.setDataSource(dsKey);
orderMapper.insert(order);
}
分库注意事项
数据一致性
跨库事务需使用分布式事务框架(如Seata)或最终一致性方案(如消息队列)。

跨库查询
避免JOIN跨库表,可通过冗余字段或业务层聚合数据。
扩容问题
设计分片算法时需预留扩容空间,如一致性哈希减少数据迁移。
监控与运维
分库后需监控各库性能,工具如Prometheus+Grafana。
分库与分表对比
- 分库:解决连接数、磁盘IO等单机资源瓶颈。
- 分表:解决单表数据量过大问题,常与分库结合使用。
通过合理选择策略和工具,分库可显著提升系统扩展性与性能。






