老实说,当您明确指定它应该使用 jTDS 驱动程序时,我真的不明白为什么 DriverManager 会尝试使用 JDBC-ODBC 桥驱动程序。连接 URL 的第二部分是jtds
告诉 DriverManager 使用 jTDS 驱动程序。是什么让您如此确定 DriverManager 加载了 JDBC-ODBC 桥驱动程序?
在我的系统上,我还在 enumeration 中看到了相同的两个条目DriverManager.getDrivers()
。但是,仅仅因为 JDBC-ODBC 桥驱动程序在此列表中排在首位,并且您可以想象通过它连接到 SQL Server,并不意味着 DriverManager 会选择它。您要求 jTDS 驱动程序,它会使用它或根本不使用。
如果您故意在调用中输入错误的用户名和密码会发生什么getConnection
?当我这样做时,我得到了一个堆栈跟踪,它清楚地表明它正在使用 jTDS:
java.sql.SQLException:用户“x”登录失败。
在 net.sourceforge.jtds.jdbc.SQLDiagnostic.addDiagnostic(SQLDiagnostic.java:368)
在 net.sourceforge.jtds.jdbc.TdsCore.tdsErrorToken(TdsCore.java:2820)
在 net.sourceforge.jtds.jdbc.TdsCore.nextToken(TdsCore.java:2258)
在 net.sourceforge.jtds.jdbc.TdsCore.login(TdsCore.java:603)
在 net.sourceforge.jtds.jdbc.ConnectionJDBC2.<init>(ConnectionJDBC2.java:345)
在 net.sourceforge.jtds.jdbc.ConnectionJDBC3.<init>(ConnectionJDBC3.java:50)
在 net.sourceforge.jtds.jdbc.Driver.connect(Driver.java:184)
在 java.sql.DriverManager.getConnection(DriverManager.java:582)
在 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 。