【问题标题】:How do I generate a JDBC database URL?如何生成 JDBC 数据库 URL?
【发布时间】:2014-07-01 18:31:27
【问题描述】:

我今天已经研究了大约 3 个小时,我觉得我已经接近了,但我有几个问题。到目前为止,我发现的最佳信息来源是:https://stackoverflow.com/a/2840358,但它并不能回答我所有的问题。

一点背景知识:我使用的是 Microsoft SQL Server 2014,并且我已经验证了 IP 地址 127.0.0.1 是活动的并使用端口 1433 启用。我通过 SQL Server 程序连接到数据库没有问题同一台机器,但我试图通过我正在编写的 Java 程序进行连接,它当前给出了这个错误:com.microsoft.sqlserver.jdbc.SQLServerException:端口号 1433/R2M_Database 无效。我对此感到困惑,因为我知道端口 1433 是正确的,并且我知道我要连接的数据库称为 R2M_Database。现在,这是我的问题以及我的源代码。

1.) “mysql”和“sqlserver”子协议有什么区别,我怎么知道要使用哪个? (我很确定我应该使用 sqlserver,但以防万一)

2.) 如何确保使用正确的主机名? (我很确定 127.0.0.1 / localhost 是我应该使用的,但是我如何才能从其他机器运行这个程序来访问数据库?)

3.) 是否有任何外部问题可能导致此问题,例如防火墙或密码要求? (我相当确定用户名和密码是正确的,因为它们是我用来在 Microsoft SQL Server 2014 中成功建立连接的用户名和密码)

编辑:

import java.sql.DriverManager;
import java.io.BufferedReader;
import java.io.FileReader;
import org.apache.ibatis.jdbc.ScriptRunner;

public class SQLTest {
    public static void main(String[] args){
        String script = "CreatePersons.sql";
        try {
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
            new ScriptRunner(DriverManager.getConnection("jdbc:sqlserver://127.0.0.1:1433;databaseName=R2M_Database", userName, password))
                    .runScript(new BufferedReader(new FileReader(script)));
        } catch (Exception e) {
            System.err.println(e);
        }
    }
}

我做了一个小的语法更改(;databaseName= 而不是 /),现在我收到了这个错误:

com.microsoft.sqlserver.jdbc.SQLServerException:用户“RSquaredMacro”登录失败。 ClientConnectionId:35281a40-0f87-42e4-bc46-b9a81a371529

【问题讨论】:

  • 如果您在连接时遇到问题,很可能是您尚未在端口 1433 上启用 TCP/IP 侦听器。快速的“netstat -an”命令会告诉您它是否正在侦听.检查并评论你得到了什么???
  • 这是我做“netstat -an”时得到的:Image of log
  • 根据你的图,端口号。 1433在听。所以,这根本不是问题!

标签: java sql-server database jdbc


【解决方案1】:
  1. mysql 是完全不同的数据库服务器。不要将它用于 SQL Server。

  2. 您需要为您的数据库服务器提供一个公共地址。只要您的所有客户都能看到它,IP 或主机名都可以。如果你没有,你可以尝试使用 dyndns.org 或类似的东西。请注意,您的客户端仍然需要能够访问网络上的服务器(潜在的防火墙问题)。如果不了解您的情况,很难说更多。

  3. 防火墙可能是个问题,但这对于 localhost 来说不太可能。我猜问题出在 TCP/IP 侦听器、用户名、密码或数据库名称设置上。

这是一个链接,其中包含有关构建 JDBC 连接字符串的更多信息:http://technet.microsoft.com/en-us/library/ms378428%28v=sql.110%29.aspx

还有一些旁注:

  1. 您不需要包含 1433 端口号。

  2. 打印整个堆栈跟踪将帮助您进行调试。 (见下面的代码)

  3. 您应该为您的连接声明一个变量并确保 它被关闭了。示例:

    Connection c = null;
    try {
        Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
        c = DriverManager.getConnection("jdbc:sqlserver://127.0.0.1:1433/R2M_Database", userName, password);
        new ScriptRunner(c).runScript(new BufferedReader(new FileReader(script)));
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (c != null) try { c.close(); } catch (Exception e) { }
    }
    

【讨论】:

  • 感谢您的帮助,我会查看 dyndns.org。我正在寻找的端口似乎正在根据我运行的 netstat -an 命令进行侦听。我查看了更多文档,并进行了编辑,使您的密码/用户名理论看起来很可能,但我今天已成功使用此密码和用户名。
  • 密码中是否有特殊字符(尤其是反斜杠)?尝试使用System.err.println("passwd="+password) 确认值。
  • 密码打印正确。它是一串没有特殊字符的数字和字母。
【解决方案2】:

原来问题出在我的 JDBC URL 的格式上。我遇到的问题是不同的子协议对它们的 URL-s 有不同的语法,但是下面列出了 sqlserver 协议的语法(以及如何找到每个部分):

"jdbc:sqlserver://" + serverName + ";database=" + databaseName

1.) serverName:要查找您的服务器名称,请连接到 Microsoft SQL Server(这些说明基于 SQL Server 2014),然后查看右侧的“属性”窗格。在顶部的组合框中选择“当前连接参数”,然后在“连接详细信息”下查看“服务器名称”字段。

2.) databaseName:这个非常简单,因为它是您要从中访问数据的数据库的名称。即使您登录的用户列在“master”数据库下,您也不必登录“master”,而是可以使用任何您想要的数据库,只要您登录的用户具有权限去做你想要完成的任务。

最后:这里是帮助我最终解决问题的链接,更详细:http://www.programcreek.com/2010/05/java-code-for-connecting-ms-sql-server-by-using-sql-server-authentication/

【讨论】:

    猜你喜欢
    • 2016-12-04
    • 2016-08-16
    • 2016-07-28
    • 2015-12-13
    • 1970-01-01
    • 1970-01-01
    • 2014-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多