2013-04-13 101 views
3

我試圖通過休眠連接到Microsoft SQL 2008服務器。 以下是我的hibernate.cfg.xml文件:將休眠連接到Microsoft SQL 2008服務器

<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。 我也試過在一個點上使用windows身份驗證,在URL字符串的末尾添加; IntegratedSecurity = true。 除此之外,我一直在服務器屬性中查找,以確保我提供的實例和端口是正確的。我嘗試過:telnet localhost 1433,無法連接,但可以使用SQL進行連接Server Management Studio。 進一步我使用NetStat -o在cmd和TaskList/FI「PID eq 4072」/ FO LIST/V來嘗試跟蹤sql server以確認端口aswell.奇怪的是我無法追查到sql server這它在NetStat列表中沒有出現,但如果我直接使用服務器的PID,它會顯示有關它的詳細信息,但狀態爲未知,會話號爲0,用戶名爲N/A。

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

請告訴我是否需要其他信息,第一次發佈在這裏。

+0

SQL工作室可以使用管道,而不是套接字。在你調整你的SQL服務器來監聽一個端口之前,沒有必要在Java中做任何事情。從這裏開始:http://stackoverflow.com/questions/1518823/how-to-find-the-port-for-ms-sql-server-2008 – kan

回答

7

我想你的SQL Server實例沒有在1433處爲TCP連接服務。 要識別端口:

  • 轉到SQL Server配置管理。
  • 選擇SQL Server網絡配置
    • 圍棋的協議爲實例
    • 點擊TCP IP(啓用它,如果沒有啓用,則客戶端可以使用TCP/IP連接)
    • 在彈出的這結果,選擇IP地址標籤
    • 向下滾動
    • 你會看到TCP動態端口第IPAll
    • 搶重視,這就是你應該使用
+0

非常感謝回覆,這解決了我的問題,結果證明TCP IP被禁用和動態端口也是如此。遺憾的是無法投票答覆您的答案,否則我會。 – Vinc

7

真的,真的,真的檢查TCP/IP協議在您的SQL Server實例啓用的端口。

按照以下步驟(測試SS2012),以確保:在

  • 打開 「SQL Server配置管理」 「開始菜單\程序\ Microsoft SQL Server的2012 \配置工具\」
  • 展開 「SQL Server網絡配置」
  • 圍棋中的 「協議<YourInstance>
  • 啓用TCP/IP

如果您有任何問題,請查看this blog post瞭解詳情,因爲它包含屏幕截圖和更多信息。

還要檢查是否的 「SQL Server瀏覽器」 窗口服務被激活並運行

  • 進入控制面板 - >管理工具 - >服務
  • 打開 「SQL Server瀏覽器」 服務,啓用它(使其手動或自動,取決於您的需求)
  • 啓動它。

就是這樣。

在我安裝了新的本地SQL Server之後,我所要做的就是啓用TCP/IP並啓動SQL Server Browser服務。

下面的代碼我用來測試連接到一個SQLEXPRESS本地實例。當然,根據需要:

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(); 
     } 
    } 
} 

應該更改IP,數據庫名和用戶名/密碼,如果你使用Maven,添加到您的pom.xml:

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

嗨,謝謝你的迴應,不幸的是我不能接受兩個答案或者投票,但這也是有效的。 – Vinc

+0

@Vinc沒有問題!你應該接受你的嘗試併爲你工作。乾杯! – acdcjunior

+0

感謝您檢查「SQL Server瀏覽器」窗口服務是否已激活並正在運行「部分。救了我! – Osmar