Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何解决Oracle中大量的并发写操作?_Java_Oracle_Concurrency_Transactions_Real Time - Fatal编程技术网

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

Java 如何解决Oracle中大量的并发写操作?,java,oracle,concurrency,transactions,real-time,Java,Oracle,Concurrency,Transactions,Real Time,我正在维护一个拥有数百万用户的彩票网站。一些活跃用户(可能超过30000)会在1秒内购买1000多张彩票。 现在,当前逻辑使用select。。。。更新以确保帐户平衡,但同时数据库服务器过载且处理速度非常慢?我们必须实时处理它们 以前有人见过类似的场景吗?我个人会锁定/更新内存中的帐户,并作为后台任务更新数据库。使用这种方法,您可以轻松支持数千个更新和帐户。A.在不修改代码的情况下加快速度: 1-您可以将表完全保留在内存中(即SGA-因为它也在磁盘上): (在执行此操作之前,请与dba讨论) 2-

我正在维护一个拥有数百万用户的彩票网站。一些活跃用户(可能超过30000)会在1秒内购买1000多张彩票。 现在,当前逻辑使用select。。。。更新以确保帐户平衡,但同时数据库服务器过载且处理速度非常慢?我们必须实时处理它们


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

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

A.在不修改代码的情况下加快速度:

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

(在执行此操作之前,请与dba讨论)

2-如果表太大,并且您一次又一次地更新相同的行,那么使用cache属性可能就足够了:

    alter table t cache
此命令在LRU列表中以最佳优先级使用表中的块时,将它们放入表中,因此从SGA老化的可能性较小。 以下是关于差异的讨论:

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

B.加快数据库操作速度:

确定最常见的问题和:

  • 创建只更新或选择一行或一小部分行的索引
  • 分区只扫描一段数据的大型表

您确定了顶级查询了吗?

首先,您需要设计一个满足业务规则的事务系统。现在,忘掉磁盘和内存,忘记什么会去哪里。尝试设计一个尽可能轻量级的系统,该系统可以实现所需的最低锁定量,满足您的业务规则

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

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

完成所有这些之后,如果您仍然有问题,请在这里提出一个新问题,我相信我们可以帮助您解释OraSRP的输出,帮助您了解瓶颈所在


希望能有所帮助。

谢谢您的回复。但是数据是非常重要的,你知道这个表包含了用户的钱账户。所以用户希望实时检查他们的帐户。如果帐户在内存中,您的检查将是实时的。主要问题是确保信息不会在故障时丢失。大多数真实磁盘仅支持每秒100 IOPS。您必须在某个级别缓存数据以支持此更新速率。您可能只需要使用SSD,因为它可以支持每秒更多的IOPS。谢谢兄弟,1。我想确定内存中的数据库是否能够确保业务事务数据的可靠性和一致性?2.如何将数据从内存数据库同步到磁盘数据库?我应该对当前的逻辑进行一些更改吗?将表完全保存在SGA中不需要任何代码,不需要像sincronyze、refresh和其他东西那样。对于程序员来说,这是绝对透明的。Oracle将确保磁盘上的所有数据都是安全的。请记住:当您查询DML时,Oracle总是会修改内存中的数据(SGA),而其他Oracle进程会将数据写入磁盘。在我们的例子中,没有什么不同于这个观点。您只需要与DBA讨论,以确保SGA和任何其他DBA相关的内容中有足够的空间。将表分配给keep buffer pool确实是DBA应该做的事情,因为keep pool的大小也可能需要调整。至于“cache”属性,我认为它并不像您认为的那样。如果一个表被设置为“缓存”,那么发生完全表扫描操作时,唯一改变的是LRU上块的行为!如果您仅通过索引访问表的块,“cache”属性将不会有任何区别!我说必须和DBA讨论保留缓冲池的想法,我不理解你的抱怨。现金属性建议使用“如果”。如果块在内存中,即使您通过索引访问它们,日期也会更快,因为您仍然需要读取表块(只有在查询列被索引时才有区别)。我认为您应该更简要地解释一下。您是否可以量化过载,您需要调查瓶颈在哪里,磁盘/闩锁争用/cpu等,如果你想解决你的问题。非常感谢,我会试试这种方法。
    alter table t cache