我只是有一个与并发相关的问题,其逻辑流程是当客户端(称为Oracle Forms)提交请求(称为并发程序)并调用plsql过程时,该过程最终将调用java静态方法。
我发现,当我同时或在很短的时间间隔(例如1秒)内提交两个请求时,会注意到一些并发问题。
java 方法是执行从数据库搜索建议应将哪些记录插入数据库的操作的起点。
问题是,它们会导致重复的结果,因为当我查询时,两个请求都发现插入新记录很好。
我尝试添加synchronized
在静态java方法中,但这并不能解决这个问题,为什么?
我所做的是:
public static synchronized void execute
请注意,插入将在plsql中调用,这意味着如果仅同步java方法,我做的同步是不够的。但是当我查看日志时,它显示两个请求在同一秒内运行,我认为这是不正常的!因为查询数据库并执行建议非常耗时。
为了使java方法真正耗时,我添加了代码调用Thread.sleep(5000)
,并记录此代码之后的时间并记录线程 ID。
惊讶地发现Thread
id是1!而且,他们睡觉的时间也是在同一时间。这是为什么?
我可以做什么来解决这个问题? java方法或pl sql上有锁吗?
PS:我现在正在尝试使用DMBS_LOCK
,这似乎有效,但我仍然希望知道 java 方法不同步的原因。