gpt4 book ai didi

sql-server - SSRS代码共享变量和同时执行报告

转载 作者:行者123 更新时间:2023-12-03 16:59:22 25 4
gpt4 key购买 nike

当其中两个SSRS执行得非常紧密时,我们有一些SSRS报告失败。

我发现,如果同时运行两个SSRS报告实例,则在类级别(不在函数内部)声明的任何Code变量都可能发生冲突。我怀疑这可能是导致我们报告失败的原因,并且我正在努力解决。

我们之所以使用SSRS的“代码”部分,是出于自定义组和页面标头计算之类的目的。从TextBoxes中的表达式调用该代码,并返回当前标签应该是什么。代码需要保持状态以记住上一个标头值,以便在未知时返回它,或存储新的标头值以供重用。

注意:这是我的变量冲突问题资源:

MSDN SSRS Forum


因为这使用静态变量,所以如果两个人以完全相同的方式运行报表
瞬间,一个机会极少会粉碎另一个人的变量状态(在SQL 2000中,
由于两个用户在同一报表上分页,因此有时可能会发生这种情况
同一时间,而不仅仅是完全同时执行)。如果您需要成为100%
为了避免这种情况,您可以将每个共享变量设为基于
用户ID(Globals!UserID)。


Embedded Code in Reporting Services


...如果多个用户同时使用此代码执行报告,则两者
报告将更改相同的Count字段(这就是为什么它是共享字段)。您
不想调试这些类型的交互-仅使用共享功能
局部变量(通过ByVal传递或在函数体中声明的变量)。


我想这是在报表生成服务器上,报表已加载并且Code模块是静态类。如果第二个客户足够快地要求与另一个客户相同的报告,它将连接到该静态类的相同实例。 (如果我弄错了,欢迎您更正我的描述。)

因此,我开始考虑使用哈希表来保持隔离的想法。我正在计划将哈希键作为内部报告参数使用默认=Guid.NewGuid().ToString()的InstanceID作为实例。

但是,根据研究的一部分,我发现它更加复杂,因为根据Maintaining State in Reporting Services,哈希表不是线程安全的。

那个作者的代码与我正在开发的代码相似,只是整个线程安全的事情完全超出了我的经验。我需要花几个小时来研究所有这些内容,并整理出我可以相信并且性能良好的明智代码。

因此,在我走得更远之前,我想知道是否还有其他人已经走过这条路并且可以给我一些建议。这是我到目前为止的代码:

Private Shared Data As New System.Collections.Hashtable()

Public Shared Function Initialize() As String
If Not Data.ContainsKey(Parameters!InstanceID.Value) Then
Data.Add(Parameters!InstanceID.Value, New System.Collections.Hashtable())
End If
LetValue("SomethingCount", 0)
Return ""
End Function

Private Shared Function GetValue(ByVal Name As String) As Object
Return Data.Item(Parameters!InstanceID.Value).Item(Name)
End Function

Private Shared Sub LetValue(ByVal Name As String, ByVal Value As Object)
Dim V As System.Collections.Hashtable = Data.Item(Parameters!InstanceID.Value)
If Not V.ContainsKey(Name) Then
V.Add(Name, Value)
Else
V.Item(Name) = Value
End If
End Sub

Public Shared Function SomethingCount() As Long
SomethingCount = GetValue("SomethingCount") + 1
LetValue("SomethingCount", SomethingCount)
End Function



我在这里最担心的是线程安全性。我也许可以找出下面的其余问题,但是对此我没有经验,我知道这是容易出错的地方。上面的链接使用方法 Dim _sht as System.Collections.Hashtable = System.Collections.Hashtable.Synchronized(_hashtable)。那是最好的吗?互斥量呢?信号?我没有这方面的经验。
我认为Hashtable的命名空间System.Collections是正确的,但是我无法在报告中添加System.Collections作为参考以尝试解决当前的错误“无法加载文件或程序集'System.Collections'”。当我浏览以添加参考时,它不是可用组件。
我刚刚确认可以从参数的默认值表达式中调用代码,因此将初始化代码放在此处。我也刚刚发现了OnInit程序,但这有其自身的研究和解决方法: the Parameters collection may not be referenced from the OnInit method during parameter initialization
我不确定是否将Data变量声明为New,也许应该只在初始化器中实例化它(如果尚未完成)(但是我担心竞争条件,因为检查它为空与实例化之间存在延迟)。
我也有关于Shared关键字的问题。是否在所有情况下都必要?如果我将其保留在函数声明之外,则会出现错误,但是当我将其保留在变量声明之外时,它似乎可以工作。测试多个同时执行的报告非常困难...有人可以解释一下在SSRS代码的上下文中Shared的具体含义吗?
有没有更好的方法来初始化变量?我是否应该向GetValue函数提供第二个参数,如果发现哈希表中尚不存在该变量,该参数将作为默认值使用?
像我在实现中选择的那样嵌套Hashtables更好,还是将InstanceID与变量名连接起来以拥有平坦的hashtable更好?


我真的很感谢我在这里提出的任何方面的指导,想法和/或批评。

谢谢!

埃里克

最佳答案

您的代码看起来不错。为了线程安全,仅根(共享)哈希表数据需要同步。如果要避免使用InstanceID,则可以使用串联的Globals.ExecutionTimeUser.UserID

基本上我认为您只想更改为这样的初始化:

Private Shared Data As System.Collections.Hashtable 

If Data Is Nothing Then
Set Data = Hashtable.Synchronized(New System.Collections.Hashtable())
End If


无论如何,包含的哈希表一次只能一次由一个线程使用,但是如果有疑问,也可以同步它们。

关于sql-server - SSRS代码共享变量和同时执行报告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2067537/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com