Сбой JVM при попытке подключиться к Oracle с помощью OCI - PullRequest
3 голосов
/ 25 марта 2009

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

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

В клиентском коде как на CompB, так и на CompC подключение к любой из БД Oracle работает без проблем с помощью тонкого драйвера.

Я пытаюсь подключиться к каждой БД 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, но может подключиться с помощью thin к CompA и CompB, поэтому это не должно быть проблемой версии сервера.

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

Ответы [ 2 ]

4 голосов
/ 25 марта 2009

Ну, я только что закончил смотреть эпизод с Хаусом, так что давайте попробуем дифференциальный диагноз здесь. Вы знаете, что он работает с драйвером Thin с обеих машин, но срок его действия в коде 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 и тонкий, и 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. когда их нет, rcp драйверы из CompB на CompC и проверить.
  3. выяснить, что пошло не так с контроль конфигурации.
2 голосов
/ 26 марта 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...