问题描述
- ORACLE获取结果集的同时更新数据,该如何实现
-
公司现有的一个项目,数据都存在ORACLE里面的,其中一个表是存储流水信息的,由一个程序负责写入数据另一个程序进行读取并更新状态,现在需要提高读取速度,拟将读取改成多线程的读取,该如何处理?
为确保效率和避免重复读取,我考虑了以下方案:
1.通过package实现返回结果集,并把这些结果集的记录直接记为已读取:这样操作使整个读取只需更新一次状态,但实现时发现,采用游标读取了这些记录后,再根据游标对这些数据的状态进行更新会导致游标移动到结果集末端,读取不出数据;
2.使用一个随机状态值作为待取状态,用函数或存储过程通过游标读取待取状态的数据,读取成功后,更新这些数据状态为已读取:这样操作比上一个方案多了一倍的更新操作和一个确认随机状态值不在表中的操作,流程明晰,但比较占用资源。
个人对ORACLE了解不深,对于这样的需要频繁读写和更新状态的数据库操作,如何处理才比较恰当?我设想的方案1是否无法实现,方案2可以改进吗?
解决方案
一般多个批量线程直接没有显著的性能差别,所以只要把数据等分分配就可以了。
只要有一个自增的ID,把ID以进程数m进行取模,按余数分配给每个进程就不会产生冲突了。
其实每个进程只要取得各自起始的ID,每步循环+m就是下条记录的ID,直接用ID取数/设标记。
解决方案二:
你的需求多线程只会添乱,要提高读取效率 除了优化查询sql增加索引外 你可以把你的业务流程拆开
一个线程只负责读取数据 读完就放入队列里,对数据的处理个更新都放在另外一个线程里
时间: 2024-10-29 23:21:20