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\Ms​​base.jar

\您的安装路径\Lib\Ms​​util.jar

\您的安装路径\Lib\Ms​​sqlserver.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.04.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服务中的数据库的主要内容,如果未能解决你的问题,请参考以下文章

WAR 文件部署未连接到 MySQL

Docker中的Spring Boot未连接到Docker中的Mongo

Spring GCP 服务未连接到 Cloud SQL 数据库

Tomcat 未连接到 SQL Server Express

Oracle Developer's guide 10g 未连接到服务器

在主机未连接到网络时连接到 vmware 播放器中的服务器