2017-01-19 3 views
0

Ich habe Java-Code von jemand anderem geschrieben (lange weg, keine Möglichkeit, sie zu kontaktieren) auf einem JBoss-Server ausgeführt, die ich debuggen bin. Es ist ein javax.sql.DataSource mit dieser Codezeile bekommen:Suchen wo die Datenquelle von InitialContext.lookup definiert ist?

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

Wenn sie jedoch ds.getConnection() in der nächsten Zeile zu verwenden, zeigen diese in den Protokollen nach oben:

...

javax .resource.ResourceException: Kann nicht verwalteten Verbindung für jdbc bekommen/WPDS

...

verursacht durch: org.jboss.resource.JBossResourceException: Verbindung konnte nicht hergestellt werden; - verschachtelte throwable: (java.sql.SQLException: ORA-01017: ungültiger Benutzername/Passwort, verweigert -Anmeldung)

ich um haben gesucht und eine Datei gefunden namens oracle-xa-ds.xml. Es enthält das:

<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> 

Ich habe überprüft, dass alle diese Einstellungen richtig sind. Ich kann eine Verbindung zur Datenbank herstellen, indem ich den Hostnamen, den Port, die SID, den Benutzernamen und das Passwort verwende, die in dieser Datei angegeben sind.

Ich vermute, dass es vielleicht die von woanders lädt, aber ich weiß nicht, wie ich diese Theorie überprüfen könnte (und wenn es wahr ist, wie würde ich herausfinden, woher es tatsächlich kommt?) Gibt es einige Art der JNDI-Protokollierung kann ich aktivieren, oder vielleicht kann ich es irgendwie zu sagen, was Benutzername/Passwort es versucht zu verwenden (so kann ich sehen, ob es verwendet, was in der Datei ist oder nicht?)

+0

Überprüfen Sie die [Management Console] (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

@EliottFrisch - Es zeigt eine Datenquelle namens 'jdbc/WPDS' mit dem Typ' XA Datasource' und dem Status 'UP'. Ich kann überprüfen, dass es von dieser Datei lädt, weil es anfänglich sagte, dass "Verfügbare Verbindungsanzahl" 50 war (wie es in der Datei in meinem ursprünglichen Post ist), und wenn ich die Datei änderte, um 60 zu haben, und den Server neu startete folgte entsprechend. – ArtOfWarfare

+0

@ravthiru - Ich bin nicht vertraut mit dem, worüber du gerade sprichst ... willst du es erklären? Was ist der Sicherheitskontext? Wie kann ich herausfinden, welchen Benutzernamen/welches Passwort er verwendet und wie kann ich ihn ändern? – ArtOfWarfare

Antwort

1

ORA-01017: ungültiger Benutzername/Passwort; Anmelde verweigert

Ursache:

  • ein ungültiger Benutzername oder Passwort wurde in einem Versuch eingegeben Oracle anzumelden. Der Benutzername und das Passwort müssen mit denen übereinstimmen, die in einer GRANT CONNECT-Anweisung angegeben wurden. Wenn der Benutzername und das Passwort zusammen eingegeben werden, lautet das Format: Benutzername/Passwort.

  • Die Kernfrage mit einem ORA-01017 Fehler ist eine ungültige Benutzer-ID und Passwörter Kombination, aber auch andere als ein falsches Passwort, gibt es Benutzer-ID Probleme

  • Es kann sein, dass die Benutzer-ID für ungültig Das Zielsystem - Die Benutzer-ID existiert als die Spalte Benutzername in der Ansicht dba_users.

  • Überprüfen Sie Ihren $ ORACLE_SID-Umgebungsparameter. Wenn Ihre $ ORACLE_SID auf die falsche System-ID gesetzt ist, erhalten Sie möglicherweise einen ORA-01017-Fehler, weil Sie eine Verbindung zur falschen Datenbank herstellen.

  • Überprüfen Sie Ihre tnsnames.ora, um sicherzustellen, dass der TNS-Dienstname auf den korrekten Server- und Instanznamen verweist. Wenn Sie einen inkorrekten Dienstnamen tnsnames.ora angeben, sind die Benutzer-ID und das Kennwort möglicherweise nicht in dieser Datenbank vorhanden.

Aktion:

  • einen gültigen Benutzernamen und Passwort-Kombination im richtigen Format eingeben.

  • Der Benutzer und das Passwort sind DEFINITIV falsch.

  • Versuchen ALTER SYSTEM SET SEC_CASE_SENSITIVE_LOGON = FALSCH; und Passwort ändern.

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

+0

Nach meiner langen wilden Jagd nach einem mystischen falschen Passwort, das von einer unbekannten Datei kommt, fand ich schließlich heraus, dass das falsche Passwort mich in der Datei anstarrte, von der ich bereits wusste. Ich habe gerade den Tippfehler übersehen. – ArtOfWarfare

0

Sie können versuchen, bekommen Informationen wie diese, aber kein Passwort.

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

Es wird tatsächlich eine Instanz von 'org.jboss.resource.adapter.jdbc.WrapperDataSource' zurückgegeben, nicht 'oracle.jdbc.xa.client.OracleXADataSource'. – ArtOfWarfare

0

Ich landete ein Verfahren bis zu schreiben, die auf einem Objekt reflektiert rekursiv und druckt viel darüber.

Ich fand schließlich, dass es das exakt gleiche Passwort von oracle-xa-ds.xml verwendete - das Problem war, dass diese Datei das falsche Passwort hatte. Also verschwendete ich zwei ganze Tage mit dem falschen Passwort.

Hoffentlich dieser Code wird dazu beitragen, jemand anderes ihre Ungereimtheiten endet schnell und bekommt sie in der richtigen Richtung im Rückblick:

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); 
     } 
    } 
} 

es zu verwenden, machen nur so etwas wie:

logFields(ds, "", 7); 
Verwandte Themen