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

Can I specify a dynamic datasource at runtime?

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

我想存储客户服务器的详细信息及其帐户详细信息(例如数据库名称、主机、端口等)。

然而,根据谁登录到应用程序,我需要将他们的数据连接详细信息提供到 <cfquery> 函数中,以便执行查找。像这样:

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

我知道有一个管理员 API 以编程方式创建数据源,但是使用它意味着我的系统中有一个额外的进程,如果数据源详细信息由顾客?

那么有没有办法像上面那样即时完成呢?也就是说,在 <cfquery> 标记内提供数据连接字符串。

或者是否有更好的方法来完全做到这一点?

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

当您 运行 您的应用程序时,获取数据源以及其他客户信息并在您的 cfquery 标记中使用它。

您可以在运行时在 ColdFusion 11 中创建特定于应用程序的数据源。请参阅文档:“Application-specific datasources in Application.cfc". I also discuss this in my blog: "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\full\cfusion\db\scratch",
            driver        = "Apache Derby Embedded"
        }
    };
    this.datasource    = "scratch_mssql_app";

}

这是您使用 ColdFusion 可以获得的最接近结果。

如果你直接使用JDBC,你可以在创建连接时只给出一个连接字符串,但是你的代码将需要与JDBC驱动程序返回的记录集竞争,这不会是 CFML 查询对象。