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

我只是有一个与并发有关的问题,它的逻辑流程是当客户端(称为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中,则将获得一个同步块.你做得很好.您需要使用数据库锁.

上一篇:小批量excel数据导入oracle


下一篇:python-从SQLAlchemy执行PL / SQL函数(或过程)