我只是有一个与并发有关的问题,它的逻辑流程是当客户端(称为Oracle Forms)提交请求(称为并发程序)并调用plsql过程时,该过程最终将调用java静态方法。
我发现,当我同时或在很短的间隔(例如1秒)内提交两个请求时,会发现一些并发问题。
java方法是从数据库中搜索建议将哪些记录插入数据库的操作的起点。
问题是,它们将导致重复的结果,因为当我查询时,两个请求都认为插入新记录很好。
我尝试synchronized在静态java方法中添加,但这不能解决此问题,为什么?
synchronized
我要做的是:
public static synchronized void execute
请注意,将在plsql中调用insert,这意味着如果仅同步java方法,我将无法进行足够的同步。但是当我查看日志时,它显示两个请求在同一秒内运行,我认为这是不正常的!因为查询数据库和执行建议非常耗时。
为了使java方法真正耗时,我添加了一个代码调用Thread.sleep(5000),并在此代码之后记录时间并记录线程ID。
Thread.sleep(5000)
惊讶地发现Threadid是1!而且,他们通过睡眠的时间是在同一时间。这是为什么?
Thread
我该怎么办才能解决问题?java方法或pl sql是否有锁?
PS:我现在正在尝试使用DMBS_LOCK,它似乎正在工作,但是我仍然希望知道java方法未同步的原因。
DMBS_LOCK
我不知道如何在Oracle DB中实现JVM,但是由于(至少在某些通用配置中)每个数据库连接都有其自己的服务器 进程 ,因此,如果将单独的JVM嵌入其中的每个JVM 中 ,则将获得一个同步块。你做得很好。您需要使用数据库锁。