【问题标题】:How to achieve Multiple Consumer Application for Shared Database (Multitenancy)?如何实现共享数据库的多消费者应用(多租户)?
【发布时间】:2014-07-17 17:46:03
【问题描述】:

Snapshot下方是当前application flow.

当前流向

user Logged 在这些multiple deployments 中时,则相应的SMSAgent(java class) insert user info in databaseSMSHelper 是一个java Scheduler,它从其本地队列中的数据库中读取数据,send SMS 然后update user status in database.

此流程存在问题

现在,在上述场景中,Multiple SMS is getting send to Single User 因为数据库是通用的,通知助手都从数据库中获取联系方式(可能是通用的)并向该用户发送短信。

现有解决方案

目前,此问题的解决方案仅在 oracle 11g 中可用,其中选择查询具有更新跳过锁定支持。

期待

如何在应用程序级别而不是查询级别对所有数据库实现相同的目标?

【问题讨论】:

  • 您可以添加一个额外的列来指示已发送短信,这样如果 onc 助手类发送短信,它将更新该列,然后其他助手类可以在发送短信之前检查该列
  • @coreJavare 我想你还没有读过那个助手更新数据库中的用户状态。
  • SMSHelper 应检查已发送标志“就在之前”发送短信的状态,以免发送其他短信
  • @Mat 谢谢,现在还好吗。
  • @coreJavare 假设两个助手同时检查状态,那么在这种情况下也会发送多条短信。

标签: java database multithreading oracle11g multi-tenant


【解决方案1】:

首先,您必须通过更新RESERVE该行,然后进行选择。

假设你有 200 行,

所以首先你应该做的是 RESERVE 通过一些实例唯一的值,你也可以限制查询中更新的行数,然后选择查询保留的行

UPDATE TABLE_NAME SET SERVER_INSTACE_ID=UNIQUE_VAL AND ROWNUM

SELECT * FROM TABLE_NAME WHERE SERVER_INSTANCE_ID=UNIQUE_VAL

通过这种方式,你不需要获取行或表的锁。

【讨论】:

    猜你喜欢
    • 2018-06-13
    • 2011-03-22
    • 2014-03-21
    • 1970-01-01
    • 2014-01-16
    • 2011-10-06
    • 2018-07-13
    • 2012-12-14
    • 2019-08-18
    相关资源
    最近更新 更多