如果从PLSQL调用Java方法,则Synchronized方法是否同步

时间:2014-06-23 07:25:37

标签: java oracle plsql synchronization synchronized

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

就我而言,plsql没有线程,但它有会话,如果我希望从plsql程序调用的方法可以同步,那该怎么办。

我的问题是

  1. synchronized参数关键字是否仍能正常运行

  2. 此调用是否创建了一个java Thread

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

  4. 来自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方法是静态方法。

1 个答案:

答案 0 :(得分:0)

  

synchronized关键字是否仍能正常运行

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

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

  

这次调用是否创建了一个java Thread

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

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

  

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

我不太明白这个问题。除非Oracle正在解释Java或其他东西,否则无法在Java线程中执行Java代码。

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