2012-10-08 23 views
8

提交階段總是失敗,此錯誤:動態發佈到具有實例名稱(JDBC)的Tridion Broker數據庫時的連接問題?

Committing Deployment Failed 
Phase: Deployment Prepare Commit Phase failed, Unable to prepare transaction: tcm:0515104-66560, 
org.hibernate.exception.JDBCConnectionException: Cannot open connection, 
org.hibernate.exception.JDBCConnectionException: Cannot open connection, Unable to prepare transaction: tcm:0-515104-66560, 
org.hibernate.exception.JDBCConnectionException: Cannot open connection, 
org.hibernate.exception.JDBCConnectionException: Cannot open connection 

這是數據庫的默認實例(DEV/UAT),工程配置:

<Storage Type="persistence" Id="brokerdb" dialect="MSSQL" Class="com.tridion.storage.persistence.JPADAOFactory"> 
      <Pool Type="jdbc" Size="5" MonitorInterval="60" IdleTimeout="120" CheckoutTimeout="120" /> 
      <DataSource Class="com.microsoft.sqlserver.jdbc.SQLServerDataSource"> 
       <Property Name="serverName" Value="ourServerName" /> 
       <Property Name="portNumber" Value="1433" /> 
       <Property Name="databaseName" Value="Tridion_Broker" /> 
       <Property Name="user" Value="TridionBrokerUser" /> 
       <Property Name="password" Value="xxxxxxxxpassxx" /> 
      </DataSource> 
     </Storage> 

然而,對於我們的生產使用命名實例是不可避免的。所以我們嘗試了這種配置來傳遞實例的名字,但無濟於事。我們仍然得到錯誤。

<Storage Type="persistence" Class="com.tridion.storage.persistence.JPADAOFactory" 
    Id="brokerdb" 
    Url="jdbc:sqlserver://ourServerName/Tridion_Broker;instanceName=THE_INSTANCE_NAME;domain=DOMAIN_NAME" 
    Username="TridionBrokerUser" 
    Password="xxxxxxxxpassxx" 
    Driver="com.microsoft.sqlserver.jdbc.SQLServerDataSource"> 
    <Pool Type="jdbc" Size="5" MonitorInterval="60" IdleTimeout="120" CheckoutTimeout="120"/> 
</Storage> 

連接字符串有什麼問題嗎?或者有沒有辦法使用第一種模式傳遞實例名稱;例如說<Property Name="instanceName" Value="THE_INSTANCE_NAME" />

回答

6

Nikoli和Gertjan的reference都讓我意識到實例名稱不是必需的。 另一種方法是指定運行實例的端口。

這個article告訴我如何知道哪個端口正在用於實例。

這種配置工作:

<Storage Type="persistence" Id="brokerdb" dialect="MSSQL" Class="com.tridion.storage.persistence.JPADAOFactory"> 
     <Pool Type="jdbc" Size="5" MonitorInterval="60" IdleTimeout="120" CheckoutTimeout="120" /> 
     <DataSource Class="com.microsoft.sqlserver.jdbc.SQLServerDataSource"> 
      <Property Name="serverName" Value="ourServerName" /> 
      <Property Name="portNumber" Value="43333" /> 
      <Property Name="databaseName" Value="Tridion_Broker" /> 
      <Property Name="user" Value="TridionBrokerUser" /> 
      <Property Name="password" Value="xxxxxxxxpassxx" /> 
     </DataSource> 
    </Storage> 

我也嘗試連接字符串的方法和它的工作,太:

<Storage Type="persistence" Class="com.tridion.storage.persistence.JPADAOFactory" 
    dialect="MSSQL" 
    Id="brokerdb" 
    Url="jdbc:sqlserver://ourServerName:43333;databaseName=Tridion_Broker;" 
    Username="TridionBrokerUser" Password="xxxxxxxxpassxx" 
    Driver="com.microsoft.sqlserver.jdbc.SQLServerDataSource"> 
    <Pool Type="jdbc2" Size="5" MonitorInterval="60" IdleTimeout="120" CheckoutTimeout="120"/> 
</Storage> 
+0

如果以下任何答覆回答了您的問題,您是否可以接受該答案作爲答案,以便對其他社區成員有所幫助。 –

3

你可以嘗試以下方法:

<Property Name="serverName" Value="ourServerName\ourInstanceName" /> 
+0

謝謝,Puntero。我也試過這個,但沒有奏效。 –

2

你原來指定URL的語法是正確的,但是,在檢查documentation,我似乎無法找到名爲「域」的有效屬性。這可能是你的罪魁禍首。嘗試使用'\'在用戶名中指定域。

+0

你說得對,我們的案例中不需要域名。它是解決方案的組成部分。謝謝。 –

2

根據這個MSDN文章: http://msdn.microsoft.com/en-us/library/ms378428.aspx

你應該這樣配置它:

jdbc:sqlserver://[serverName[\instanceName][:portNumber]][;property=value[;property=value]] 
+0

您還似乎缺少存儲元素上的dialect =「MSSQL」屬性 –

1

你應該既包括服務器名和實例名。

<Storage Type="persistence" Id="brokerdb" dialect="MSSQL" Class="com.tridion.storage.persistence.JPADAOFactory"> 
    <Pool Type="jdbc" Size="5" MonitorInterval="60" IdleTimeout="120" CheckoutTimeout="120" /> 
    <DataSource Class="com.microsoft.sqlserver.jdbc.SQLServerDataSource"> 
     <Property Name="serverName" Value="ourServerName\\THE_INSTANCE_NAME" /> 
     <Property Name="portNumber" Value="1433" /> 
     <Property Name="databaseName" Value="Tridion_Broker" /> 
     <Property Name="user" Value="TridionBrokerUser" /> 
     <Property Name="password" Value="xxxxxxxxpassxx" /> 
    </DataSource> 
</Storage>​ 

另一種方式,我已經改變URL點點這個老表示

<Storage Type="persistence" Class="com.tridion.storage.persistence.JPADAOFactory" Id="brokerdb" Url="jdbc:sqlserver://ourServerName;instanceName=THE_INSTANCE_NAME;databaseName=Tridion_Broker;integratedSecurity=true;" Username="TridionBrokerUser" Password="xxxxxxxxpassxx" Driver="com.microsoft.sqlserver.jdbc.SQLServerDataSource"> 
    <Pool Type="jdbc" Size="5" MonitorInterval="60" IdleTimeout="120" CheckoutTimeout="120"/> 
</Storage> 

嘗試這些URL爲上述老表示: -

  1. jdbc:sqlserver://ourServerName\\THE_INSTANCE_NAME;databaseName=Tridion_Broker;integratedSecurity=true;

  2. jdbc:sqlserver://ourServerName\THE_INSTANCE_NAME;databaseName=Tridion_Broker;integratedSecurity=true;

  3. jdbc:sqlserver://ourServerName;instanceName=THE_INSTANCE_NAME;databaseName=Tridion_Broker;integratedSecurity=true;​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​

  4. jdbc:sqlserver://ourServerName/Tridion_Broker;instanceName=THE_INSTANCE_NAME;domain=DOMAIN_NAME;

爲了您參考: -

  1. Building the Connection URL
  2. Setting the Connection Properties
+0

'不起作用。這與普特羅的答案相同。至於「連接字符串」方法,#2沒有使用'integratedSecurity'參數。 –