【问题标题】:Does Synchronized method synchronized if a Java method is invokded from PLSQL如果从 PLSQL 调用 Java 方法,Synchronized 方法是否同步
【发布时间】:2014-06-23 07:25:37
【问题描述】:

我想知道如果一个方法不是在 Java 线程中调用,而是从另一个线程或语言调用,比如 plsql。

据我所知,plsql没有线程,但它有会话,如果我希望从plsql过程中调用的方法可以同步呢?

我的问题是

  1. 同步关键字是否还能正常工作

  2. 这个调用是否创建了一个 java 线程

  3. 是否同步关键字或其他 Java 并发对象(如 Semaphore、conditionObject)仅在 Java 线程中工作?

pl/sql 的调用是这样的:

language java name 'xxx.xxx.xxx.Engine.execute(
                                java.lang.Integer,
                                java.lang.String,
                                java.sql.Timestamp,
                                java.sql.Timestamp,
                                java.lang.Long,
                                java.lang.Long,
                                java.lang.Long,
                                java.lang.Long,
                                java.lang.Long,
                                java.lang.Long,
                                java.lang.Long,
                                java.lang.Long,
                                java.lang.String,
                        java.lang.Long )';

而execute方法是静态方法。

【问题讨论】:

  • 如何从 plsql 调用 java 代码?请分享一些代码sn-p。给你一个好的答案可能会有所帮助。
  • 我们不能直接调用 java 方法,而是可以从任何 PL/SQL 块、子程序或包中调用 Java 存储过程。
  • 嗨,M.Sharma,“我们不能直接调用 java 方法”是什么意思。你的意思是“execute”方法不是Java方法,而是Java存储过程?

标签: java oracle plsql synchronization synchronized


【解决方案1】:

synchronized关键字还能正常工作吗

如果 PL/SQL 实际上是调用 Java,那么是的,它会调用 synchronized 关键字和块等。但是,我怀疑它在不同的 JVM 中,所以你的 Java 代码中的锁是与被锁定在 PL/SQL 中的不同。如果查看进程列表,您可能会看到两个 JVM 实例正在运行。

对此进行测试的一种方法是调试您的应用程序并在execute(...) 方法中放置一个断点。如果你在断点处停止,那么你在同一个 JVM 中,否则没有。要尝试的另一件事是打印ManagementFactory.getRuntimeMXBean().getName() 的值。如果这与您的 Java 客户端代码不同,那么它就是不同的 JVM。

这个调用是否创建了一个 java 线程

我怀疑是这样。我怀疑您的 ODBC 调用(您正在做什么?)是使用某种网络连接对 Oracle 的远程过程调用。然后 Oracle 服务器内部的一个线程执行,该线程移交给 Java 的东西。我怀疑 Java 正在另一个线程中运行。

要测试正在运行的线程,您可以使用Thread.currentThread().getId()。但是它可能随机相同,因此您还需要比较上面显示的getName() 输出。

synchronized 关键字或其他 Java 并发对象(如 Semaphore、conditionObject)是否仅在 Java 线程中工作?

我不太明白这个问题。除非 Oracle 正在解释 Java 或其他什么,否则没有在 Java 线程中执行 Java 代码是不可能的。

如果您询问您是否在进行 Oracle 数据库调用的同一线程中,那么我对此表示怀疑。看上面。如果您问它是否是同一个 JVM,那么我对此表示怀疑。见上文。

【讨论】:

    猜你喜欢
    • 2012-03-20
    • 2011-08-13
    • 1970-01-01
    • 1970-01-01
    • 2017-09-23
    • 2019-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多