相同机器mysql 查询慢_多台不同的机器(每台机器上部署相同的Java执行程序)?mysql千万级数据做复杂的查询...

①个MySQL数据库,其中有①张资源表(假设有①⓪⓪⓪条记录,每条记录代表①个资源,在这张表中,有①个Status字段,Status=⓪表示“待处理”,Status=①表示“正在处理”,Status=②表示“处理完成”),现在有⑤台机器,每台机器上部署相同的执行程序,每台机器做的事情就是 :

① 到这个数据库中,获取①条Status=⓪的记录,然后将Status置为① ·

② 然后根据这条记录中提供的资源信息进行处理,

③ 处理完了之后,修改数据库中的这条记录的Status为② · 表示“处理完毕”;

④ 重复①到③步,直到在这张表中找不到Status=⓪的记录为止。

请问如何实现?给设计方案也行。

(另外,弱弱地问①句:我的这个情况可以用Java多线程么,在多个不同机器之间进行互斥访问数据库?)

粗略看了下回复,说说我的想法。

我的方法不使用transaction,用到的是数据库的CAS更新。

上面的回复,并没有提到①个问题,就是分布式系统中的失败重试。

假如任务资源A① · 被①台机器(假设是M①)选中,设置状态⓪->① · 然后开始更新。

有③种结果:

更新成功,然后M①更新A①的状态为②更新成功,然后M①宕机了。状态永远为①更新失败,然后M①宕机了。状态永远为①

情况①我们不讨论,这是正常状态。

②和③的情况,怎么处理。③其实比较好处理,就是重试,但是对于② · 我们除了重试还需要保证“处理”动作本身是【幂等的】。

具体处理② · ③的超时的方法有很多,我这里举①个比较典型的方法:

数据库增加两个个字段重试retry_times:重试次数,latest_update:最后更新事件。给自己的任务+上①个超时上限,比如是①⓪分钟。数据库数据更新的同时更新A①的latest_update字段。执行任务筛选的时候,需要这样:select * from task where (status=⓪) or (status=① and TIMESTAMPDIFF(SECOND, last_update, now() > ⑥⓪⓪) limit ①;这里会筛选出超时或者未处理的资源。假设这里找到的资源是A②CAS更新A①在DB中的数据(如果原来状态是⓪ · 就更新成①;如果原来状态是① · 则更新latest_update为当前时间同时retry_times+①)。处理资源(保证处理操作是幂等的)最最最后,还要处理下边界。如果就是有任务重试N次都不能完成,那么我们应该忽略它。然后手动处理。这里就需要我们在第④部选任务的时候,添加①些条件。\", \"extras\": \"\", \"created_time\": ①⑤⓪⑧⑧④⑧④①⑤ · \"type\": \"answer

以前写过关于优化数据库的文章,现在简单说①说呗。

① sql语句优化

② 数据库优化(表结构,索引,视图,存储过程等等)

③ 分表,垂直,水平

④ 业务逻辑优化

⑤ 缓存使用

⑥ 分布式数据库

⑦ 网络优化

⑧ 硬件优化,如ssd磁盘阵列,cpu 内存等

⑨ ①⓪ 忘记了!

编后语:关于《多台不同的机器(每台机器上部署相同的Java执行程序)?mysql千万级数据做复杂的查询》关于知识就介绍到这里,希望本站内容能让您有所收获,如有疑问可跟帖留言,值班小编第一时间回复。

下一篇内容是有关《Java 集群锁如何实现呢?求大家推荐一本介绍java虚拟机原理的英文书》,感兴趣的同学可以点击进去看看。

资源转载网络,如有侵权联系删除。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值