Синхронизируется ли синхронизированный метод, если метод Java вызывается из PLSQL

1

Я задавался вопросом, что если метод не вызывается в Java-потоке, а из другого потока или языка, скажем, plsql.

Насколько мне известно, plsql не имеет потока, но имеет сеанс, что, если я надеюсь, что метод, вызываемый из процедуры plsql, может быть синхронизирован.

Мой вопрос:

  1. Сохраняет ли синхронизированное ключевое слово

  2. Создает ли это вызов java Thread

  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 является статическим методом.

  • 1
    Как вы можете вызвать Java-код из plsql? Пожалуйста, поделитесь фрагментом кода. Это, вероятно, поможет дать вам хороший ответ.
  • 0
    Мы не можем вызвать метод Java напрямую, вместо этого мы можем вызвать хранимые процедуры Java из любого блока PL / SQL, подпрограммы или пакета.
Показать ещё 1 комментарий
Теги:
plsql
synchronization
synchronized

1 ответ

0

Сохраняет ли синхронизированное ключевое слово

Если 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, то я сомневаюсь в этом. См. Выше.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню