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