如何在Oracle中解决大量并发写操作?

时间:2011-11-17 07:30:20

标签: java oracle concurrency transactions real-time

我正在维护一个拥有超过数百万用户的彩票网站。一些活跃用户(可能超过30,000)将在1秒内购买超过1000个彩票。 现在当前的逻辑使用select ....进行更新以确保帐户余额,但同时数据库服务器过载并且处理速度很慢?我们必须实时处理它们。

以前有没有人见过类似的场景?

3 个答案:

答案 0 :(得分:5)

首先,您需要设计一个满足业务规则的事务系统。暂时忘记磁盘和内存,以及发生了什么。尝试设计一个尽可能轻量级的系统,它可以满足您的业务规则所需的最小锁定量。

现在,运行系统,会发生什么?如果表现可以接受,恭喜你,你已经完成了。

如果性能不可接受,避免猜测问题的诱惑,并开始进行调整。您需要分析系统。您需要了解花费最多时间的地方,以便了解调整工作的重点领域。最简单的方法是使用SQL_TRACE跟踪它。您没有提及Oracle版本,版本或平台。所以,我假设你至少在某个版本的10gR2上。因此,使用DBMS_MONITOR来开始/结束跟踪。现在,范围界定在这里很重要。我的意思是,启动跟踪,运行要分析的代码然后立即关闭跟踪非常重要。这样,您只跟踪您感兴趣的内容,并且配置文件不会包含任何无关的信息。获得跟踪文件后,需要对其进行处理。有几种工具。最常见的是TkProf,它由Oracle提供,但实际上并没有做得很好。我所知道的最好的免费分析器是OraSRP。下载OraSRP的副本,并检查您的结果。报告中的数据应指向正确的方向。

完成所有这些后,如果您仍有疑问,请在此处提出新问题,我相信我们可以帮助您解释OraSRP的输出,以帮助您了解瓶颈所在。

希望有所帮助。

答案 1 :(得分:2)

就个人而言,我会锁定/更新内存中的帐户并将数据库更新为后台任务。使用此方法,您可以轻松支持数千个更新和帐户。

答案 2 :(得分:2)

:一种。无需修改代码即可加快速度:

1 - 您可以将表完全保留在内存中(即SGA - 因为它也在磁盘上):

    alter table t storage ( buffer_pool keep )

(在做之前与你的dba讨论)

2 - 如果表格太大并且您反复更新相同的行,可能只需使用缓存属性即可:

    alter table t cache

此命令在LRU列表中以最佳优先级使用时放置表的块,因此从SGA中老化的机会较少。 这是对差异的一种解释:ask tom

3 - 另一个需要更多分析和资源的高级解决方案是TimesTen

B.加快数据库操作:

识别顶级查询并:

  • 创建您更新的索引或仅选择一行或一小组行。
  • 对仅扫描一段数据的大型表进行分区。

您是否确定了一个热门查询?