当前位置: 首页 > 面试题库 >

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

沙岳
2023-03-14
问题内容

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

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

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

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

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

我要做的是:

public static synchronized void execute

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

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

惊讶地发现Threadid是1!而且,他们通过睡眠的时间是在同一时间。这是为什么?

我该怎么办才能解决问题?java方法或pl sql是否有锁?

PS:我现在正在尝试使用DMBS_LOCK,它似乎正在工作,但是我仍然希望知道java方法未同步的原因。


问题答案:

我不知道如何在Oracle DB中实现JVM,但是由于(至少在某些通用配置中)每个数据库连接都有其自己的服务器 进程
,因此,如果将单独的JVM嵌入其中的每个JVM ,则将获得一个同步块。你做得很好。您需要使用数据库锁。



 类似资料:
  • 问题内容: 任何人都可以帮我吗:我想从Pl / SQL,Oracle RDBMS调用一个Java程序,以下是设置 Windows 7计算机,Java安装在C:\ Program Files \ Java \ jdk1.7.0_02 我创建了一个目录来保存Java文件。D:\ Java,其中有一个hello.java文件。 可以很好地编译它,并在同一目录中生成.class文件。 由于我必须使用PL

  • 同步调用异步方法最安全的方法是什么?

  • 问题内容: 所以我有一个功能可以检查预订表中有多少取消: 要在SQL中执行他,我使用: 我的结果是: 我的问题是有人可以帮助我在JAVA中调用该函数吗,我尝试过但没有运气。 问题答案: Java提供了这样的目的。 将打印与在pl / sql中相同的内容。根据文档, 创建一个CallableStatement对象以调用数据库存储过程。CallableStatement对象提供了用于设置其IN和OUT

  • 我正试图从同步方法运行异步方法。但是我不能等待异步方法,因为我在同步方法中。我一定不理解TPL,因为这是我第一次使用它。 每个方法都需要前一个方法来完成,因为第一个方法的数据用于第二个方法。 Await运算符只能在异步方法中使用。考虑用'async'修饰符标记此方法,并将其返回类型更改为'task' 但是,如果我使用async修饰符,这将是一个异步操作。因此,如果我对的调用没有使用await运算符

  • 我正在为一家德国公司评估Dart,将各种Java程序移植到Dart,并对结果进行比较和分析。在浏览器中,飞镖轻松获胜。对于服务器来说,软件性能似乎是一个严重的问题(请看我的这个问题),但这基本上得到了缓解。 现在我正在移植一些“简单”的命令行工具,我没想到会有任何严重的问题,但至少有一个问题。一些工具确实会发出HTTP请求来收集一些数据,独立的Dart虚拟机只以异步方式支持它们。纵观所有我能找到的