我想知道如果一个方法没有在Java线程中调用,而是从另一个线程或语言调用,比如说plsql。
就我而言,plsql没有线程,但它有会话,如果我希望从plsql程序调用的方法可以同步,那该怎么办。
我的问题是
synchronized参数关键字是否仍能正常运行
此调用是否创建了一个java Thread
synchronized关键字或其他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方法是静态方法。
答案 0 :(得分:0)
synchronized关键字是否仍能正常运行
如果PL / SQL实际调用Java然后是,它会调用synchronized
关键字和块等。但是,我怀疑它是在不同的JVM中所以你的Java中的锁代码与PL / SQL中锁定的代码不同。如果查看进程列表,可能会看到两个JVM实例正在运行。
测试此方法的一种方法是调试应用程序并在execute(...)
方法中放置断点。如果你在断点处停止,那么你在同一个JVM中,否则就没有。另一件要尝试的是打印ManagementFactory.getRuntimeMXBean().getName()
的值。如果这与您的Java客户端代码不同,则它是一个不同的JVM。
我怀疑是这样的。我怀疑你的ODBC调用(你正在做什么?)是使用某种网络连接对Oracle进行远程过程调用。然后,Oracle服务器内部的一个线程执行,转移到Java的东西。我怀疑Java正在另一个线程中运行。这次调用是否创建了一个java Thread
要测试正在运行的线程,可以使用Thread.currentThread().getId()
。它可能随机相同,因此您还需要比较上面显示的getName()
输出。
synchronized关键字或其他Java并发对象(如Semaphore,conditionObject)是否仅在Java线程中工作?
我不太明白这个问题。除非Oracle正在解释Java或其他东西,否则无法在Java线程中执行Java代码。
如果您在询问您是否在进行Oracle数据库调用的同一个线程中,那么我对此表示怀疑。往上看。如果你问它是否是同一个JVM,那么我对此表示怀疑。见上文。