JAVA 后端程序定时轮询的替代方法

  • 我的后端程序使用 SrpingBoot 2.x,为实现一个业务逻辑,我现在是定时每7秒去查询 MySQL 一个表的数据,有符合条件的则取出来加工
  • 感觉这样太耗费资源,很多时候都是没有有效数据的,但还是要去查询一遍,有没有什么办法能达到这样的效果:MySQL 某个表有新输入插入后能通知到 Java 程序,那么 Java 程序就去查询获得这笔数据进行加工发送给别的需求方
  • 希望提供思路,QQ = 409223171
阅读 7k
4 个回答

这个有一个稍微专业点的词语,叫CDC(Change Data Capture),就是变化数据捕捉,有些数据库是提供了Java的异步非阻塞的API来做数据变化的通知事件,你就可以不用主动去轮询了,比如我之前用过的MongoDB,有个异步client的API包加上它的数据库提供数据变化事件的APIChange Stream(3.6版本以上的MongoDB才有),你就可以实现一个简单的异步监听+业务处理+异常处理

所以你可以找一哈Mysql到底又没有提供类似的API,或者你可以用CDC普遍的方法-就是解析数据库的事务日志,下面是维基百科的关于CDC的方法论里的一种,说得就是这种

clipboard.png

其实去起一个应用来解析数据库里的事务日志,然后把结果发到Kafka(一般都是Kafka,毕竟吞吐量在那)上,你再去消费Kafka上的消息,这种模式,也有很多人写出来了,我之前了解过有Debezium,我记得是可以处理Mysql的,你也可以随便搜Mysql+CDC,都会搜到很多,比如这个mysql-cdc-projects,有人在github上整的可以处理关于MysqlCDC方案合集

clipboard.png

以上,就是我的小建议了。。。希望对你有点帮助o( ̄▽ ̄)d

搞个队列,写数据库时,向队列中写数据。
当队列有数据时,去数据库读数据,做处理。

1、mysql不能主动调用第三方接口,主要还是要通过后端程序去定时轮询;
2、优化的方向是轮询的语句。如果大部分是没有有效数据,是否能通过先select count(*)计算出是否有新插入,再去取出具体记录。

附:

某个表有新输入插入后能通知到 Java 程序

看到这句话,让我想到mysql触发器,虽然不能通知java程序,但能先帮你过滤一遍到新的表

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题