gpt4 book ai didi

Java ODBC 数据源( undefined symbol : SQLAllocEnv )

转载 作者:可可西里 更新时间:2023-11-01 06:55:51 29 4
gpt4 key购买 nike

我有以下 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

有谁知道我为什么会收到这个错误?这里有什么问题?

P.S 顺便说一句,我确实运行了 sudo apt-get install unixodbc-dev 、 sudo apt-get install libmyodbc 和 sudo apt-get install libmysql-java :-)

更新:

我也试过下面的一个回复中建议的想法(Benny Hill):使用/etc/odbcinst.ini 和/etc/odbc.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

补充说明:

我可以从 R 中成功使用这个 ODBC 数据源编程语言。

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

最佳答案

错误是 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]。

关于Java ODBC 数据源( undefined symbol : SQLAllocEnv ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12979601/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com