dao.sharding.split.action.CallBack< |
||
具体业务进行操作获取数据源时实现此接口,以便获取数据源 |
||
doAction(T engine) |
描述 |
具体业务实现 |
参数 |
T engine:数据源,由回调方法推入 |
|
返回值 |
Object obj:操作结果 |
dao.sharding.split.annotation.HolisticController< |
全局事物注解,标注于Service层方法,对于有此标注的方法,要进行全局事物处理 |
dao.sharding.split.annotation.SplitPolicy< |
分库分表注解,标注于DAO层方法,对于有此标注的方法,要进行分库分表处理 |
dao.sharding.split.transaction.annotation.Transactional< |
事物注解,标注于DAO层方法,对于有此标注的方法,要进行事物控制 |
dao.sharding.split.policy.IPolicy |
||
分库分表策略类,具体业务要实现相应业务逻辑 |
||
createKey() |
描述 |
主键生成接口 |
返回值 |
K 生成主键 |
|
getClusterId() |
描述 |
计算集群id接口 |
返回值 |
集群id |
|
getDBId() |
描述 |
计算数据库id接口 |
返回值 |
数据库id |
|
getDBIdsByClusterId(String clusterId) |
描述 |
获取某一集群下的所有数据库 |
参数 |
clusterId:集群id |
|
返回值 |
String[]:数据库id集合 |
|
getTableId() |
描述 |
计算表id接口 |
参数 |
|
|
返回值 |
表id |
|
getTableIdsByDbId(String dbId) |
描述 |
获取某一数据库下的所有表 |
参数 |
dbId:数据库id |
|
返回值 |
String[]:表id集合 |
|
getAllClusterId() |
描述 |
获取所有集群 |
参数 |
|
|
返回值 |
String[]:集群id集合 |
|
getAllDBId() |
描述 |
获取所有数据库 |
参数 |
|
|
返回值 |
String[]:数据库id集合 |
|
getAllTableId() |
描述 |
获取所有表集合 |
参数 |
|
|
返回值 |
String[]:表集合id集合 |
dao.sharding.split.aop.DAOSplitHandler< extends InvocationHandler |
||
分库分表控制器,基于DAO层拦截器实现,对每个DAO层操作都进行拦截,以实现分库分表、事物管理操作。 1.检查方法是否包含SplitPolicy注解;有:调用相应方法获取数据源,否:使用默认数据源 2.检查方法是否包含Transactional注解;有:需要框架提供事物处理,否:终端用户已经自实现了事物处理。 3.检查上下文环境,如果处于全局事物当中,将事物交由全局事物控制器 |
||
invoke(Object proxy, Method method, Object[] args) |
描述 |
拦截DAO层方法调用,加入分库分表于事物控制;继承方法 |
参数 |
Object proxy:代理对象 Method method:调用方法 Object[] args:方法参数 |
|
返回值 |
|
dao.sharding.split.aop.ServiceSplitHandler< extends InvocationHandler |
||
全局事物控制器,基于Service层拦截器实现,对每个Service层都进行拦截,加入全局事物控制。 1.检查方法是否包含HolisticController注解,有:此方法需要加入全局事物控制,无:在当前上下文环境中是否为嵌套方法,如果外层调用已经存在全局事物控制,则继承全局事物控制,否则放弃嵌套。 |
||
invoke(Object proxy, Method method, Object[] args) |
描述 |
拦截Service方法,进行全局事物事物控制;继承方法 |
参数 |
Object proxy:代理对象 Method method:调用方法 Object[] args:方法参数 |
|
返回值 |
|
dao.sharding.split.engine.EngineContext< |
||
事物上下文管理类,基于当前线程对象管理全局事物及其数据源 |
||
ThreadLocal |
描述 |
当前线程的上下文,存储数据源的链表队列,支持栈操作 |
push(T engine) |
描述 |
在某方法执行前,将用到的数据源压入上下文栈中 |
参数 |
T engine:数据源对象 |
|
返回值 |
|
|
pop(T engine) |
描述 |
在当前方法执行时,弹出上下文中的数据源 |
参数 |
|
|
返回值 |
T engine:当前方法数据源 |
|
setHolistic(boolean isHolistic) |
描述 |
将当前Service执行方法全局事物状态压入。压入条件:需要全局事物控制的;外层Service调用已经有压入的非标志方法 |
参数 |
boolean isHolistic:是否需要全局事物控制 |
|
返回值 |
|
|
getHolisticNestedLevel() |
描述 |
返回当前Service方法所在全局事物嵌套中的层级。 |
参数 |
|
|
返回值 |
当前层级,如果不存在全局事物上下文,则返回0。 |
|
removeHolistic() |
描述 |
将当前Service方法从全局事务事中弹出 |
参数 |
|
|
返回值 |
int:在堆栈当中的层级 |
|
rollback() |
描述 |
回滚全局事物 |
参数 |
|
|
返回值 |
|
|
commit() |
描述 |
提交全部事物 |
参数 |
|
|
返回值 |
|
|
close() |
描述 |
Close全局事物的所有数据源 |
参数 |
|
|
返回值 |
|
|
clearContext() |
描述 |
清除全局事物上下文 |
参数 |
|
|
返回值 |
|
|
getExistEngine(String index) |
描述 |
检索当前上下文中已经存在、并可使用的数据源,具体实现类实现 |
参数 |
String index:数据源标识 |
|
返回值 |
T:对应数据源 |
|
mergeEngine() |
描述 |
合并当前上下文中同志的数据源 |
参数 |
|
|
返回值 |
|
dao.sharding.split.engine.EngineContext.EngineContextStatus< |
||
全局事物上下文环境载体类,用于存储当前上下文中信息 |
||
LinkedList |
描述 |
存储全局事物上下文环境 |
LinkedList |
描述 |
存储上下文环境中数据源 |
dao.sharding.split.engine.EngineStatus< |
||
数据源状态容器,包含数据源的当前状态信息 |
||
int state |
描述 |
数据源的当前状态 |
int needX |
描述 |
数据源当前的事物状态 |
int count |
描述 |
数据源被调用次数 |
String index |
描述 |
数据源唯一标识 |
statusRollback() |
描述 |
回滚当前数据源事物 |
参数 |
|
|
返回值 |
|
|
statusCommit() |
描述 |
提交当前事物 |
参数 |
|
|
返回值 |
|
|
statusClose() |
描述 |
Close当前数据源 |
参数 |
|
|
返回值 |
|
|
isValid() |
描述 |
当前数据源是否可以重用 |
参数 |
|
|
返回值 |
|
|
getActualEngine() |
描述 |
获取数据源真正实体 |
参数 |
|
|
返回值 |
T :数据源真正实体 |
dao.sharding.split.engine.EngineSupport< |
||
实际数据源帮助类 |
||
getEngine(String... params) |
描述 |
根据数据源返回数据源集合 |
参数 |
|
|
返回值 |
Map |
|
getDefaultEngineIndex() |
描述 |
获取默认数据源标识 |
参数 |
|
|
返回值 |
String :默认数据源标识 |
|
getDefaultEngine() |
描述 |
获取默认的数据源 |
参数 |
|
|
返回值 |
Map |
|
getAllEngines() |
描述 |
当前数据源是否可以重用 |
参数 |
|
|
返回值 |
Map |
|
getAllEnginesIndexs() |
描述 |
获取数据源真正实体 |
参数 |
|
|
返回值 |
String[] :获取所有数据源的标识 |
dao.sharding.dao.impl.mybatis.action.MybatisCallBack< Implements Callback |
Mybatis实现动作方法 |
dao.sharding.dao.impl.mybatis.engine.MultipleSqlSessionFactoryBuilder< extends SqlSessionFactoryBuilder |
||
扩展mybatis工厂类,实现多数据源同时加载 |
||
buildMulti(Reader reader) |
描述 |
同时加载多数据源 |
参数 |
|
|
返回值 |
Map |
dao.sharding.dao.impl.mybatis.engine.MybatisEngineContext< extends EngineContext |
Mybatis 实现分库分表EngineContext |
dao.sharding.dao.impl.mybatis.engine.MybatisEngineStatus< extends EngineStatus |
Mybatis 实现分库分表EngineStatus |
dao.sharding.dao.impl.mybatis.engine.MybatisEngineSupport< extends EngineSupport |
Mybatis 实现分库分表EngineSupport |
dao.sharding.dao.impl.mybatis.support.DAOLoader |
||
加载DAO层类的代理实例,并实现单例模式 |
||
getSingleTon(Class> clazz) |
描述 |
扫描DAO层,加载所有DAO层 |
参数 |
|
|
返回值 |
Object:代理实体 |
dao.sharding.service.support.ServiceLoader |
||
加载Service层类的代理实例,并实现单例模式 |
||
getSingleTon(Class> clazz) |
描述 |
扫描DAO层,加载所有Service层代理 |
参数 |
|
|
返回值 |
Object:代理实体 |
public class TbReceiverAddress extends IPolicy
实现以下接口
/**
* generate primary key
* @return
*/
public abstract K createKey();
/**
* get cluster id
* @param id
* @return
*/
public abstract String getClusterId();
/**
* get database id
* @param id
* @return
*/
public abstract String getDBId();
/**
* get databases id by cluster id
* @param clusterId
* @return
*/
public abstract String[] getDBIdsByClusterId(String clusterId);
/**
* get table id
* @param id
* @return
*/
public abstract String getTableId();
/**
* get tables id by database id
* @return
*/
public abstract String[] getTableIdsByDbId(String id);
/**
* get all clusters id
* @return
*/
public abstract String[] getAllClusterId();
/**
* get all databases id
* @return
*/
public abstract String[] getAllDBId();
/**
* get all tables id
* @return
*/
Public abstract String[] getAllTableId();
/**
* executor
* @throws Exception
*/
public Object doAction(MybatisCallBack callback) throws Exception{
//get the SqlSession object according to the context
MybatisEngineStatus session = MybatisEngineContext.singleTon().pop();
if(session==null){
throw new Exception("there is no SqlSession in the context, should push a SqlSession to the context first");
}
Object objRes = callback.doAction(session);
//check the session state , whether end user has commit or close the session
session.setState(EngineStatus.ENGINE_RUNNING);
//TODO later need to implements the function of multiple thread to get data from all data sources
return objRes;
}
自定义DAO层方法时如果需要全局控制时,业务实现为内部类调用,例如下:
@SplitPolicy(type=OperationType.INSERT)
@Transactional()
@SuppressWarnings("unchecked")
public K insert(T object) throws Exception{
final T obj = object;
return (K) this.doAction(new MybatisCallBack(){
public Object doAction(SqlSession session) {
int insert = session.insert(clazz.getName()+".insert", obj);
return insert;
}
});
}
如果需要分库分表策略,请标注注解:
@SplitPolicy(type=OperationType.INSERT)
如果需要事物控制,请标注注解:
@Transactional()
配置文件中配置DAO层实现的包路径,控件提供了扫描给定文件夹,并自己动加载DAO层动态代理实例功能
l dao.base.package=dao.sharding.dao.impl.mybatis
ldao.sharding.dao.impl.mybatis.support.DAOLoader.getSingleTon(Class> clazz)
public class AddressServiceImpl implements IAddressService {
private IAddressDAO addressDAO = (IAddressDAO) DAOLoader.getSingleTon(IAddressDAO.class);
@HolisticController
public Integer addAddress(TbReceiverAddress address) {
try{
Integer intId = this.addressDAO.insert(address);
return intId;
}catch(Exception e){
e.printStackTrace();
}
return null;
}
配置文件中配置Service层实现的包路径,控件提供了扫描给定文件夹,并自己动加载Service层动态代理实例功能
l service.base.package=dao.sharding.service.impl
ldao.sharding.service.support.ServiceLoader.getSingleTon(Class> clazz