web-dev-qa-db-ja.com

DB2接続許可エラーが発生した理由:セキュリティメカニズムはJava

DB2JDBCType4ドライバーを使用してDB2接続を構成しようとしています。しかし、私はこのエラーが発生しています。

スレッド「main」の例外com.ibm.db2.jcc.am.SqlInvalidAuthorizationSpecException:[jcc] [t4] [201] [11237] [3.64.104]接続許可の失敗が発生しました。理由:セキュリティメカニズムはサポートされていません。 ERRORCODE = -4214、SQLSTATE = 28000

私のコードは

public Connection getConnection() throws ClassNotFoundException, InstantiationException,
                                         IllegalAccessException, SQLException{

   Driver driver = (Driver) Class.forName ( "com.ibm.db2.jcc.DB2Driver" ).newInstance(); 
  DriverManager.registerDriver(driver);
  Connection  connection = DriverManager.getConnection("jdbc:db2://hostname:portnumber
                                           /DBName", "username","password" );
    System.out.println( "From DAO, connection obtained " );
    return connection;  
}

例外ログ:

Exception in thread "main" com.ibm.db2.jcc.am.SqlInvalidAuthorizationSpecException:
[jcc][t4][201][11237][3.64.104] Connection authorization failure occurred. 
Reason: Security mechanism not supported. ERRORCODE=-4214, SQLSTATE=28000
    at com.ibm.db2.jcc.am.bd.a(bd.Java:677)
    at com.ibm.db2.jcc.am.bd.a(bd.Java:60)
    at com.ibm.db2.jcc.am.bd.a(bd.Java:120)
    at com.ibm.db2.jcc.t4.b.f(b.Java:2389)
    at com.ibm.db2.jcc.t4.b.a(b.Java:1712)
    at com.ibm.db2.jcc.t4.y.b(y.Java:3612)
    at com.ibm.db2.jcc.t4.y.a(y.Java:477)
    at com.ibm.db2.jcc.t4.y.a(y.Java:117)
    at com.ibm.db2.jcc.t4.b.c(b.Java:1350)
    at com.ibm.db2.jcc.t4.b.b(b.Java:1221)
    at com.ibm.db2.jcc.t4.b.b(b.Java:788)
    at com.ibm.db2.jcc.t4.b.a(b.Java:760)
    at com.ibm.db2.jcc.t4.b.a(b.Java:421)
    at com.ibm.db2.jcc.t4.b.a(b.Java:396)
    at com.ibm.db2.jcc.t4.b.<init>(b.Java:334)
    at com.ibm.db2.jcc.DB2SimpleDataSource.getConnection(DB2SimpleDataSource.Java:232)
    at com.ibm.db2.jcc.DB2SimpleDataSource.getConnection(DB2SimpleDataSource.Java:198)
    at com.ibm.db2.jcc.DB2Driver.connect(DB2Driver.Java:475)
    at com.ibm.db2.jcc.DB2Driver.connect(DB2Driver.Java:116)
    at Java.sql.DriverManager.getConnection(DriverManager.Java:582)
    at Java.sql.DriverManager.getConnection(DriverManager.Java:185)
    at com.test.connection.DB2ConnectionFactory.getConnection(DB2ConnectionFactory.Java:19
    at com.test.connection.ConnectionTest.main(ConnectionTest.Java:18)

また、IBM Data Server Driver forJDBCおよびSQLJでサポートされているこれらのメカニズムを試しました。

-CLIENT
-SERVER
-SERVER_ENCRYPT
-DATA_ENCRYPT
-KERBEROS
-GSSPLUGIN
-KRB_SERVER_ENCRYPT
-GSS_SERVER_ENCRYPT 

暗号化の問題を回避するために、このアプリケーションをLinuxボックスにデプロイしました。 SO安全な接続が必要な場合に備えて、同じエラーが発生しています。

DB2JDBCドライバーのバージョンv10.1fp1_jdbc_sqljを使用していますが、この目的のために9.5および9.1およびdb2jcc4.jarファイルも試しました。

type 2ドライバーを使用して試しましたが、その場合はCOM.ibm.db2.jdbc.app.DB2DriverでClassNotFoundエラーが発生します。クラスが見つかりません。

しかし、これまでのところ何も機能しませんでした。どんな助けでも大歓迎です。私はこの問題に1週間以上苦労しています。

6
Sunny Kaushul

現在動作しています。問題はDB2にありました。環境変数が正しいフォルダーを指していることを確認する必要があります。したがって、必ず次のことを行ってください。

  • 変更するたびに、または環境変数に加えたすべての変更の後に、マシンを再起動する必要があります。
  • JDBC Type 2ドライバーを使用していることを確認してください。 DBAからの要請がない限り、Type 4に進まないでください。

コードがWindowsJDBCドライバーと対話できることを確認するのに役立ちます

PATH=C:\Program Files\IBM\SQLLIB\BIN\db2jdbc.dll

LIBは、コードが適切なライブラリを読み取るのに役立ちます。つまり、COM.ibm.db2.jdbc.app.DB2Driver

LIB=;C:\PROGRA~1\IBM\SQLLIB\LIB

クラスパス:

ClassPath = .;C:\PROGRA~1\IBM\SQLLIB\Java\db2Java.jar;
C:\PROGRA~1\IBM\SQLLIB\Java\db2jcc.jar;C:\PROGRA~1\IBM\SQLLIB\Java\sqlj.Zip;
C:\PROGRA~1\IBM\SQLLIB\BIN\db2jdbc.dll;
C:\PROGRA~1\IBM\SQLLIB\Java\db2jcc.jar;
C:\PROGRA~1\IBM\SQLLIB\Java\sqlj.Zip;
C:\PROGRA~1\IBM\SQLLIB\Java\db2jcc_license_cu.jar;
C:\PROGRA~1\IBM\SQLLIB\Java\db2Java.jar;
C:\PROGRA~1\IBM\SQLLIB\BIN;C:\PROGRA~1\IBM\SQLLIB\Java\jdk;
3
Sunny Kaushul

タイプ2ドライバーは、データサーバークライアントがマシンにインストールされている場合に使用されます。同じクライアントマシンでDB2サーバーを実行している場合は、タイプ2サーバーを使用できます。

ローカルマシンのリモートデータベースをカタログ化するために、データサーバークライアントを使用して、「db2 connect to DBName」を介して接続を確立してみてください。接続を確立できる場合は、Javaでも同じことができます。できない場合は、適切なものが見つかるまで、カタログオプションを変更できます。それが済んだら、リモートデータベースに接続できます。

0
AngocA

サーバーにはどの認証方法が設定されていますか?カスタム認証プラグインは使用されていますか?この情報は、データベースサーバーでdb2 get dbm cfgを実行することで取得できます。

0
mustaccio