加载了错误的驱动程序

时间:2011-02-04 21:17:32

标签: jtds

我试图通过使用jtds的jtds1.2.jar实现并在其上运行存储过程来连接到sqlServer 2008。 我写了一个成功完成测试的测试应用程序

我在自己的环境(不是应用程序服务器环境)中这样做有问题。 我使用java 1.4。 我设置了classpath以首先查看jtds。 当调用方法DriverManager.getConnection ...时,源代码不是jtds源代码。 这是我的代码(它与示例中的代码相同):

Class.forName("net.sourceforge.jtds.jdbc.Driver");
String url = "jdbc:jtds:sqlserver://" + serverIP + ":" + port + "/" + serviceName;
java.util.Enumeration myEnum = DriverManager.getDrivers();
Connection connection = DriverManager.getConnection(url,userName,password);

在debuging中:myEnum有2个驱动程序:

  1. 在sun.jdbc.odbc.JdbcOdbcDriver

  2. jtds驱动程序

  3. 我无所事事,DriverManger加载了第一个。

    如何确保加载jtds驱动程序?

    非常感谢

1 个答案:

答案 0 :(得分:0)

老实说,当你明确指出它应该使用jTDS驱动程序时,我不明白为什么DriverManager会尝试使用JDBC-ODBC桥驱动程序。连接URL的第二部分是jtds,它告诉DriverManager使用jTDS驱动程序。是什么让你确定DriverManager加载了JDBC-ODBC桥驱动程序?

在我的系统上,我还在枚举DriverManager.getDrivers()中看到了相同的两个条目。但是,仅仅因为JDBC-ODBC桥驱动程序在此列表中排在第一位,并且因为您可以想象通过它连接到SQL Server,并不意味着DriverManager将选择它。你问过jTDS驱动程序,它会使用它或者根本不使用它。

如果您故意在getConnection的电话中输入错误的用户名和密码会怎样?当我这样做时,我得到了一个堆栈跟踪,清楚地表明它正在使用jTDS:

java.sql.SQLException: Login failed for user 'x'.
        at net.sourceforge.jtds.jdbc.SQLDiagnostic.addDiagnostic(SQLDiagnostic.java:368)
        at net.sourceforge.jtds.jdbc.TdsCore.tdsErrorToken(TdsCore.java:2820)
        at net.sourceforge.jtds.jdbc.TdsCore.nextToken(TdsCore.java:2258)
        at net.sourceforge.jtds.jdbc.TdsCore.login(TdsCore.java:603)
        at net.sourceforge.jtds.jdbc.ConnectionJDBC2.<init>(ConnectionJDBC2.java:345)
        at net.sourceforge.jtds.jdbc.ConnectionJDBC3.<init>(ConnectionJDBC3.java:50)
        at net.sourceforge.jtds.jdbc.Driver.connect(Driver.java:184)
        at java.sql.DriverManager.getConnection(DriverManager.java:582)
        at java.sql.DriverManager.getConnection(DriverManager.java:185)
        ...

编辑:在您的评论中写道:

  

当调试getconnection方法时,src代码与jtds1.2源代码不匹配

我不完全确定你的意思,但我猜你正在使用调试器逐步执行代码,当你尝试进入getConnection方法时,调试器不会跳转进入jTDS源代码。通常,调试器不会自动获取JAR的源代码 - 您必须将源代码“附加”到调试器。确切地说,如何执行此操作取决于您使用的调试器。

但是,我不确定你为什么要进入getConnection方法。我猜你在连接数据库时遇到了一些困难。您确定所有数据库连接详细信息都是正确的吗?您可以使用其他程序(例如SQL Server Management Studio)连接到数据库吗?

最后,(这是一个完整的猜测,但之前我遇到过同样的问题),您是否尝试连接到SQL Server的Express版本?如果是这样,您将需要在数据库上启用TCP / IP连接。 JDBC使用TCP / IP连接连接到SQL Server,在Express版本上,默认情况下禁用这些连接。有关如何执行此操作的说明,请参阅http://softwaresalariman.blogspot.com/2007/04/jdbc-to-sql-server-express.html