JVM аварийно завершает работу при попытке подключиться к Oracle с помощью OCI

У меня три машины настроены следующим образом:

  • CompA: Запуск Oracle server 10.2.0.3
  • CompB: Запуск сервера Oracle 10.2.0.4 и моего клиентского кода
  • CompC: запуск только клиентского кода

В клиентском коде как на CompB, так и на CompC подключение к любой базе данных Oracle работает безупречно с использованием драйвера Thin.

Я пытаюсь подключиться к каждой базе данных Oracle из клиентского кода через драйвер OCI, используя

Connection conn = DriverManager.getConnection('jdbc:oracle:oci:username/pass@sid');

Изнутри класса Java, работающего в jboss. Это отлично работает на CompB, но заставляет JVM запускать Jboss в дамп ядра каждый раз на CompC.

CompC может подключаться к обоим серверам Oracle с помощью Sql * Plus и того же файла tnsnames.ora, на который пытается сослаться jboss.

Вот часть трассировки стека. Кажется, что каждый раз это происходит последовательно.

Stack: [0x30fcc000,0x3101d000),  sp=0x3101a868,  free space=314k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
V  [libjvm.so+0x2d02d6]
C  [libocijdbc10.so+0x585c]
C  [libocijdbc10.so+0x70a8]  Java_oracle_jdbc_driver_T2CConnection_t2cCreateState+0x15c
j  oracle.jdbc.driver.T2CConnection.t2cCreateState([BI[BI[BI[BISI[S[B[B)I+0
j  oracle.jdbc.driver.T2CConnection.logon()V+551
j  oracle.jdbc.driver.PhysicalConnection.(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Properties;Loracle/jdbc/driver/OracleDriverExtension;)V+381
j  oracle.jdbc.driver.T2CConnection.(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Properties;Loracle/jdbc/driver/OracleDriverExtension;)V+10
j  oracle.jdbc.driver.T2CDriverExtension.getConnection(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Properties;)Ljava/sql/Connection;+67
j  oracle.jdbc.driver.OracleDriver.connect(Ljava/lang/String;Ljava/util/Properties;)Ljava/sql/Connection;+831
j  java.sql.DriverManager.getConnection(Ljava/lang/String;Ljava/util/Properties;Ljava/lang/ClassLoader;)Ljava/sql/Connection;+210
j  java.sql.DriverManager.getConnection(Ljava/lang/String;)Ljava/sql/Connection;+15

Кто-нибудь знает, что здесь не так?

ОБНОВЛЕНИЕ: для пояснения, термин «клиент», используемый выше, относится к моему Java-коду, работающему в экземпляре jboss. Единственные библиотеки Oracle, которые должны быть найдены в LD_LIBRARY_PATH, с которым запускается jboss, - это libocijdbc10.so libclntsh.so.10.1 и libnnz10.so. Эти три библиотеки и сам сервер jboss находятся в системе контроля версий, поэтому они имеют одинаковые версии как на CompB, так и на CompC.

CompB может подключаться, используя OCI и thin, как к CompA, так и к CompB. CompC не может подключиться с помощью OCI, но может подключиться с помощью тонкого интерфейса как к CompA, так и к CompB, поэтому это не должно быть проблемой версии сервера.

И CompB, и CompC работают под управлением 32-разрядной версии Ubuntu 8.04, хотя CompC имеет немного более медленный процессор и всего 1 ГБ ОЗУ по сравнению с 3,25 ГБ ОЗУ на CompB.


person Ryan Ahearn    schedule 24.03.2009    source источник


Ответы (2)


Я только что закончил смотреть серию Хауса, так что давайте попробуем провести дифференциальный диагноз. Вы знаете, что он работает с тонким драйвером на обеих машинах, но срок его действия истекает в коде JBoss. Вы не говорите наверняка (клиент не очень определен), но похоже, что у вас есть экземпляр JBoss на CompB и на CompC, и ваш код успешно работает, когда он запускается в экземпляре JBoss на CompB, но дамп ядра из CompC .

Из настройки я делаю вывод, что когда вы работаете на CompB, вы общаетесь с экземпляром Oracle на CompB. Вы пробовали запускать код на CompB, но разговаривали с CompA? Вы пробовали запускать код на CompC, но разговаривали с Oracle на CompB?

Фактические ошибки указывают на ошибку, происходящую в машинном коде в модуле dynlib libocijdbc10.so, и мы знаем, что у вас есть разные версии материалов Oracle на CompA и CompB. Итак, у меня первое подозрение, что у вас есть несовместимые версии libocijdbc10.so на двух машинах. Я заметил, что у вас другая версия Oracle на CompA и CompB. Я предсказываю, что код на CompB, разговаривающий с оракулом CompA, выйдет из строя, и что код на CompC, разговаривающий с CompB, будет работать.

Вы хотите проверить версии программного обеспечения драйвера Oracle OCI на CompB и CompC.

Обновлять

Хорошо, вы говорите:

CompB может подключаться, используя OCI и thin, как к CompA, так и к CompB. CompC не может подключиться с помощью OCI, но может подключиться с помощью тонкого интерфейса как к CompA, так и к CompB, поэтому это не должно быть проблемой версии сервера.

Итак, вы сузили круг вопросов. Три метода подключения (Thin, SQL * Plus и OCI) и три сервера, и единственный, который не работает, - это использование OCI от CompC; который не может связаться ни с CompA, ни с CompB.

Из этого следует, что проблема связана с конфигурацией CompC JBoss. Он по-прежнему не работает в поставляемом Oracle драйвере; поскольку один и тот же код работает против CompA и CompB при работе на CompB, это должна быть проблема CompC, а не проблема вашего кода.

So

  1. запустите cmp (1) для библиотек драйверов из CompB и CompC и убедитесь, что они одинаковы.
  2. если это не так, скопируйте драйверы с CompB на CompC и проверьте.
  3. выяснить, что пошло не так с контролем конфигурации.
person Charlie Martin    schedule 25.03.2009
comment
Спасибо, что попробовали это сделать, я добавил некоторые пояснения к вопросу, чтобы ответить на некоторые из ваших вопросов. - person Ryan Ahearn; 26.03.2009

Просто откажитесь от встроенного драйвера OCI - это бесконечная головная боль.

Используйте чистый драйвер java - он стабильнее, быстрее и использует меньше памяти.

person Community    schedule 25.03.2009
comment
под чистой java вы имеете в виду тонкий драйвер? У меня создалось впечатление, что для кластеров RAC нужен собственный драйвер OCI. Разве это не так? - person Ryan Ahearn; 26.03.2009
comment
OCI обеспечивает повышенную производительность и масштабируемость за счет эффективного использования системной памяти и сетевых подключений. di.unipi.it/~ ghelli / didattica / bdldoc / B19306_01 / appdev.102 / - person Suvasis; 07.09.2014
comment
Просто хотел вместе подписать это, драйвер OCI - мусор, просто используйте тонкий драйвер и сэкономьте много горя. Разочарован тем, что Oracle даже опубликовал что-то столь нестабильное. - person Rune Aamodt; 11.11.2014