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を使用して接続できます管理スタジオ。さらに、NetStat -o in cmd および TaskList /FI "PID eq 4072" /FO LIST /V を使用して、SQL サーバーを追跡し、ポートも確認しました。奇妙なことに、この方法で SQL サーバーを追跡できませんでした。 .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 インスタンスが TCP 接続の 1433 でサービスを提供していないと思います。 ポートを識別するには:

  • 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 Configuration Manager 」を開きます。
  • 「SQL Server ネットワーク構成」を展開します
  • 「Protocols for <YourInstance>」に入ります
  • TCP/IP を有効にする

問題が発生した場合は、このブログ投稿で詳細を確認してください。スクリーンショットやその他の情報が含まれています。

また、「SQL Server Browser」Windows サービスがアクティブ化され、実行されているかどうかを確認します。

  • [コントロール パネル] -> [管理ツール] -> [サービス] に移動します。
  • 「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 に答える