nhmicro技术框架应用说明(事务、aop、分库分表、读写分离)

事务控制

通过@Transactional注解控制事务

在groovy方法上加上@Transactional注解,则通过GroovyExecUtil.execGroovyRetObj调用触发此方法时,方法内的逻辑处理即可加入事务控制。

注:使用此事务控制方法,需要将com.nh.micro.template.GroovyTMAopImpl配置到aop责任链中。

 

通过execGroovyRetObjByDbTranNest方法启动事务

也可以通过MicroServiceTemplateSupport中的execGroovyRetObjByDbTranNest方法启动事务
public Object execGroovyRetObjByDbTranNest(String groovyName, String methodName, Integer nestDef, Object... paramArray)

参数为:

groovyName,为groovy脚本名称

methodName,为groovy方法名称

nestDef,为事务传播级别

paramArray,为代理的groovy脚本名称、方法所需参数

 

获取Mybatis的dao或其他spring管理的bean

调用MicroContextHolder的getContext方法获取ApplicationContext对象,通过它的getbean方法获取Mybatis的dao或其他spring的bean

getContext是静态无参方法:

public static ApplicationContext getContext()

针对已经大量生成Mybatis的dao的场景,通过此方法可以在Groovy脚本中获取Mybatis的dao进行数据库操作。

 

Groovy脚本支持Aop切面编写

技术框架支持针对Groovy脚本调用的责任链模式的切面handler管理。执行GroovyExecUtil.execGroovyRetObj方法时会依次触发责任链中的handler。可以自行开发日志记录或其他技术处理handler,并配置到责任链中。

编写一个handler需要继承GroovyAopInter接口,并实现invokeMethod(GroovyObject groovyObject, String GroovyName,    String methodName, Object... param)方法,注意在handler执行过程中调用execNextHandler(GroovyObjectgroovyObject, String GroovyName, String methodName, Object... param)触发责任链中下一个handler。

配置责任链:

<beanclass="com.nh.micro.rule.engine.core.GroovyAopChain"init-method="init">

<propertyname="handlerList">

   <list>

<beanclass="com.nh.micro.template.GroovyTMAopImpl"></bean>

   </list>

</property>

</bean>

 

 

实现读写分离和分库

通过@ChangeDataSource注解设置目标数据源,结合MicroDynamicDataSource配置多数据源动态路由实现读写分离和分库功能

 

 

//在groovy脚本中可配置使用@ChangeDataSource注解

class TestGroovy extends MicroServiceTemplate {
@Transactional
@ChangeDataSource(name="local_xa_dataSource")
    public Map queryTestPageList(){
        Map pageMap=new HashMap();
        pageMap.put("page", "1");
        pageMap.put("rows", "10");
        pageMap.put("sort", "id");
        pageMap.put("order", "desc");
        Map retMap=getInfoList4PageService(new HashMap(),"black",pageMap);
        return retMap;
    }
}

}

 

//Mybatis的Dao接口代码中,也可以使用@ChangeDataSource注解决定是否切换为其他数据源

package foo.repository;

import java.util.Map;

import com.nh.micro.datasource.ChangeDataSource;

public interface TestRep {

@ChangeDataSource(name="local_xa_dataSource")

public int updateInfo(Map paramMap);

@ChangeDataSource(name="local_xa_dataSource")

public int insertInfo(Map paramMap);

}

 

 

 

MicroDynamicDataSource动态切换数据源配置

<!-- micro动态切换数据源配置 -->

  <bean id="dynamic_xa_dataSource" class="com.nh.micro.datasource.MicroDynamicDataSource" >

  <property name="targetDataSources">   

  <map key-type="java.lang.String">

<!– 设置目标数据源为分布式事务数据源 --> 

  <entry key="local_xa_dataSource" value-ref=" dataSource2"></entry>    

  </map>  

  </property> 

<!-- 默认目标数据源为主库普通数据源 --> 

  <property name="defaultTargetDataSource" ref="dataSource"/>

  </bean>

 

 

实现分表操作

通过继承MicroServiceTemplateSupport并在checkView方法中定制逻辑,可以针对一个视图或虚拟的表名称操作时,实现分表操作或针对数据库视图增删改操作。

checkView(String tableName,MapparamMap,String bizId,String bizCol,String type)

参数为:

tableName,逻辑表名称

paramMap,参数map

bizId,业务逻辑id值

bizCol,业务逻辑id对应的数据库字段标识

type,触发操作类型TYPE_DEL_IDTYPE_UPDATE_IDTYPE_DEL_BIZIDTYPE_UPDATE_BIZIDTYPE_INSERTTYPE_SELECT_IDTYPE_SELECT_BIZID

 

示例代码

real_user_view是test_user表的视图,只显示user_type=1的记录

通过实现checkView方法,实现对视图real_user_view的增删改操作。

classcheckview_user_view extends MicroServiceTemplateSupport{

    public Integer checkView(String tableName,Map paramMap,String bizId,String bizCol,String type){

        if(type!=null && type.contains("update_")){

            Map userViewMap=getInfoByBizIdService(bizId,"real_user_view",bizCol);

            String userCode=userViewMap.get("user_code");

    updateInfoByBizIdService(userCode,"test_user","user_code",paramMap);

            return1;

        }

        if(type!=null && type.contains("del_")){

            Map userViewMap=getInfoByBizIdService(bizId,"real_user_view",bizCol);

            String userCode=userViewMap.get("user_code");

            delInfoByBizIdService(userCode,"test_user","user_code");

            return1;

        }

        if(type!=null && type.contains("insert")){

            paramMap.put("user_type","1");

            createInfoService(paramMap,"test_user");

            return1;

        }

    }

}

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ShardingSphere:SpringBoot2+MybatisPlus+分离+分库课程目标快速的掌握分离+分的实战,即插即用适用人群IT从业人员,开发人员,Java从业者,互联网从业者,性能调优人群课程简介ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈。它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar(计划中)这3款相互独立的产品组成,shardingSphere定位为关系型数据库中间件。 Sharding-JDBCSharding-JDBC是Sharding-Sphere的第一个产品,也是Sharding-Sphere的前身,是当当网开源的一个产品。定位为轻量级的Java框架,在Java的JDBC层提供额外服务。 它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为增强版的JDBC驱动,完全兼容JDBC和各种ORM框架。他们均提供标准化的数据分片、分离、柔性事务和数据治理功能,可适用于如Java同构、异构语言、容器、云原生等各种多样化的应用场景。Sharding-JDBC可以通过Java,YAML,Spring命名空间和Spring Boot Starter四种方式配置,开发者可根据场景选择适合的配置方式。课程特色 本章节以尽量短的时间,为使用者提供最简单的ShardingSphere的快速入门。课程说明该课程属于系列课程,分为分离分库不分,不分库分库分离+分库共5个回合。本课程属于其中一个回合,请各位小哥哥们注意,课程的标题哦~

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值