JDBC未连接到Web服务中的数据库
Posted
技术标签:
【中文标题】JDBC未连接到Web服务中的数据库【英文标题】:JDBC not connecting to DB within webservice 【发布时间】:2014-08-01 15:37:52 【问题描述】:我一直在使用 JDBC。下面是我用来获取连接的代码。
JDBC 代码:
Connection con = null;
Statement st = null;
final String DB_URL = "jdbc:jtds:sqlserver://00.00.00.00:0000/DB";
// Database credentials
final String USER = "usrname";
final String PASS = "pw";
try
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
con = DriverManager.getConnection(DB_URL, USER, PASS);
st = con.createStatement();
System.out.println("successfully connected!");
catch (Exception err)
System.out.println(" " + err.getMessage ());
finally
try
con.close();
catch (Exception e) /* ignored */
try
st.close();
catch (Exception e)
/* ignored */
我已经从包含 getter 和 setter 的 WSDL 生成了一个 Web 服务。虽然它与 Web 服务(它自己的类)在同一个包中,但我可以简单地运行该类,它会生成 "Successfully connected"
。 (请记住,构建是相同的,因为它在同一个包中)现在,当我将代码插入 Web 服务上的方法并使用 insert();
调用它时。从这里我使用生成的客户端调用 Web 服务。回头看控制台时,我收到"com.microsoft.sqlserver.jdbc.SQLServerDriver"
错误。通常在路径构建不正确时给出。
它在 getter 和 setter 类之外工作,但为什么不在里面呢?
【问题讨论】:
什么是插入()?您是否将 Web 服务部署到服务器?您可以发布该问题的堆栈跟踪吗? insert() 是我在 getter 和 setter 类文件中创建的方法。 (在条件下调用jdbc)。例如我有 insert();打印你好,我用jdbc内容替换了打印语句。堆栈跟踪中唯一出现的是“com.microsoft.sqlserver.jdbc.SQLServerDriver”。当未正确启用软件包时,我遇到过这种情况。但考虑到它在同一个包中,我一无所知。 您能否发布您用于调用 insert 的任何 getter 或 setter 方法的代码? @Greycon 我正在使用上面的代码。我现在没有插入任何东西(使用 getter 或 setter)。我只是想建立联系。但它没有打印“又名没有获得连接”的声明。在 Web-Service 类之外获得连接,但在包内有效。 您的问题很清楚,信息不充分,我想如果您可以为所谓的 getter 和 setter 方法提供代码 sn-ps(如果您说如果您在运行 JDBC 代码时遇到问题,那么我猜您的类路径中缺少 SQL db 服务器驱动程序 JAR),并且还完成了堆栈跟踪 .. 【参考方案1】:我已尝试同步完整的文档。它会覆盖
-
各种数据库连接方式
测试连接的示例代码
常见错误以及我们如何解决这些问题
定义 JRE 支持
如何设置CLASSPATH变量?
如何注册驱动程序?
如何传递连接 URL?
选择正确的 JAR 文件
建立与数据库的简单连接
安装Microsoft SQL Server 2000 JDBC驱动后,可以通过两种方式连接数据库:
1) 带有连接 URL,或
2) 使用 JNDI 数据源
测试连接的示例代码
以下示例代码尝试连接到数据库并显示数据库名称、版本和可用目录。将服务器属性替换为您的服务器的值:
import java.*;
public class Connect
private java.sql.Connection con = null;
private final String url = "jdbc:microsoft:sqlserver://";
private final String serverName= "localhost";
private final String portNumber = "1433";
private final String databaseName= "pubs";
private final String userName = "user";
private final String password = "password";
// Informs the driver to use server a side-cursor,
// which permits more than one active statement
// on a connection.
private final String selectMethod = "cursor";
// Constructor
public Connect()
private String getConnectionUrl()
return url+serverName+":"+portNumber+";databaseName="+databaseName+";selectMethod="+selectMethod+";";
private java.sql.Connection getConnection()
try
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
con = java.sql.DriverManager.getConnection(getConnectionUrl(),userName,password);
if(con!=null) System.out.println("Connection Successful!");
catch(Exception e)
e.printStackTrace();
System.out.println("Error Trace in getConnection() : " + e.getMessage());
return con;
/*
Display the driver properties, database details
*/
public void displayDbProperties()
java.sql.DatabaseMetaData dm = null;
java.sql.ResultSet rs = null;
try
con= this.getConnection();
if(con!=null)
dm = con.getMetaData();
System.out.println("Driver Information");
System.out.println("\tDriver Name: "+ dm.getDriverName());
System.out.println("\tDriver Version: "+ dm.getDriverVersion ());
System.out.println("\nDatabase Information ");
System.out.println("\tDatabase Name: "+ dm.getDatabaseProductName());
System.out.println("\tDatabase Version: "+ dm.getDatabaseProductVersion());
System.out.println("Avalilable Catalogs ");
rs = dm.getCatalogs();
while(rs.next())
System.out.println("\tcatalog: "+ rs.getString(1));
rs.close();
rs = null;
closeConnection();
else System.out.println("Error: No active Connection");
catch(Exception e)
e.printStackTrace();
dm=null;
private void closeConnection()
try
if(con!=null)
con.close();
con=null;
catch(Exception e)
e.printStackTrace();
public static void main(String[] args) throws Exception
Connect myDbTest = new Connect();
myDbTest.displayDbProperties();
如果这段代码成功,输出类似如下:
Connection Successful! Driver Information
Driver Name: SQLServer
Driver Version: 2.2.0022
Database Information
Database Name: Microsoft SQL Server
Database Version: Microsoft SQL Server 2000 - 8.00.384 (Intel X86)
May 23 2001 00:02:52
Copyright (c) 1988-2000 Microsoft Corporation
Desktop Engine on Windows NT 5.1 (Build 2600: )
Avalilable Catalogs
catalog: master
catalog: msdb
catalog: pubs
catalog: tempdb
基本连接故障排除
错误 1
java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC][SQLServer]Login failed for user 'user'. Reason: Not associated with a trusted SQL Server connection.
回答:
如果 SQL Server 2000 身份验证模式出现此错误消息 设置为 Windows 身份验证模式。微软 SQL Server 2000 JDBC 驱动程序不支持使用 Windows NT 进行连接 验证。您必须设置 SQL 的身份验证模式 服务器到混合模式,允许 Windows 身份验证和 SQL Server 身份验证。
错误 2
java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC]This version of the JDBC driver only supports Microsoft SQL Server 2000. You can either upgrade to SQL Server 2000 or possibly locate another version of the driver.
回答:
您尝试连接到 SQL Server 版本时出现此错误消息 早于 SQL Server 2000。Microsoft SQL Server 2000 驱动程序用于 JDBC 仅支持与 SQL Server 2000 的连接。
Java 运行时环境要求
-
从 Microsoft JDBC Driver 4.2 for SQL Server、Sun Java 开始
SE 开发工具包 (JDK) 8.0 和 Java 运行时环境 (JRE) 8.0
支持。支持 Java 数据库连接 (JDBC) 规范
API 已扩展为包含 JDBC 4.1 和 4.2 API。
从 Microsoft JDBC Driver 4.1 for SQL Server、Sun Java 开始
SE 开发工具包 (JDK) 7.0 和 Java 运行时环境 (JRE) 7.0
支持。
从 Microsoft JDBC Driver 4.0 for SQL Server 开始,JDBC
Java 数据库连接 (JDBC) Spec API 的驱动程序支持
已扩展为包括 JDBC 4.0 API。 JDBC 4.0 API 是
作为 Sun Java SE Development Kit (JDK) 6.0 和
Java 运行时环境 (JRE) 6.0。 JDBC 4.0 是
JDBC 3.0 API。
更多:System Requirements for the JDBC Driver
设置 CLASSPATH 变量
用于 JDBC .jar 文件的 Microsoft SQL Server 2000 驱动程序必须列在您的 CLASSPATH 变量中。 CLASSPATH 变量是 Java 虚拟机 (JVM) 用于在您的计算机上查找 JDBC 驱动程序的搜索字符串。如果驱动程序未列在您的 CLASSPATH 变量中,当您尝试加载驱动程序时会收到以下错误消息:
java.lang.ClassNotFoundException: com/microsoft/jdbc/sqlserver/SQLServerDriver
设置您的系统 CLASSPATH 变量以包含以下条目:
\你的安装路径\Lib\Msbase.jar
\您的安装路径\Lib\Msutil.jar
\您的安装路径\Lib\Mssqlserver.jar
这是配置的 CLASSPATH 变量的示例:
CLASSPATH=.;c:\program files\Microsoft SQL Server 2000 驱动程序 JDBC\lib\msbase.jar;c:\program files\Microsoft SQL Server 2000 驱动程序 对于 JDBC\lib\msutil.jar;c:\program files\Microsoft SQL Server 2000 JDBC\lib\mssqlserver.jar 驱动程序
注册驱动程序
注册驱动程序会指示 JDBC 驱动程序管理器加载哪个驱动程序。使用class.forName
函数加载驱动程序时,必须指定驱动程序的名称。这是 Microsoft SQL Server 2000 Driver for JDBC 的驱动程序名称:
com.microsoft.jdbc.sqlserver.SQLServerDriver
以下示例代码演示了如何注册驱动程序:
Driver d = (Driver)Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();
传递连接 URL
您必须以连接 URL 的形式传递您的数据库连接信息。这是 Microsoft SQL Server 2000 Driver for JDBC 的模板 URL。替换数据库的值:
jdbc:microsoft:sqlserver://servername:1433
以下示例代码演示了如何指定连接 URL:
con = DriverManager.getConnection("jdbc:microsoft:sqlserver://localhost:1433", "userName", "password");
选择正确的 JAR 文件
-
Microsoft JDBC Drivers 6.0 和 4.2 for SQL Server 提供
sqljdbc.jar、sqljdbc4.jar、sqljdbc41 和 sqljdbc42.jar 类
根据您的首选 Java 运行时使用的库文件
环境 (JRE) 设置。
Microsoft JDBC Driver 4.1 for SQL Server 提供 sqljdbc.jar,
要使用的 sqljdbc4.jar 和 sqljdbc41.jar 类库文件
取决于您首选的 Java 运行时环境 (JRE) 设置。
SQL Server 4.0 的 Microsoft JDBC 驱动程序提供 sqljdbc.jar
以及要使用的 sqljdbc4.jar 类库文件,具体取决于您的
首选 Java 运行时环境 (JRE) 设置。
建立与数据库的简单连接
使用sqljdbc.jar类库,应用必须先注册驱动,如下:
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
驱动加载后,可以通过连接URL和DriverManager类的getConnection方法建立连接:
String connectionUrl = "jdbc:sqlserver://localhost:1433;" +
"databaseName=AdventureWorks;user=MyUserName;password=*****;";
Connection con = DriverManager.getConnection(connectionUrl);
在 JDBC API 4.0 中,DriverManager.getConnection
方法得到了增强,可以自动加载 JDBC 驱动程序。因此,应用程序在使用sqljdbc4.jar、sqljdbc41.jar或sqljdbc42.jar类库时,不需要调用Class.forName方法来注册或加载驱动。
当调用 DriverManager 类的 getConnection 方法时,会从已注册的 JDBC 驱动程序集中找到一个合适的驱动程序。 sqljdbc4.jar、sqljdbc41.jar 或 sqljdbc42.jar 文件包含"META-INF/services/java.sql.Driver"
文件,其中包含com.microsoft.sqlserver.jdbc.SQLServerDriver
作为注册驱动程序。当前使用Class.forName
方法加载驱动程序的现有应用程序将继续工作而无需修改。
资源链接:
所有数据均来自以下-
-
Using the JDBC Driver
HOW TO: Get Started with Microsoft JDBC
ClassNotFoundException - com.microsoft.jdbc.sqlserver.SQLServerDriver
【讨论】:
【参考方案2】:CLASSPATH 变量是 Java 虚拟机 (JVM) 用于在您的计算机上定位 JDBC 驱动程序的搜索字符串。如果驱动程序未列在 CLASSPATH 变量中,则在尝试加载驱动程序时会收到以下错误消息: java.lang.ClassNotFoundException: com/microsoft/jdbc/sqlserver/SQLServerDriver
检查您的课程路径,让我知道这是否是问题所在。
【讨论】:
【参考方案3】:您的类路径中不需要 jTDS 和 JDBC。任何一个都是必需的。您很可能只需要 sqljdbc.jar。确保将它放在项目的 WEB-INF 目录中的诸如 lib 之类的心理位置,而不是通过 IDE 将其添加到类路径中。重置您的服务,然后重试。它应该自己修复它。
Jar 文件可以在这里找到: www.java2s.com/Code/JarDownload/sqlserverjdbc/sqlserverjdbc.jar.zip
【讨论】:
以上是关于JDBC未连接到Web服务中的数据库的主要内容,如果未能解决你的问题,请参考以下文章
Docker中的Spring Boot未连接到Docker中的Mongo
Spring GCP 服务未连接到 Cloud SQL 数据库
Tomcat 未连接到 SQL Server Express