青年IT男

个人从事金融行业,就职过易极付、思建科技、某网约车平台等重庆一流技术团队,目前就职于某银行负责统一支付系统建设。自身对金融行业有强烈的爱好。同时也实践大数据、数据存储、自动化集成和部署、分布式微服务、响应式编程、人工智能等领域。同时也热衷于技术分享创立公众号和博客站点对知识体系进行分享。微信公众号:青年IT男。

mybatis操作数据库异步化

mybatis操作数据库异步化

简介

zebra-dao是在mybatis基础上进一步封装的异步数据源,同时它也支持分页功能。它的产生背景是公司要求服务完全异步化,一个服务可能包括RPC调用请求、MemCached请求、KV存储请求以及MySQL数据库调用,目前其它三种请求的组件都有异步化的接口,但是数据库调用并没有。所以,在这个情况下,开发了这个异步化的DAO。目前,大众点评内部已有多个业务接入使用,已经接受了线上环境的验证和考验。

主要功能

  1. 支持CallbackFuture两种异步化方式
  2. 支持分页功能
  3. 其他功能的使用方式和mybatis一致

准备工作

下载源代码和编译

配置pom,引入zebra-dao。自行添加Spring,Mybatis以及Mybatis-Spring相关依赖。

在spring的appcontext-dao.xml文件中配置一个如下的bean。因为zebra-dao背后异步的实现方式,是使用线程池执行的方式的,所以需要在这里设置线程池的大小。该部分配置与原生的mybatis有差异,也是唯一差异的地方。

如何使用

Callback for Asynchronous API

1.举例来说,在UserMapper中,有一个同步方法findUserById,如果想要有异步的通过回调方式的接口,则可以增加一个相同方法名,并且参数列表中多一个AsyncDaoCallback的参数的方法。

2.在业务代码中使用UserMapper时,需要在调用时实现自己的AsyncDaoCallback,例如:

3.需要注意的是,必须要同时定义同步和异步的方法,方法名和异步方法扣除回调参数的其他参数都要相同。如果异步的方法想要定义一个和同步方法名不一样的名字,需要使用TargetMethod这个annotation指定所需要的同步方法是哪个。举例来说:

Future for Asynchronous API

1.举例来说,在UserMapper中,有一个同步方法getAll,如果想要有异步的通过Future方式的接口,则可以增加一个方法,并使用@TargetMethod指定新方法需要对应到哪一个同步方法。

2.在业务代码中使用UserMapper时,需要通过Future接口获取到返回值,例如:

分页功能

逻辑分页

逻辑分页是指将数据库中的所有数据取出,然后通过Java代码控制分页。一般是通过JDBC协议中定位游标的位置进行操作的,使用absolute方法。MyBatis中原生也是通过这种方式进行分页的。下面举例说明:

在HeartbeatMapper.xml中

在HeartbeatMapper.java中,使用RowBounds中定义分页的offsetlimit

物理分页

物理分页指的是在SQL查询过程中实现分页,依托与不同的数据库厂商,实现也会不同。zebra-dao扩展了一个拦截器,实现了改写SQL达到了物理分页的功能。下面举例说明如何使用:

1.修改Spring的配置中的sqlSessionFactory,添加configLocation

2.增加mybatis-configuration.xml文件,目前zebra-dao只实现了MySQLDialect。

如此配置后,所有的分页查询都变成物理分页了。

高级物理分页

zebra-dao支持在一个dao调用中同时获得总条数和数据。举例来说: 在HeartbeatMapper.xml中:

HeartbeatMapper.java中,可以使用PageModel定义pagepageNum,同时使用这个对象就可以获得recordCount(总数)和records(结果数据)。注意的是,这个功能必须要配置过物理分页才能支持。

注意这里没有任何返回值,返回的值在PageModel对象里面。一旦使用了PageModel的方式,必须是配置了物理分页,并且方法的返回值必须为void

分页功能的异步支持

1.使用RowBounds的方式,对于回调和Future都支持。

2.使用PageModel的方式,仅仅支持回调的方式,不支持Future的方式。在回调方式使用中,回调方法onSuccess中传入的PageModel并不是结果,结果在调用dao时传入的model中。

Git地址:https://github.com/ainilife/zebra-dao.git

0
青年IT男

个人从事金融行业,就职过易极付、思建科技等重庆一流技术团队,目前就职于某网约车平台负责整个支付系统建设。自身对金融行业有强烈的爱好。同时也实践大数据、数据存储、自动化集成和部署、分布式微服务、响应式编程、人工智能等领域。

You must be logged in to post a comment

This site is protected by wp-copyrightpro.com