请教各位,关于企业应用中大数据量事务性业务的技术方案

王树兵 发布于 2012/02/19 22:25
阅读 1K+
收藏 6

【Gopher China万字分享】华为云的Go语言云原生实战经验!>>>

各位好,

       遇到一个技术性问题,希望大家支支招,给些建议。

       我把业务需求简化一下:A表(主表),A1表(A表的子表),B表。

数据量:A 千万级 

            A1 (子表A1中1万~10万条记录对应一条A记录)

            B表 千万级

业务: 针对1条A的记录,检查对应子表A1的记录(好几万条),是否在B中存在,如果B中都不存在,则插入到B中,同时修改A1记录的状态,全部插入后修改A记录的状态。如果发现B中存在A1的记录,则回滚业务。

当前情况:oracle10g,单库,单表,java,ejb3实现上述业务,速度非常慢(几十分钟),用户难以接受。

当前考虑:分布式方案1 ,因为是企业业务流程中关键业务,因此对于CAP原理中一定要确保一致性,另外也可以考虑异步机制。

希望处理大数据量业务有经验的朋友给出一些切实的办法或者方案,谢谢!

 

加载中
0
红薯
凤舞凰扬
凤舞凰扬
已回复,在后方
0
王树兵
王树兵

诚挚邀请 @凤舞凰扬 把脉诊治开方...

0
dy810810
dy810810

路过,学习一下。

或许 @宏哥 会有高见。

0
宏哥
宏哥

和ejb,java没有什么关系

直接在begin commint直接做所有操作即可

0
黄龍
黄龍

1.建索引

2.SQL语句优化

3.流程优化(尽量把不需要的数据库操作排除)

4.调整系统及硬件(内存分配,硬盘I/O)等.....

不过说实在的,我也没有对这么数据量这么大的业务进行过处理,所以也不知道能不能帮到你 : )

0
王树兵
王树兵
没人支招,那我先抛砖吧,办法1: 对B表拆分,按照记录数拆分成若干表(比如100~300万/表),然后分布在不同分区,希望采用硬件性能提升计算速度,应用层面,需要对每个拆分表做相同逻辑判断,计算量也蛮大的,不知是否可行。办法2 ,对B表做缓存,缓存和B表必须同步,校验缓存的数据, 插入db,db需要和缓存同步,这过程还是比较纠结, 办法3 :B表读写分离  ,但是速度不会加快,办法4 ,异步 ,增加中间状态,引入MQ机制,让前端有个中间结果,不必等待,计算完后再通知用户。 欢迎大家来讨论
凤舞凰扬
凤舞凰扬
如果可以拆表,那么这一定是首选项。至少要根据数据的时效性将数据表分为历史表和操作表。
0
王树兵
王树兵

引用来自“宏哥”的答案

和ejb,java没有什么关系

直接在begin commint直接做所有操作即可

宏哥的意思是用存储过程实现,是吧,这倒是个办法,可以试一下。
0
王树兵
王树兵

引用来自“HL_Simon”的答案

1.建索引

2.SQL语句优化

3.流程优化(尽量把不需要的数据库操作排除)

4.调整系统及硬件(内存分配,硬盘I/O)等.....

不过说实在的,我也没有对这么数据量这么大的业务进行过处理,所以也不知道能不能帮到你 : )

真实的业务要比我描述的还要复杂一些,不过很类似。

索引不知该加不该加,很纠结,毕竟一次操作插入可是几万记录。

0
宏哥
宏哥

引用来自“王树兵”的答案

引用来自“宏哥”的答案

和ejb,java没有什么关系

直接在begin commint直接做所有操作即可

宏哥的意思是用存储过程实现,是吧,这倒是个办法,可以试一下。

这里提到的 就是简单的集合差操作和事务操作,本来就是数据库最在行的东西.

任何能连接到数据库的语言都可以做

是不是存储过程都无所谓,程序里面一样可以begin 到 commit

0
szf
szf

我认为应该把A1变化时的记录放到变动表(C)中(事务1),处理例程应该是"扫描表C,判断B表,修改A表,删除C表" (这些操作作为一个事务2),这样处理,记录数量级上远远小于原方式。

再解决下两个事务并发时可能发生的死锁(这是另一个技术问题)

返回顶部
顶部