首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有办法(每个请求)在冷框中设置非持久性数据库Bean?

是否有办法(每个请求)在冷框中设置非持久性数据库Bean?
EN

Stack Overflow用户
提问于 2011-12-21 17:03:20
回答 1查看 298关注 0票数 1

我希望从自定义框架迁移到Coldbox。

应用程序有3个数据源。

  1. Core
  2. Common
  3. Site

核心数据源存储有关站点的信息,公共数据源存储共享信息,如状态表,站点数据源存储与网站相关的数据。

每个请求都会根据请求的URL更改站点数据源,允许将每个站点沙箱放入自己的数据库中。

从我的测试来看,由Coldbox生成并用于其自动装配的DatasourceBeans似乎被存储/缓存在应用程序范围中。这就是我想要做的,但是对数据源的更改是在请求之间保持不变的。

在Coldbox.cfc中

代码语言:javascript
复制
datasources = {
    Core   = {name="DSNCore", dbType="mssql", username="", password=""},
    Common   = {name="DSNCommon", dbType="mssql", username="", password=""},
    Site = {name="", dbType="mssql", username="", password=""}
};

代码语言:javascript
复制
interceptors = [{
    class="interceptors.Website",
    properties={}
}];

拦截器名为Website.cfc

代码语言:javascript
复制
<cfcomponent name="Website" output="false" autowire="true">

    <cfproperty name="dsncore" inject="coldbox:datasource:Core">
    <cfproperty name="dsn" inject="coldbox:datasource:Site">

    <cffunction name="Configure" access="public" returntype="void" output="false" >
    </cffunction>

    <cffunction name="preProcess" access="public" returntype="void" output="false" >
        <cfargument name="event" required="true" type="coldbox.system.web.context.RequestContext">
        <cfargument name="interceptData" required="true" type="struct">
        <cfset var q="" />

        <cfdump var="#dsn.getMemento()#" label="DSN before change" />
        <cfquery name="q" datasource="#dsncore.getName()#">
            SELECT
                Datasource
            FROM
                Websites
            WHERE
                Domain = <cfqueryparam cfsqltype="cf_sql_idstamp" value="#cgi.http_host#" />
        </cfquery>
        <cfscript>
        dsn.setName(q.Datasource);
        </cfscript>
        <cfdump var="#dsn.getMemento()#" label="DSN after change" />
        <cfdump var="#q#" label="Results of query" /><cfabort />

    </cffunction>
</cfcomponent>

有没有办法这样做,以一种方式,我可以使用冷箱自动数据源bean?

老实说,这就是我认为我会这么做的方式,如果有人对如何让我的模型在每个请求中使用非硬编码的不同数据源有任何其他想法,我会更好地理解这个框架。

这个问题也延伸到了ORMs。是否有一种方法,比方说,在每个请求中使用不同的数据源?如果数据库可能有可能有不同的模式怎么办?假设一个数据库已被更新为新版本,但另一个数据库仍然使用旧版本,我基本上在代码中有一些if语句来为更新的数据库提供增强的功能。

你可能会读到这些问题,心里想:“你不应该这样做。”嗯,我是,所以请不要回答说不要做。如果您有更好的方法将单个代码库附加到不同的数据库中,那么我将非常关注。

EN

回答 1

Stack Overflow用户

发布于 2011-12-21 17:11:12

另一种方法是在requestStartHandler中使用Coldbox.cfc

代码语言:javascript
复制
<!---config/Coldbox.cfc--->
requestStartHandler = "Main.onRequestStart"

<!---handlers/Main.cfc--->
<cffunction name="onRequestStart" returntype="void" output="false">
    <cfargument name="event" required="true">
    <cfquery name="q" datasource="#dsncore.getName()#">
        SELECT
            Datasource
        FROM
            Websites
        WHERE
            Domain = <cfqueryparam cfsqltype="cf_sql_idstamp" value="#cgi.http_host#" />
    </cfquery>

    <cfset rc.dataSource = q.Datasource />
</cffunction>

然后,您只需将dataSource存储在Request中,因为onRequestStart会对每个请求启动。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8593516

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档