【发布时间】:2012-08-05 18:35:48
【问题描述】:
我在我的应用程序中使用 SQL Server 管理对象。应用程序中对 SMO 对象的大多数操作都是直接从 UI 触发的。例如。用户操作一个对象,导致从 SMO 对象(表、视图、...)读取或写入属性。
现在我想介绍一个后台操作,它会定期扫描一些对象(只读)。
我的问题是这是否会导致 SMO 出现问题。从文档中我知道对象的实例成员不是线程安全的。因此,我的计划是每当我从 UI 或后台线程访问每个 SMO 对象时都对其进行锁定。但是如果我同时访问两个不同的对象(例如视图和表)会发生什么。即使我只读取一个属性,该对象也可能没有完全初始化,需要从数据库中加载。所以在最坏的情况下,SMO 需要同时初始化两个对象。由于我不知道 SMO 在内部如何处理这个问题,所以我想知道是否有人知道 SMO 是否允许这样做,或者它是否会导致问题。
关于如何解决这个问题的任何其他建议?我想避免对整个 SMO 库进行全局锁定...
谢谢!
【问题讨论】:
-
需要更好地定义“将定期扫描某些对象”的“某些对象”。您对 SMO 对象执行了哪些类型的操作?
-
我正在从所有标准数据库对象(数据库、表、视图、存储过程)中读取名称和架构,以便像在 SQL Server 管理工作室中一样向用户显示数据库树。然后我正在读取和写入这些对象的 MS_Description 属性,该属性位于 ExtendedProperties 中。后台线程定期读取相同的属性。
-
不知道全局锁对象是什么意思,也没有完全初始化。在对象完全初始化之前,您无权访问它。如果您同时初始化两个对象,那么您有两个对象。问题是什么?
标签: c# .net sql-server multithreading smo