小编K. *_*eke的帖子

在空表上运行具有多个联接的查询时,SQL Server 挂起

我们在 SQL Server 中遇到了一个有趣的错误,我想向您描述一下。我希望找出它是否真的是一个错误,如果是,我可以在哪里找到有关它的更多信息。如果它不是一个错误,我希望有人可以向我解释为什么它不是,以及我们在不知不觉中做错了什么。我似乎找不到类似问题的描述,我不确定我们是否应该向 Microsoft 报告错误或其他内容。我将首先简要描述问题,然后提供详细信息。

简而言之,问题似乎是当被连接的表的某些(大?)部分(抱歉,这里不能更具体地用数字表示)为空时,SQL Server 会阻塞包含许多连接的语句。扼杀,我的意思是它在查询中搅动和搅动,永远不会完成,这导致 SQL Server 完全停止响应。实际上,运行一次查询会导致 CPU 跳到 25% 并保持在那里。再次尝试,CPU 跳到 50%。有时,CPU 会达到 75% 或 100%,但在 50% 标记处,您甚至无法再登录到数据库服务器。

问题发生在我们使用 Hibernate(通过 Coldfusion ORM)并且有一个实体(文档)的应用程序中,该实体(文档)被细分为许多不同类型的文档。当我们在基类 Document 上运行查询(例如“FROM Document WHERE Locked=1”)时,有问题的 SQL 查询是由 Hibernate 生成的。这会导致一个很长的 SQL 查询,它将所有子类表连接在一起(下面的示例),有时会杀死服务器。

我在测试时发现了一些有趣的事情:

  1. 只有在有大量空连接表时才会发生这种情况,这就是为什么要追踪它的原因 - 在我们的开发或测试数据库上运行时从未发生过,因为它们有足够的数据。因此,相同的查询在一个实例中立即运行而没有问题,而在另一个实例中完全杀死 SQL 服务器。
  2. 起初我认为 SQL 查询中大量选定的列可能会导致问题,因此我使用相同的连接测试了 SQL 查询,但只从每个表中选择了一个列,因此实际上只选择了一小部分数据- 没有改善,仍然挂起。
  3. 我对几乎没有数据的数据库运行了查询,并开始一一删除连接。我发现我可以达到查询可以快速运行的程度。从这一点添加一个连接会导致查询运行,但明显变慢,重复几次最终会导致它再次停止并杀死服务器。

因此,基于上述内容,我推测 SQL Server 中存在一个错误(或一个我不知道的已知事实),其中连接导致过多的空值会导致问题。我认为这可能是一个错误而不是已知的限制,因为它不会导致错误消息(例如,如果您尝试在 IN 子句中查询超过 2100 个项目,您会得到),而是挂起服务器。服务器进入la-la土地几乎就像连接导致cartesion产品一样,但事实恰恰相反-我没有数据,而不是大量数据。

有没有其他人遇到过这样的问题?是否有一些已知的 SQL 服务器限制,我正在摩擦?我很难用谷歌搜索这个问题,因为它很难定义。我应该为此向 Microsoft 提交错误吗?

任何见解都非常感谢。如果需要我提供更多信息,请告诉我。

谢谢。

示例查询如下(为简洁起见,我删除了大部分选定的列):

select
    top 1 document0_.ID as ID715_,
    document0_.CreatedOn as CreatedOn715_,
    document0_.UpdatedOn as UpdatedOn715_, …
Run Code Online (Sandbox Code Playgroud)

sql-server hibernate join

5
推荐指数
1
解决办法
1092
查看次数

Coldfusion 2018群集和会话复制无法正常工作

设置几个新的Coldfusion 2018服务器,并将首次使用群集,并遇到一些问题.

我遇到会话复制问题.基本上,会话变量似乎在群集中的节点之间复制,在一段时间后随机被杀死.

一点设置信息:

  • 2负载均衡器后面的Web服务器(Windows Server 2012)
  • 在每个Web服务器上都有一个Coldfusion集群,由2个本地实例组成(仍然不清楚这是否有用 - 将在单独的问题中提出)和2个远程实例(远程实例引用每个相对服务器的本地实例)
  • 为简单起见,目前只在具有本地Coldfusion实例的单个服务器上进行测试 - 将遥控器排除在等式之外,直到我可以在本地可靠地工作
  • 使用J2EE会话变量
  • Coldfusion会话超时设置为2小时
  • 在每个Coldfusion实例中,channelSendOptions设置为"6"

这是我做过/经历过的事情:

  • 我们有一个Web应用程序,需要登录并在登录时在会话中存储用户信息.
  • 我对Web应用程序进行了一些小修改,以向我显示哪个集群实例已为我当前的请求提供服务.
  • 设置群集后,我启动了Web应用程序并登录,注意到显示登录页面的实例.
  • 登录后,我立即返回登录界面(app会在会话中检查用户信息,如果找不到则重定向到登录)
  • 调试显示我实际上已登录但在登录后重定向到某个新页面后,用户信息将从会话中消失.
  • 连续多次登录尝试(相同的凭据,只是一次又一次地尝试)显示有时登录会很顺利,我会进入应用程序.但是,如果我刷新页面或转到另一个页面,会话将很快丢失,但随机(在几页刷新内).
  • 为了简化问题以尝试找出正在发生的事情,我创建了一个简单的.cfm来绕过所有登录的东西,做了一件事:向会话添加一个简单的字符串值,然后转储会话和实例名称.**我运行了一次脚本,注意到正在使用哪个实例,并且该会话包含了我的值.**然后我编辑了脚本,因此它不再设置会话值.**然后我一遍又一遍地刷新,所以我可以确认:
    1. 群集中的两个实例都在为这些请求提供服务
    2. 当我在实例之间翻转时,会话值始终可用.
  • 同样,复制将起作用,并且对于几次刷新,我可以在每个实例上看到我的会话变量...直到它没有.在随机数量的刷新/秒(说2到10次刷新之后)之后,该值将消失.

我无法解释为什么会这样.我们考虑过使用Redis作为会话商店,看看它是否有用,但坦率地说,我们的团队没有使用它的经验,在Windows中工作是笨重的,如果我们可以提供帮助,我们真的不希望在我们的基础设施中有任何移动的部分它.

任何关于正在发生的事情的见解以及关于如何在幕后进行对等的建议以及查看会话复制的内容都将非常感激.

谢谢

添加一些代码和截图.屏幕截图显示了每次刷新页面后的会话状态以及当前为该页面提供服务的实例.最后两个图像代表刷新11和13 - 会话变量在11中丢失,我转到13,这样我们就可以看到变量在另一个实例上也丢失了.还有一些集群/会话设置的图片.

以下是简单的测试脚本.第一行在第一次运行时未注释,以创建会话变量,并为每次后续运行注释掉.

<!--- <cfset Session.svar="cake!"> --->

<cfdump var="#Session#" />

<cfscript>
hostaddress = createObject("java", "java.net.InetAddress").localhost.getHostAddress();
</cfscript>

<cfoutput>
<h3>
Instance: #createobject("component","CFIDE.adminapi.runtime").getinstancename()#
</h3>
</cfoutput>
Run Code Online (Sandbox Code Playgroud)

刷新1

刷新2

刷新3

刷新4

在此输入图像描述

刷新6

刷新7

刷新8

刷新11

刷新13

在此输入图像描述

在此输入图像描述

coldfusion session coldfusion-2018

5
推荐指数
0
解决办法
160
查看次数

升级到ColdFusion 2018/Hibernate 5.2后生成的DDL无效

我们遇到ColdFusion 2018和/或Hibernate 5.2的问题.

我们有一系列模型可以在没有ColdFusion 2016问题的情况下生成DDL,但是在ColdFusion 2018中失败了.我们不确定哪个(ColdFusion或Hibernate)对我们看到的问题负最终责任.

有几个问题:

  • 数据库默认值不再有效
    • 字符串默认值不再正确引用.
    • 这个: property name="CompanyName" fieldtype="column" ormtype="string" default="Acme Inc." dbdefault="Acme Inc.";
    • 表中的结果创建:( CompanyName varchar(255) default Acme Inc.缺少引号)
  • 数据库名称不再正确引用
    • 我们有名为"prefix.databasename"的数据库(带点)
    • 这些用于查找但现在在CF2018中导致错误,例如"对象名称'prefix.databasename.dbo.SomeTable包含的最大前缀数量.最大值为2".
  • 表名称不再正确引用
    • 令人沮丧的是,他们有时被恰当地引用,有时则没有.以下内容取自hibernate日志:HIBERNATE DEBUG - alter table my_db.dbo.Group add DeletedByID int HIBERNATE DEBUG - alter table my_db.dbo.User add DeletedByID int HIBERNATE DEBUG - alter table [Group] add constraint FKfpa9ddoqu39xeskmmdg2pe3tq foreign key (DeletedByID) references [User] HIBERNATE DEBUG - alter table [User] add constraint FKj4hy4k4el0vvds8s8itfo2b04 foreign key (DeletedByID) references [User]
    • 在前两行中,注意数据库名称和表名都没有被正确引用(导致错误"通过JDBC语句执行DDL时出错 - 关键字'Group'附近的语法不正确."因为它在表名"组"上窒息").但是,在接下来的两行中,它会正确引用表名,并且不会使用数据库名称限定它们...

我知道有人会权衡并说我们的表名中不应该有点,我们不应该为关键字命名.注意,但最重要的是我们这样做,已经多年没有问题,并且在正确处理时它们是有效的名称. …

coldfusion orm hibernate coldfusion-2018

5
推荐指数
0
解决办法
94
查看次数