繁体   English   中英

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

[英]Does Synchronized method synchronized if a Java method is invokded from PLSQL

我想知道是否某个方法不是在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方法是静态方法。

同步关键字仍然可以正常工作吗

如果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()输出。

同步关键字或其他Java并发对象(例如Semaphore,conditionObject)仅在Java Thread中起作用吗?

我不太明白这个问题。 除非Oracle正在解释Java或其他内容,否则没有进入Java线程的方法就无法执行Java代码。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM