Java 刚入职,做数据迁移,之前没接触过,现在有个需求,想了好久还是没有解决,能不能求大佬们帮忙看看,谢谢

2019-06-20 11:26:13 +08:00
 pengyOne

项目要求是这样的:

数据库中有几十个表,现在我要给其中大约一半的表增加两个字段,一个最后修改时间 LAST_CHANGE_TIME 和同步状态 SYNC_STATUS(0 或 1 同步过后变为 1).现在要求这些表每进行插入跟新操作,就同步更新同条记录的最后修改时间 LAST_CHANGE_TIME 和同步状态 SYNC_STATUS 变为 0.

因为这是一个老项目,所以其他部分的增删改查都已经写好了.但公司不让我对原代码进行修改,而且也不能用触发器进行同步的修改操作.这就是我烦躁的原因.

公司给出的方案是用 druid 的 filter 来操作,具体没有写.....

然后我就尝试改写 druid 的 filter 里的 statementExecuteAfter 动态获取表名再进行修改操作,但是操作后发现,这种改写不能动态引入主键 ID 值来针对一条数据(我在外部定义可变 ID 进行修改,然后在重写的方法里引入,然而这个 ID 不管怎么改变,重写的方法里的 ID 都只会是第一个值).废了,不知道有没有大佬知道 druid 有什么针对这种的解决方案.....

也尝试过 AOP 来解决,但是这些包扫描是个大问题,因为这个数据库可能有上百个表,而我这里只要修改不到二分之一的表而已,即使扫描全部,joinpointer 倒是可以获取传入的修改条件即 ID,但我却不知道怎么获取此次操作针对的是哪个表? 所以也陷入僵局...

我很菜,这种需求我各种搜索也没找到解决的方法....求各位大佬帮忙看看怎么解决,给个思路,即使不是 druid 的 fiter 方案也好啊...我快被逼疯了
3650 次点击
所在节点    程序员
32 条回复
pengyOne
2019-06-20 15:04:47 +08:00
@EasyProgramming 应该说是数据同步才是.....现在这个就是同步之前的状态更改问题,每天定时同布
LuVx
2019-06-20 15:05:00 +08:00
@pengyOne 开源版本不支持 oracle, 考虑用 binlog 订阅的话, 尝试 OGG
https://github.com/alibaba/canal
ps. 目前内部版本已经支持 mysql 和 oracle 部分版本的日志解析,当前的 canal 开源版本支持 5.7 及以下的版本(阿里内部 mysql 5.7.13, 5.6.10, mysql 5.5.18 和 5.1.40/48)
pengyOne
2019-06-20 15:12:03 +08:00
@lazyfighter
@LuVx 是的,我这用的是 Oracle......而且这用的是 Spring Data JPA,这好像是基于 hibernate 的吧?这拦截好像也不能用了,也不知道这 JPA 能不能做到拦截
canal 的话,可以操作 Oracle?可以的话,我又得好好研究这新东西了....哭
rqxiao
2019-06-20 15:45:01 +08:00
spingdatajpa 有个 PreUpdateEventListener
rqxiao
2019-06-20 15:46:13 +08:00
@rqxiao hibernate 和 springdatajpa 都可以用这个
endershadow
2019-06-20 15:51:46 +08:00
@pengyOne oracle 的话 用 阿里 的 yugong , 数据库相关找阿里就完事了
endershadow
2019-06-20 15:52:47 +08:00
迁移到 阿里云 rds 一劳永逸
limuyan44
2019-06-21 01:20:16 +08:00
重写 preparedStatement_execute,拿到 statement 还不是随便你怎么写 sql
ricky077
2020-01-09 00:09:16 +08:00
请问最后是怎么解决这个问题的?
pengyOne
2020-01-09 09:07:11 +08:00
@ricky077 继承 FilterEventAdapter,然后重写 connection_prepareStatement,
这个方法带三个参数,connection_prepareStatement(FilterChain chain, ConnectionProxy connection, String sql)
这个 sql 就是 druid 带来的原 sql,用正则表达式识别并修改这个方法的 sql
ricky077
2020-02-07 14:25:10 +08:00
@pengyOne 你这还涉及 DDL 语句的操作么?我也是定时同步,但是每次同步前会检查两边 DDL 是否相同
pengyOne
2020-02-17 10:34:16 +08:00
@ricky077 emmmm,我没有让每次同步的时候都检查 ddl,不需要也太频繁
只在添加新的表同步和修改表同步信息的时候会检查一遍,操作人修改表结构的是注意就好了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/575757

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX