2015-05-08 36 views
4

我的應用程序託管在一個服務於許多客戶的中央服務器上。現在需要與駐留在客戶位置的數據庫服務器交叉引用信息。我可以在運行時指定動態數據源嗎?

我想將客戶服務器的詳細信息與其帳戶詳細信息(例如數據庫名稱,主機,端口等)一起存儲。

但是,根據誰登錄到應用程序,我需要將他們的數據連接詳細信息提供給<cfquery>函數以執行查找。事情是這樣的:

<cfquery name="rsOrders" datasource="{dynamically provided connection string}"> 
SELECT * 
FROM 
CompanysDBTable 
</cfquery> 

據我所知,有一個管理員API以編程方式創建一個數據源,但是使用這將意味着額外的過程在我的系統,並會發生什麼,如果數據源的詳細信息將被更新由客戶?

那麼有什麼辦法可以像上面那樣在飛行中做到這一點嗎?也就是說,在<cfquery>標籤內提供數據連接字符串。

或者還有更好的方法來完成這個嗎?

回答

6

您可以在運行時在ColdFusion 11中創建特定於應用程序的數據源。請參閱文檔「Application-specific datasources in Application.cfc」。我也在我的博客中討論這個問題:「Defining datasources in Application.cfc」。

一個例子是:

// Application.cfc 
component { 

    this.name = "DSNTest02"; 
    this.datasources = { 
     scratch_mssql_app = { 
      database = "scratch", 
      host  = "localhost", 
      port  = "1433", 
      driver  = "MSSQLServer", 
      username = "scratch", 
      password = "scratch" 
     }, 
     scratch_embedded_app = { 
      database = "C:\apps\adobe\ColdFusion\11\full\cfusion\db\scratch", 
      driver  = "Apache Derby Embedded" 
     } 
    }; 
    this.datasource = "scratch_mssql_app"; 

} 

那就是你可以在ColdFusion得到最接近的一次。

如果您要直接使用JDBC,則只需在創建連接時提供連接字符串,但是您的代碼需要與由JDBC驅動程序返回的記錄集進行競爭,這不會是CFML查詢對象。

+0

我可以使用管理API更新現有的數據源並創建新的數據源嗎?如果客戶要更改服務器的詳細信息,我需要更新CF中的相關數據源,而不是每次都創建一個新的數據源。 –

+0

你爲什麼不自己嘗試一下,而不是要求其他人爲你做你的工作? –

+0

我只是問它是否可能,而不是你做的工作。這似乎是可能的,所以這可能是最好的辦法。感謝Adam –

4

當您獲取連接憑證時,請在ColdFusion中設置一個適當命名的數據源。將此數據源的名稱放入包含您提及的其他帳戶詳細信息的數據庫中。對於未向您發送憑證的客戶,請使用默認數據源。

當您運行您的應用程序時,獲取數據源以及其他客戶信息並在您的cfquery標籤中使用它。

+0

我一直在思考。我只是想知道如何處理數據源的更新,例如如果客戶的服務器發生變化。我可以更新現有數據源並使用管理API創建新的數據源嗎? –

+0

您可以像處理任何其他數據源更新一樣處理它。至於在管理API中可以做什麼,請登錄並親自查看。 –

+0

我認爲它只能創建DSN,但它看起來像只要我指定相同的名稱,它應該做一個更新。看起來不錯。 –

相關問題