【问题标题】:Create a jTDS connection string创建 jTDS 连接字符串
【发布时间】:2025-09-29 07:00:01
【问题描述】:

我的 sql 服务器实例名称是 MYPC\SQLEXPRESS,我正在尝试创建一个 jTDS 连接字符串以连接到数据库“博客”。任何人都可以帮我完成吗?

我正在尝试这样做:

DriverManager.getConnection("jdbc:jtds:sqlserver://127.0.0.1:1433/Blog", "user", "password");

我明白了:

 java.sql.SQLException: Network error IOException: Connection refused: connect
    at net.sourceforge.jtds.jdbc.ConnectionJDBC2.<init>(ConnectionJDBC2.java:395)
    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(Unknown Source)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at SqlConnection.Connect(SqlConnection.java:19)
    at main.main(main.java:11)
Caused by: java.net.ConnectException: Connection refused: connect
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.PlainSocketImpl.doConnect(Unknown Source)
    at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
    at java.net.PlainSocketImpl.connect(Unknown Source)
    at java.net.SocksSocketImpl.connect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at net.sourceforge.jtds.jdbc.SharedSocket.createSocketForJDBC3(SharedSocket.java:305)
    at net.sourceforge.jtds.jdbc.SharedSocket.<init>(SharedSocket.java:255)
    at net.sourceforge.jtds.jdbc.ConnectionJDBC2.<init>(ConnectionJDBC2.java:323)
    ... 6 more

【问题讨论】:

    标签: java jdbc connection-string jtds


    【解决方案1】:

    SQLServer 通过端口 1433 运行默认实例。如果将端口指定为端口 1433,SQLServer 将仅查找默认实例。默认实例的名称是在安装时创建的,通常是 SQLEXPRESSxxx_xx_ENU

    实例名称也与在 Program Files -> Microsoft SQL Server 中创建的文件夹名称相匹配。因此,如果您查看那里并看到一个名为 SQLEXPRESSxxx_xx_ENU 的文件夹,它就是默认实例。

    名为 MSSQL12.myInstanceName 的文件夹(对于 SQLServer 2012)是 SQL Server 中的命名实例,并且通过端口 1433 访问。

    因此,如果您的程序正在访问数据库中的默认实例,请指定端口 1433,您可能不需要指定实例名称。

    如果您的程序正在访问数据库中的命名实例(不是默认实例)请勿指定端口,但您必须指定实例名称。

    我希望这能澄清由上述错误引起的一些困惑。

    【讨论】:

    • "SQLServer 在端口 1433 上运行默认实例" 不,默认情况下它使用动态端口。此外,我从不指定实例名称,因此我不必运行 SQL 浏览器。每个实例监听不同的 IP/端口组合,两个进程不能监听同一个 IP/端口组合。
    • 我使用固定端口的命名实例,这仅适用于默认参数
    【解决方案2】:

    真的,真的,真的检查你的本地 SQLEXPRESS 实例中是否启用了 TCP/IP 协议。

    按照以下步骤确保:

    • 在“开始菜单\程序\Microsoft SQL Server 2012\配置工具\”中打开“Sql Server 配置管理器
    • 展开“SQL Server 网络配置”
    • 进入“SQLEXPRESS 协议”
    • 启用 TCP/IP

    如果您有任何问题,请查看this blog post 了解详情,因为它包含屏幕截图和更多信息。

    同时检查“SQL Server Browser”windows 服务是否已激活并正在运行

    • 转到控制面板 -> 管理工具 -> 服务
    • 打开“SQL Server Browser”服务并启用它(手动或自动,取决于您的需要)
    • 开始吧。

    就是这样。

    安装全新的本地 SQLExpress 后,我所要做的就是启用 TCP/IP 并启动 SQL Server Browser 服务。

    下面是我用来测试 SQLEXPRESS 本地连接的代码。当然,您应该根据需要更改 IP、DatabaseName 和用户/密码。:

    import java.sql.Connection;
    import java.sql.DatabaseMetaData;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    
    public class JtdsSqlExpressInstanceConnect {
        public static void main(String[] args) throws SQLException {
            Connection conn = null;
            ResultSet rs = null;
            String url = "jdbc:jtds:sqlserver://127.0.0.1;instance=SQLEXPRESS;DatabaseName=master";
            String driver = "net.sourceforge.jtds.jdbc.Driver";
            String userName = "user";
            String password = "password";
            try {
                Class.forName(driver);
                conn = DriverManager.getConnection(url, userName, password);
                System.out.println("Connected to the database!!! Getting table list...");
                DatabaseMetaData dbm = conn.getMetaData();
                rs = dbm.getTables(null, null, "%", new String[] { "TABLE" });
                while (rs.next()) { System.out.println(rs.getString("TABLE_NAME")); }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                conn.close();
                rs.close();
            }
        }
    }
    

    如果您使用 Maven,请将其添加到您的 pom.xml:

    <dependency>
        <groupId>net.sourceforge.jtds</groupId>
        <artifactId>jtds</artifactId>
        <version>1.2.4</version>
    </dependency>
    

    【讨论】:

    • 并确保您使用的是静态端口 = 1433 - 而不是“全部 IP”设置下的动态端口。
    • 哇,“SQL Server Browser”为我做了什么,最后非常感谢。谁能解释一下这是做什么的?
    【解决方案3】:

    jdbc:jtds:sqlserver://x.x.x.x/databasex.x.x.x 替换为 SQL Server 计算机的 IP 或主机名。

    jdbc:jtds:sqlserver://MYPC/Blog;instance=SQLEXPRESS

    jdbc:jtds:sqlserver://MYPC:1433/Blog;instance=SQLEXPRESS

    如果您也想在连接字符串中设置用户名和密码,而不是单独针对连接对象:

    jdbc:jtds:sqlserver://MYPC/Blog;instance=SQLEXPRESS;user=foo;password=bar

    (更新了我的错误信息并添加了对instance syntax的引用)

    【讨论】:

    • 你在哪里指定数据库名称?
    • 正如 Pratik 和 Pascal 提到的,您应该验证服务器是否在端口 1433 上运行。
    • sqlexpress 不是数据库名,是实例名
    【解决方案4】:

    如jTDSFrequenlty Asked Questions中详述,jTDS的URL格式为:

    jdbc:jtds:<server_type>://<server>[:<port>][/<database>][;<property>=<value>[;...]]
    

    因此,要连接到由运行在MYPC 上的 MS SQL Server 托管的名为“Blog”的数据库,您可能会得到如下结果:

    jdbc:jtds:sqlserver://MYPC:1433/Blog;instance=SQLEXPRESS;user=sa;password=s3cr3t
    

    或者,如果您更喜欢使用getConnection(url, "sa", "s3cr3t")

    jdbc:jtds:sqlserver://MYPC:1433/Blog;instance=SQLEXPRESS
    

    编辑:关于您的Connection refused 错误,请仔细检查您是否在端口 1433 上运行 SQL Server,该服务正在运行,并且您没有防火墙阻止传入连接。

    【讨论】:

    • 在我在 sql server 配置管理器的 SQLEXPRESS 协议中启用了一些 tcp、via、管道后,您的最后一个连接字符串有效
    • 谢谢伙计,第一个使用 SQL SERVER 2000 为我工作
    • 为数据源添加instance 属性,不要将实例添加到databaseName
    • 谢谢。这是在尝试将其配置为使用 Windows 身份验证时对我有用的方法:jdbc:jtds:sqlserver://[servername]:1433/[DBName];domain=[DomainName];user=[username];password=[password ]
    • 7 年后,这篇文章帮了我很大的忙。查找 sql server 的 IP 的提示:在凭据前使用“tcp:”登录,然后运行此查询:SELECT c.local_net_address FROM sys.dm_exec_connections AS c WHERE c.session_id = @@SPID;
    【解决方案5】:

    在黑暗中拍摄,但是 从您的错误消息来看,似乎 sqlserver 实例未在端口 1433 上运行,或者某些东西阻止了对该端口的请求

    【讨论】: