2017-01-19 4 views
0

У меня есть код Java, написанный кем-то еще (давно ушел, и никак не с ними связаться), работающий на сервере JBoss, который я отлаживаю. Это получение javax.sql.DataSource с этой одной строки кода:Найти, где определяется источник данных, полученный из InitialContext.lookup?

DataSource ds = new InitialContext().lookup("java:/jdbc/WPDS"); 

Однако, когда они используют ds.getConnection() на следующей строке, это проявляется в журналах:

...

javax .resource.ResourceException: Не удалось получить управляемое соединение для JDBC/WPDS

...

Вызвано: org.jboss.resource.JBossResourceException: Не удалось создать соединение; - вложенная Throwable: (java.sql.SQLException: ORA-01017: неверное имя пользователя/пароль, для входа в систему отказано)

Я посмотрел вокруг и нашел файл с именем oracle-xa-ds.xml. Он содержит следующее:

<datasources> 
    <xa-datasource> 
    <jndi-name>jdbc/WPDS</jndi-name> 
    <!-- uncomment to enable interleaving <interleaving/> --> 
    <isSameRM-override-value>false</isSameRM-override-value> 
    <xa-datasource-class>oracle.jdbc.xa.client.OracleXADataSource</xa-datasource-class> 
    <xa-datasource-property name="URL">jdbc:oracle:thin:@hostname.hidden.com:1621:HIDE</xa-datasource-property> 
    <xa-datasource-property name="User">hidden</xa-datasource-property> 
    <xa-datasource-property name="Password">hidden</xa-datasource-property> 
    <!-- Uses the pingDatabase method to check a connection is still valid before handing it out from the pool --> 
    <valid-connection-checker-class-name>org.jboss.resource.adapter.jdbc.vendor.OracleValidConnectionChecker</valid-connection-checker-class-name> 
    <!-- Checks the Oracle error codes and messages for fatal errors --> 
    <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter</exception-sorter-class-name> 
    <!-- Oracles XA datasource cannot reuse a connection outside a transaction once enlisted in a global transaction and vice-versa --> 
    <no-tx-separate-pools/> 

    <max-pool-size>50</max-pool-size> 

     <!-- corresponding type-mapping in the standardjbosscmp-jdbc.xml (optional) --> 
     <metadata> 
     <type-mapping>Oracle9i</type-mapping> 
     </metadata> 
    </xa-datasource> 

    <mbean code="org.jboss.resource.adapter.jdbc.vendor.OracleXAExceptionFormatter" 
     name="jboss.jca:service=OracleXAExceptionFormatter"> 
    <depends optional-attribute-name="TransactionManagerService">jboss:service=TransactionManager</depends> 
    </mbean> 

</datasources> 

Я проверял, что все эти настройки правильные. Я могу подключиться к базе данных, используя имя хоста, порт, SID, имя пользователя и пароль, указанные в этом файле.

Я подозреваю, что, возможно, он загружает DataSource из другого места, но я не знаю, как я мог проверить эту теорию (и если это правда, как бы я узнал, откуда она на самом деле ее получает?) Есть ли какие-то я могу включить, или, может быть, я могу как-то заставить его указать мне, какое имя пользователя/пароль он пытается использовать (так что я могу посмотреть, использует ли он то, что находится в файле или нет?)

+0

Проверьте [Консоль управления] (https://access.redhat.com/documentation/en-US/Red_Hat_JBoss_Data_Virtualization/6/html/Administration_and_Configuration_Guide/chap-JDBC_Data_Sources.html#Create_an_XA_Datasource_with_the_Management_Interfaces). –

+0

@ElliottFrisch - Он показывает источник данных с именем 'jdbc/WPDS' с типом' XA Datasource' и статусом 'UP'. Я могу проверить, что это загрузка из этого файла, потому что изначально он сказал, что «Доступный счет подключения» равен 50 (как и в файле в моем исходном сообщении), и когда я изменил файл на 60 и перезапустил сервер, соответственно. – ArtOfWarfare

+0

@ravthiru - Я не знаком с тем, о чем вы сейчас говорите ... помогите объяснить? Что такое контекст безопасности? Как я могу узнать, какое имя пользователя/пароль он использует, и как я могу его изменить? – ArtOfWarfare

ответ

1

ORA-01017: неверное имя пользователя/пароль; входа в систему отказано

Причина:

  • недопустимое имя пользователя или пароль был введен в попытке войти на Oracle. Имя пользователя и пароль должны быть такими же, как указано в инструкции GRANT CONNECT. Если имя пользователя и пароль введены вместе, формат: имя пользователя/пароль.

  • Ядром проблема с ошибкой ORA-01017 является недопустимым ID пользователя и комбинации паролей, но кроме неправильного пароля, есть вопросы ID пользователя

  • Это может быть то, что идентификатор пользователя является недопустимым для целевая система. Идентификатор пользователя существует как столбец имени пользователя в представлении dba_users.

  • Проверьте свой экологический параметр $ ORACLE_SID. Если ваш $ ORACLE_SID установлен неверным системным идентификатором, вы можете получить ошибку ORA-01017, потому что вы подключаетесь к неправильной базе данных.

  • Проверьте tnsnames.ora, чтобы убедиться, что имя службы TNS указывает на правильный сервер и имя экземпляра. Если вы укажете неправильное имя службы tnsnames.ora, тогда идентификатор пользователя и пароль могут отсутствовать в этой базе данных.

Действие:

  • Введите действительное имя пользователя и пароль в правильном формате.

  • Пользователь и пароль НЕОБХОДИМО.

  • Попробуйте ALTER SYSTEM SET SEC_CASE_SENSITIVE_LOGON = FALSE; и изменить пароль.

http://oracle-base.com/articles/11g/case-sensitive-passwords-11gr1.php

+0

После того, как мой долгий дикий гусей преследовал попытку найти мистический неправильный пароль из неизвестного файла, я в конечном итоге обнаружил, что неправильный пароль смотрел на меня в файле, о котором я уже знал. Я просто не заметил опечатки. – ArtOfWarfare

0

Вы можете попробовать получить такую ​​информацию, но не пароль.

if (dataSource instanceof oracle.jdbc.xa.client.OracleXADataSource) { 
     oracle.jdbc.xa.client.OracleXADataSource oracleXADataSource = (oracle.jdbc.xa.client.OracleXADataSource)dataSource; 
     logger.info(oracleXADataSource.getUrl()); 
     logger.info(oracleXADataSource.getUsername()); 
    } 
+0

Это фактически возвращает экземпляр 'org.jboss.resource.adapter.jdbc.WrapperDataSource', а не' oracle.jdbc.xa.client.OracleXADataSource'. – ArtOfWarfare

0

Я закончил тем, что писал метод, который рекурсивно отражается на объекте и печатает много об этом.

В конечном итоге я нашел, что он использовал тот же самый пароль от oracle-xa-ds.xml - проблема заключалась в том, что в этом файле был неправильный пароль. Поэтому я потратил два дня на неправильный пароль.

Надеюсь, этот код поможет кто-то другой конец их диких гусей быстро и получить их обратно, глядя в правильном направлении:

public static final void logFields(Object o, String prefix, int depth) { 
    if (depth <= 0) { 
     logger.debug(prefix + "No deeper because max depth reached."); 
     return; 
    } 

    if (o == null) { 
     return; 
    } 

    Class c   = o.getClass(); 
    String className = c.getName(); 
    if (className.startsWith("java.lang")) { 
     logger.debug(prefix + "No deeper because class is " + className); 
     return; 
    } 

    logger.debug(prefix + "Class Name: " + className); 
    for (Field f : c.getDeclaredFields()) { 
     logger.debug(prefix + "Field Name: " + f.getName()); 
     logger.debug(prefix + "Field Type: " + f.getType()); 
     try { 
      if (!f.isAccessible()) { 
       logger.debug(prefix + " Not accessible - fixing that."); 
       f.setAccessible(true); 
       logger.debug(prefix + " Should now be accessible."); 
      } 
      Object o2 = f.get(o); 
      logger.debug(prefix + "Field Value: " + o2); 
      logFields(o2, prefix + " ", depth - 1); 
     } catch (Throwable t) { 
      logger.debug(prefix + "Caught Throwable trying to get Field Value: " + t); 
      logger.error(t, t); 
     } 
    } 
} 

Чтобы использовать его, просто сделать что-то вроде:

logFields(ds, "", 7); 
Смежные вопросы