2017-01-19 23 views
0

私は、デバッグしているJBossサーバー上で動作する他の人が書いたJavaコードを持っています。それは、このコードの1行でjavax.sql.DataSourceを取得しています。しかしInitialContext.lookupで取得されたデータソースの場所を検索しますか?

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

、彼らは次の行にds.getConnection()を使用し、これは、ログに表示:

...

のjavaxを.resource.ResourceException:JDBCの管理接続を取得することができません/ WPDS

...

原因:org.jboss.resource.JBossResourceException:接続を作成できませんでした。 - ネストされたスロー可能:(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をロードだと思われるが、私はその理論を確認することができるか分からない(とそれが本当ならば、それは実際にそれを取得しています場合には、どのように私は見つけるのでしょうか?)いくつかはありますJNDIの種類のログを有効にすることもできますし、何らかのユーザ名/パスワードを使用しようとしていることを何らかの理由で教えてもらえます(ファイル内のものを使用しているかどうか確認できます)

+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 - タイプ 'XA Datasource'とステータス' UP'を持つ 'jdbc/WPDS'という名前のデータソースを表示します。このファイルから読み込み中であることを確認することができます。これは、最初に「使用可能な接続数」が50だったからです(元の投稿のファイルのように)。ファイルを60に変更してサーバを再起動したとき、それに応じて続いた。 – ArtOfWarfare

+0

@ravthiru - 私はあなたが今話していることに慣れていない...説明するために気をつけますか?セキュリティコンテキストとは何ですか?どのユーザー名/パスワードを使用しているのか、どのように変更できますか? – ArtOfWarfare

答えて

1

ORA-01017:無効なユーザー名/パスワード;

  • 無効なユーザー名やパスワードは、Oracleにログオンしようとする試みで入力された:ログオンが

    原因を否定しました。ユーザー名とパスワードは、GRANT CONNECTステートメントで指定されたものと同じでなければなりません。ユーザー名とパスワードを一緒に入力すると、形式はusername/passwordになります。

  • コア問題ORA-01017エラーは、無効なユーザーIDとパスワードの組み合わせですが、間違ったパスワード以外に、ユーザーIDの問題が

  • があるこれは、ユーザーIDが無効ですということかもしれターゲット・システム - ユーザーIDはdba_usersビューのusername列として存在します。

  • 環境変数$ ORACLE_SIDを確認してください。 $ ORACLE_SIDが間違ったシステムIDに設定されていると、間違ったデータベースに接続しているためにORA-01017エラーが発生する可能性があります。

  • tnsnames.oraを調べて、TNSサービス名が正しいサーバー名とインスタンス名を指していることを確認します。間違ったtnsnames.oraサービス名を指定すると、ユーザーIDとパスワードがそのデータベースに存在しないことがあります。

処置:

  • は、正しい形式で有効なユーザー名とパスワードの組み合わせを入力します。

  • ユーザーとパスワードは間違っています。

  • 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

実際には、 'oracle.jdbc.xa.client.OracleXADataSource'ではなく、' org.jboss.resource.adapter.jdbc.WrapperDataSource'のインスタンスを返しています。 – ArtOfWarfare

0

私は再帰的にオブジェクトを反映しており、それについて多くを出力する方法を書いてしまいました。

最終的には、同じパスワードをoracle-xa-ds.xmlから使用していたことがわかりました。問題は、そのファイルのパスワードが間違っていたことでした。だから間違ったパスワードを持っているのは2日も無駄でした。

うまくいけば、このコードは他の誰かがすぐに彼らの野生のガチョウの追跡を終了し、戻って右方向に見にそれらを得るのを助ける:

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); 
関連する問題