我可以在运行时指定动态数据源吗?

时间:2015-05-08 11:28:18

标签: coldfusion coldfusion-11

我的应用程序托管在为许多客户提供服务的中央服务器上。现在,它需要与位于客户所在地的数据库服务器交叉引用信息。

我想存储客户服务器的详细信息以及他们的帐户详细信息(例如dbname,host,port等)。

但是,根据谁登录到应用程序,我需要将其数据连接详细信息提供给<cfquery>函数以执行查找。像这样:

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

我知道有一个管理员API以编程方式创建数据源,但是使用它会意味着我的系统中会有额外的过程,如果客户要更新数据源详细信息会怎样?

那么有没有办法像上面那样在飞行中做到这一点?也就是说,在<cfquery>标记内提供数据连接字符串。

或者有更好的方法完全这样做吗?

2 个答案:

答案 0 :(得分:6)

您可以在ColdFusion 11中在运行时创建特定于应用程序的数据源。请参阅文档:&#34; Application-specific datasources in Application.cfc&#34;。我也在我的博客中讨论过这个问题:&#34; Defining datasources in Application.cfc&#34;。

一个例子是:

// 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查询对象。 / p>

答案 1 :(得分:4)

获取连接凭据后,在ColdFusion中设置适当命名的数据源。将此数据源的名称放在具有您提到的其他帐户详细信息的数据库中。对于未向您发送凭据的客户,请使用默认数据源。

运行应用程序时,请获取数据源以及其他客户信息,并将其用于cfquery标记。