簡體   English   中英

使用hibernate連接到Microsoft SQL 2008服務器

[英]Connecting with hibernate to a Microsoft SQL 2008 server

我試圖通過hibernate連接到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。 我還嘗試通過在url字符串的末尾添加; IntegratedSecurity = true來一次使用Windows身份驗證。 除此之外,我一直在服務器屬性中尋找,以確保我提供的實例是正確的以及port.I已經嘗試過:telnet localhost 1433並且無法以這種方式連接,但我可以使用SQL Server進行連接管理工作室。 此外,我在cmd和TaskList / FI“PID eq 4072”/ FO LIST / V中使用NetStat -o來嘗試跟蹤sql server以確認端口以及。奇怪的是我無法通過這種方式跟蹤sql server 。它沒有出現在NetStat列表中,但如果我直接使用服務器的PID,它會顯示有關它的詳細信息,除了狀態為未知,會話#為0且用戶名為N / A.

我使用Hibernate 4.2.0和SQLJDBC4,當我使用JTDS時它是1.2.7。 java -version的輸出:java版“1.6.0_30”Java(TM)SE運行時環境(版本1.6.0_30-b12)Java HotSpot(TM)64位服務器VM(版本20.5-b03,混合模式)

如果需要任何其他信息,請告訴我,第一次發布在這里。

我認為您的SQL Server實例不在1433為TCP連接提供服務。 識別端口:

  • 轉到SQL Server配置管理器。
  • 選擇SQL Server網絡配置
    • 轉到您的實例的協議
    • 單擊TCP IP (如果未啟用則啟用它,然后客戶端可以使用TCP / IP連接)
    • 在彈出的結果上,選擇IP地址選項卡
    • 向下滾動
    • 您將在IPAll部分中看到TCP動態端口
    • 抓住那個值,這就是你應該使用的端口

真的,真的,真的,檢查您的SQL Server實例中是否啟用了TCP / IP協議。

請遵循以下步驟(針對SS2012進行測試)以確保:

  • 在“開始菜單\\程序\\ Microsoft SQL Server 2012 \\配置工具”中打開“ 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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM