gpt4 book ai didi

java - 如何同步 PL/SQL 调用的 java 方法

转载 作者:行者123 更新时间:2023-11-30 03:51:37 25 4
gpt4 key购买 nike

我只是有一个与并发相关的问题,其逻辑流程是当客户端(称为Oracle Forms)提交请求(称为并发程序)并调用plsql过程时,该过程最终将调用java静态方法。

我发现,当我同时或在很短的时间间隔(例如1秒)内提交两个请求时,会注意到一些并发问题。

java 方法是从数据库中搜索建议应将哪些记录插入数据库的操作的起点。

问题是,它们会导致重复的结果,因为当我查询时,两个请求都发现插入新记录很好。

我尝试在静态java方法中添加synchronized,但这并不能解决这个问题,为什么?

我所做的是:

public static synchronized void execute

请注意,插入将在plsql中调用,这意味着如果仅同步java方法,我做的同步是不够的。但是当我查看日志时,它显示两个请求在同一秒内运行,我认为这是不正常的!因为查询数据库并执行建议非常耗时。

为了使 java 方法真正耗时,我添加了一个代码调用 Thread.sleep(5000),并在该代码之后记录时间并记录线程 id。

惊讶地发现Thread id 是 1!而且,他们 sleep 的时间也是在同一时间。这是为什么?

我可以做什么来解决这个问题? java方法或pl sql上有锁吗?

PS:我现在正在尝试使用DMBS_LOCK,这似乎有效,但我仍然希望知道java方法不同步的原因。

最佳答案

我不知道 Oracle DB 内的 JVM 是如何实现的,但由于(至少在一些常见配置中)每个数据库连接都有自己的服务器进程,那么如果嵌入一个单独的 JVM对于其中每一个,同步块(synchronized block)都不会给你带来多大好处。您需要使用数据库锁。

关于java - 如何同步 PL/SQL 调用的 java 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24302726/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com