Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Coldfusion 如何从临时表的服务器连接处理红移会话_Coldfusion_Amazon Redshift - Fatal编程技术网

Coldfusion 如何从临时表的服务器连接处理红移会话

Coldfusion 如何从临时表的服务器连接处理红移会话,coldfusion,amazon-redshift,Coldfusion,Amazon Redshift,我正在使用ColdFusion连接到一个RedShift数据库,我正在尝试了解如何测试/假设自己的连接如何与RedShift中的临时表相关 在数据源的CFADMIN中,我已取消选中在客户端请求之间维护连接。我会假设每个使用我网站的用户都有自己的数据库“连接”?对吗 根据关于临时表的红移文档: TEMP:创建仅在当前会话中可见的临时表的关键字。在创建该表的会话结束时,会自动删除该表。临时表可以与永久表同名。临时表是在单独的、特定于会话的模式中创建的。(不能为此架构指定名称。)此临时架构将成为搜索路

我正在使用ColdFusion连接到一个RedShift数据库,我正在尝试了解如何测试/假设自己的连接如何与RedShift中的临时表相关

  • 在数据源的CFADMIN中,我已取消选中
    在客户端请求之间维护连接。我会假设每个使用我网站的用户都有自己的数据库“连接”?对吗

  • 根据关于临时表的红移文档:

  • TEMP:创建仅在当前会话中可见的临时表的关键字。在创建该表的会话结束时,会自动删除该表。临时表可以与永久表同名。临时表是在单独的、特定于会话的模式中创建的。(不能为此架构指定名称。)此临时架构将成为搜索路径中的第一个架构,因此临时表将优先于永久表,除非您使用架构名称限定表名以访问永久表

    我是否理解,如果#1为真,并且每个用户都有自己的数据库连接,从而有自己的会话,那么根据#2,创建的任何表都将仅在该会话中,即使“用户”与使用相同凭据的服务器连接相同

    3.如果我在#1和#2中的假设是正确的,那么如果我有运行如下查询的ColdFusion代码:

    drop if exists tablea
    create temp table tablea
    insert into tablea
    select * from realtable inner join
    drop tablea
    
    多个用户正在使用相同的功能来实现这一点。他们不应该遇到任何冲突,其中一个表在另一个请求试图正确使用时被删除

  • 我如何测试这种情况?除了投入生产和等待错误,我怎么知道呢。我试着在不同的浏览器中并排运行几个窗口,但没有注意到问题,但我不知道如何知道客户端之间的临时表是否真的不同。(应该是这样)我想我可以查询一些元数据,但是关于表的元数据会告诉我什么呢

  • 我有一个类似的情况,但与红砖数据库软件。我通过创建唯一的表名来处理它。总的想法是:

  • 创建一个表名,如下所示:

    <cfset tablename = TableText & randrange(1, 100000)>
    

    这就是为什么我使用唯一的表名。但是我不缓存查询。具有讽刺意味的是,我使用临时表的最常见动机是,在某些情况下,它们会使事情比使用永久表运行得更快。

    当我查询
    stv_会话时,我可以看到我的用户名有多个会话。
    免责声明,我不熟悉红移,但您描述的是如何(非全局)临时表在数据库中的行为类似于SQL Server。同一个“用户”可以创建多个会话,但在一个会话中创建的临时表对其他会话不可见。不确定这是否有帮助,但[此线程提到检查STV_TBL_PERM](BNohttp://stackoverflow.com/questions/24561837/conditionally-drop-temporary-table-in-redshift).您知道从服务器到数据库的连接吗。我提到的CF中的设置似乎表明每个客户机请求(不确定该定义是什么)都有一个唯一的连接,因此是唯一的会话,对吗?正确。当“维护连接”被禁用时,每个请求都应该创建一个新的连接,该连接构成一个单独的db“会话”。如果这是真的,那么我假设一个会话处于活动状态,CF将保持打开状态,直到特定用户的超时。因此,
    usera
    登录到我的应用程序并积极使用它一个小时。他们本可以进行一次为期一小时的会议
    userb
    登录到我的应用程序,每25分钟只做一次。因为我的数据源连接超时是20分钟,所以每次都有不同的DB会话。redbrick不支持真正的临时表吗?(我从来没有用过)这里解释了红砖术语临时表
    它是创建它的SQL会话所独有的
    我对会话wrt CF的解释是它是CF服务器和redbrick数据库之间的连接。我还假设一个打开的连接可以用于多个页面请求,我也考虑过使用唯一的表名。但问题是。为了提高性能,我将整个查询缓存30分钟。如果每个函数调用的名称都是唯一的,那么查询也是唯一的,这样的缓存就不起作用了。我想我可能会做一个
    cachePut
    这样做,但是添加
    cachedWithin
    效果更好,因为查询中还有其他参数可以更改,
    cachedWithin
    会考虑到这一点,丹-谢谢。这听起来类似于SQL Server中的(非全局)临时表处理。就连接而言,如果使用连接池,它们可能会被多个请求重用。否则,每个请求都应该创建一个单独的连接或db“会话”。尽管我从未见过文档记录,但一个请求通常为整个请求维护相同的连接或“会话”。换句话说,如果您请求一个运行五(5)个查询的页面,CF应该为所有五个查询使用相同的连接,而不是为每个查询创建单独的连接。(编辑)Dan-我认为您误解了临时表和数据库会话的工作原理。启用“维护连接”时,应该会出现错误。使用连接池时,将重用现有的数据库连接。这意味着多个请求可以共享同一个db会话。因此,从一个请求到下一个请求,临时表可能是可见的,这就是您在上面看到的。但是,当禁用池时,每个连接都会创建一个新的db会话,并且创建的任何临时表在一个请求到下一个请求之间都不可见。
    <cfquery datasource="dw">
    create temporary table dan (f1 int)
    </cfquery>
    
    Error Executing Database Query.  
    ** ERROR ** (7501) Name defined by CREATE TEMPORARY TABLE already exists.