Я задавался вопросом, что если метод не вызывается в Java-потоке, а из другого потока или языка, скажем, plsql.
Насколько мне известно, plsql не имеет потока, но имеет сеанс, что, если я надеюсь, что метод, вызываемый из процедуры plsql, может быть синхронизирован.
Мой вопрос:
Сохраняет ли синхронизированное ключевое слово
Создает ли это вызов java Thread
Является ли синхронизированное ключевое слово или другой объект параллелизма 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 Thread
Я подозреваю. Я подозреваю, что ваш вызов ODBC (это то, что вы делаете?) Является удаленным вызовом процедур в Oracle, используя какое-то сетевое соединение. Затем поток внутри сервера Oracle выполняет какие-то действия на Java. Я подозреваю, что Java работает в еще одном потоке.
Чтобы проверить запущенный поток, вы можете использовать Thread.currentThread().getId()
. Это может быть одно и то же случайным образом, поэтому вам также потребуется сравнить getName()
показанный выше.
Является ли синхронизированное ключевое слово или другой объект параллелизма Java (например, Semaphore, conditionObject) только работающим в Java-потоке?
Я не совсем понимаю этот вопрос. Невозможно выполнить Java-код, не будучи в потоке Java, если Oracle не интерпретирует Java или что-то еще.
Если вы спрашиваете, находитесь ли вы в одной теме, которая вызвала вызов базы данных Oracle, я сомневаюсь. См. Выше. Если вы спрашиваете, является ли это тем же JVM, то я сомневаюсь в этом. См. Выше.