5

次のJavaコードがあります。このコードの目的は、リモート MySQL データベース ProductionDb (私の /etc/odbc.ini ファイルで定義されたデータ ソース) への接続を確立することです。

import java.sql.*;
import java.util.*;
import java.io.*;

public class Test {

    public static void main(String[] args) {

        try {
            Connection conn = null;
            PreparedStatement s = null;
            String driver = "sun.jdbc.odbc.JdbcOdbcDriver";

            Class.forName(driver).newInstance();
            conn = DriverManager.getConnection("jdbc:odbc:ProductionDb");

        } catch (Exception ex) {
            System.out.println(ex.getMessage());
        }
    }

}

/etc/odbc.ini ファイルは次のとおりです。

$ cat /etc/odbc.ini
[ProductionDb]
Driver = /usr/lib/odbc/libmyodbc.so
Description = Production Database
Server = [ hidden ] 
Port = 3306
User = [ hidden ] 
Password = [ hidden ] 
Database = ProductionDb

ところで - 私は Java 7 と Ubuntu を使用しています:

 $java -version
    java version "1.7.0_09"
    Java(TM) SE Runtime Environment (build 1.7.0_09-b05)
    Java HotSpot(TM) 64-Bit Server VM (build 23.5-b02, mixed mode)

 $lsb_release -a
    No LSB modules are available.
    Distributor ID: Ubuntu
    Description:    Ubuntu 11.04
    Release:    11.04
    Codename:   natty

プログラムを実行しようとすると、次のエラーが表示されます。

$java Test
java: symbol lookup error: /usr/lib/jvm/java-7-oracle/jre/lib/amd64/libJdbcOdbc.so: undefined symbol: SQLAllocEnv

このエラーが発生する理由を知っている人はいますか? ここで何が問題なのですか?

PSちなみに、私は sudo apt-get install unixodbc-dev 、 sudo apt-get install libmyodbc 、および sudo apt-get install libmysql-java を実行しました:-)

アップデート:

また、以下の返信の 1 つ (Benny Hill による) で提案されているアイデアを試してみました: /etc/odbc.ini と同様に /etc/odbcinst.ini を使用します。それでも機能せず、同じエラー メッセージが表示されます。

$ cat /etc/odbc.ini
    [ProductionDb]
    Driver = MySQL Driver 
    Description = Production Database
    Server = [ hidden ] 
    Port = 3306
    User = [ hidden ] 
    Password = [ hidden ] 
    Database = ProductionDb

$ cat /etc/odbcinst.ini
    [MySQL Driver]
    Driver = /usr/lib/odbc/libmyodbc.so

追加の注意:

この ODBC データ ソースを R プログラミング言語から正常に使用できます。

> library(odbc)
> con = odbcConnect("ProductionDb") 
> con
RODBC Connection 1
Details:
  case=nochange
  DSN=ProductionDb
4

7 に答える 7

6

このエラーは、libJdbcOdbc.so が他の .so で関数 "SQLAllocEnv" を検索し、それを見つけられなかった結果です。これをデバッグする方法は、コマンドldd /usr/lib/jvm/java-7-oracle/jre/lib/amd64/libJdbcOdbc.soを実行することです。リンクされた .so オブジェクトとそれらの場所のリストが表示されます。

一般的に言えば、それらは /usr/lib にあるはずですが、自分でソフトウェアをコンパイルした場合、これらのライブラリの一部が /usr/local/lib または他の場所にあることに気付くかもしれません。/usr/local/lib に表示されるものがあれば、これが問題の原因である可能性があります。テストするには、 /usr/local/lib のライブラリの名前を別の名前に変更します ( sudo mv /usr/local/lib/mylib.so /usr/local/lib/mylib.so.SAVE )。

ここでプログラムを実行して、同じエラーが発生するかどうかを確認してください。それで問題が解決する場合は、それで問題ありません。そうでない場合は、同じエラー メッセージが表示されるか、新しいエラー メッセージが表示されるかをお知らせください。

odbc.ini ファイルは次のようになると思います。

[primary]
Description             = primary
Driver                  = iSeries Access ODBC Driver
System                  = XXX.XXX.XXX.XXX
UserID                  = XXXXXXXXXX
Password                = XXXXXXXXXX
Naming                  = 0
DefaultLibraries        = QGPL
Database                = XXXXXXXXXX
ConnectionType          = 0
CommitMode              = 2
ExtendedDynamic         = 0
DefaultPkgLibrary       = QGPL
DefaultPackage          = A/DEFAULT(IBM),2,0,1,0,512
AllowDataCompression    = 1
LibraryView             = 0
AllowUnsupportedChar    = 0
ForceTranslation        = 0
Trace                   = 0

そして、odbcinst.ini ファイルは次のようになります。

[iSeries Access ODBC Driver]
Description     = iSeries Access for Linux ODBC Driver
Driver          = /usr/lib/libcwbodbc.so
Setup           = /usr/lib/libcwbodbcs.so
NOTE1           = If using unixODBC 2.2.11 or later and you want the 32 and 64-bit ODBC drivers to share DSN's,
NOTE2           = the following Driver64/Setup64 keywords will provide that support.
Driver64        = /usr/lib/lib64/libcwbodbc.so
Setup64         = /usr/lib/lib64/libcwbodbcs.so
Threading       = 2
DontDLClose     = 1
UsageCount      = 1

私の例は、リモート iSeries のセットアップを示していますが、MySQL のために何を変更する必要があるかを確認できると確信しています。

つまり、odbc.ini の "Driver = ..." 行が間違っています。「Driver = mysql」のようなもので、odbcinst.ini ファイルで [mysql] を定義する必要があります。

于 2012-10-19T17:53:31.120 に答える
3

ライブラリが見つからないか、一致していないようです。ldd 処理のデバッグを試みます。

まずは何を確認するか

$ ldd /usr/lib/jvm/java-7-oracle/jre/lib/amd64/libJdbcOdbc.so

リストされたすべての依存関係が存在しますか?

次に、LD_DEBUG を設定して Java プログラムを再起動し、ローダーのデバッグを確認します。

$ export LD_DEBUG=all
$ java Test
于 2012-10-23T15:41:41.153 に答える
3

これを修正するには、起動スクリプトまたはプロファイルに次を追加します。

export LD_PRELOAD=$LD_PRELOAD:/usr/lib/libodbc.so:/usr/lib/libodbcinst.so

パスは少し異なる場合があります。私にとっては、/usr/lib64 にある .so ファイルです。

「ライブラリ "libodbc.so" および "libodbcinst.so" libJdbcOdbc.so が、JDBC-ODBC ブリッジを実装するライブラリから読み込まれないという事実によるバグがあります。」

https://code.google.com/p/queryconnector/source/browse/wiki/HowToInstall.wiki?spec=svn122&r=121によると

于 2013-10-04T16:28:44.107 に答える
2

以前に JDBC で MySQL を使用したことがあり、接続する最も簡単な方法は、公式の MySQL ドライバーである Connector/J を使用することです。ODBC ドライバーと同じように動作し、問題の原因となっている可能性のあるネイティブのものは必要ありません。

ここからドライバーを入手してください: http://dev.mysql.com/downloads/connector/j/

上記のページのドキュメント。

接続方法のドキュメント: http://dev.mysql.com/doc/refman/5.1/en/connector-j-usagenotes-connect-drivermanager.html#connector-j-examples-connection-drivermanager

于 2012-10-27T16:02:06.300 に答える
2

ディレクトリに移動します。

/usr/lib/jvm/java-7-oracle/jre/lib/amd64/

そして、ファイルの名前libJdbcOdbc.solibJdbcOdbcXXX.so

これは私にとってはうまくいきました。

于 2013-02-27T11:45:37.930 に答える
0

回避策として、SQLAllocEnv が /usr/lib/odbc/libmyodbc.so で定義されている場合は、JDBC を使用する前に強制的にロードしてみてください。

 try {
        System.load("/usr/lib/odbc/libmyodbc.so");
    } catch (UnsatisfiedLinkError e) {
      e.printStackTrace();
    }
于 2012-10-23T09:25:36.557 に答える