2015-05-08 135 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,但它看起来像只要我指定相同的名称,它应该做一个更新。看起来不错。 –

相关问题