3

我正在尝试通过休眠连接到 Microsoft SQL 2008 服务器。以下是我的 hibernate.cfg.xml 文件:

<hibernate-configuration>
    <session-factory>
        <property name="hibernate.dialect">org.hibernate.dialect.SQLServer2008Dialect</property>
        <property name="connection.driver_class">com.microsoft.sqlserver.jdbc.SQLServerDriver</property>
        <property name="connection.url">jdbc:sqlserver://127.0.0.1:1433;databaseName=myDBName;instanceName=myInstanceName;</property>
        <property name="hibernate.connection.username">user</property>
        <property name="hibernate.connection.password">pass</property>

        <mapping resource="Obj.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

这是我用来尝试建立连接并进行查询的代码:

import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;

public class SessionsTest {
    private static SessionFactory sessionFactory;
    private static ServiceRegistry serviceRegistry;

    /**
     * @param args
     */
    @SuppressWarnings({ "unchecked"})
    public static void main(String[] args) {
        sessionFactory = configureSessionFactory();

        Session session = sessionFactory.openSession();
        session.beginTransaction();

        List<Obj> result = (List<Obj>) session.createQuery("FROM Obj").list();

        for (Obj obj : result ) {
            System.out.println(obj.getObjID());
        }

        session.getTransaction().commit();
        session.close();

        if ( sessionFactory != null ) {
            sessionFactory.close();
        }
    }

    private static SessionFactory configureSessionFactory() throws HibernateException {
        Configuration config = new Configuration();
        configuration.configure();
        serviceRegistry = new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();            
        sessionFactory = config.buildSessionFactory(serviceRegistry);
        return sessionFactory;
    }
}

我得到的堆栈跟踪:

2013-04-13 15:02:03,449 [main] WARN  org.hibernate.engine.jdbc.spi.SqlExceptionHelper - SQL Error: 0, SQLState: 08S01
2013-04-13 15:02:03,449 [main] ERROR org.hibernate.engine.jdbc.spi.SqlExceptionHelper - The TCP/IP connection to the host 127.0.0.1, port 1433 has failed. Error: "Connection refused: connect. Verify the connection properties, check that an instance of SQL Server is running on the host and accepting TCP/IP connections at the port, and that no firewall is blocking TCP connections to the port.".
Exception in thread "main" org.hibernate.exception.JDBCConnectionException: Could not open connection
    at org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:131)
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:110)
    at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.obtainConnection(LogicalConnectionImpl.java:221)
    at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.getConnection(LogicalConnectionImpl.java:157)
    at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.doBegin(JdbcTransaction.java:67)
    at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.begin(AbstractTransactionImpl.java:160)
    at org.hibernate.internal.SessionImpl.beginTransaction(SessionImpl.java:1425)
    at com.test.test.ObjTest.main(ObjTest.java:24)
Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: The TCP/IP connection to the host 127.0.0.1, port 1433 has failed. Error: "Connection refused: connect. Verify the connection properties, check that an instance of SQL Server is running on the host and accepting TCP/IP connections at the port, and that no firewall is blocking TCP connections to the port.".
    at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:171)
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectHelper(SQLServerConnection.java:1033)
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.login(SQLServerConnection.java:817)
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.connect(SQLServerConnection.java:700)
    at com.microsoft.sqlserver.jdbc.SQLServerDriver.connect(SQLServerDriver.java:842)
    at org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl.getConnection(DriverManagerConnectionProviderImpl.java:204)
    at org.hibernate.internal.AbstractSessionImpl$NonContextualJdbcConnectionAccess.obtainConnection(AbstractSessionImpl.java:292)
    at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.obtainConnection(LogicalConnectionImpl.java:214)
    ... 5 more

我尝试使用不同的驱动程序(JTDS)。我尝试过以各种方式更改 URL 字符串。我尝试将我的方言更改为 org.hibernate.dialect.SQLServerDialect。我还尝试通过将 ;IntegratedSecurity=true 添加到 url 字符串的末尾来使用 Windows 身份验证。除此之外,我一直在服务器属性中四处寻找以确保我提供的实例以及端口都是正确的。我尝试过:telnet localhost 1433 并且无法以这种方式连接,但我可以使用 SQL Server 进行连接管理工作室。此外,我在 cmd 和 TaskList /FI "PID eq 4072" /FO LIST /V 中使用 NetStat -o 来尝试追踪 sql server 以确认端口。奇怪的是我无法以这种方式追踪 sql server .它没有出现在 NetStat 列表中,

我使用 Hibernate 4.2.0 和 SQLJDBC4,当我使用 JTDS 时它是 1.2.7。java -version 的输出: java version "1.6.0_30" Java(TM) SE Runtime Environment (build 1.6.0_30-b12) Java HotSpot(TM) 64-Bit Server VM (build 20.5-b03,混合模式)

请告诉我是否需要任何其他信息,第一次在这里发布。

4

2 回答 2

7

我认为您的 SQL Server 实例未在 1433 处为 TCP 连接提供服务。 识别端口:

  • 转到 SQL Server 配置管理器。
  • 选择 SQL Server 网络配置
    • 为您的实例寻找协议
    • 点击TCP IP(如果没有启用,则启用它,然后客户端可以使用 TCP/IP 连接)
    • 在弹出的结果中,选择IP 地址选项卡
    • 向下滚动
    • 您将在IPAll部分中看到 TCP 动态端口
    • 抓住那个值,这就是你应该使用的端口
于 2013-04-13T14:54:03.043 回答
7

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

请按照以下步骤(针对 SS2012 测试)以确保:

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

如果您有任何问题,请查看此博客文章了解详细信息,因为它包含屏幕截图和更多信息。

还要检查“SQL Server Browser”窗口服务是否已激活并正在运行

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

而已。

在我安装了新的本地 SQL Server 后,我所要做的就是启用 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>
于 2013-04-13T22:55:14.470 回答