2009-07-06 74 views
2

所以我们有这个最终失败供应商(这是一个很长的故事,但相信我在这里)创建了一个应用程序,它具有独立但设计相同的数据库,我们需要查询(10实际上)。这些数据库中的每一个都是针对不同的“位置” - 但它仍然是所有位置相关的信息。多线程数据库查询

我写了一些代码来启动10个独特的线程来向每个单独的数据库发出查询,等待结果完成,然后将它们合并成一组可用于操纵的记录。

这里的问题是是否有任何读取10个独立数据库的风险,一次使用相同的凭据?

我预料它应该是一个非问题,因为数据库可以在任何给定的时间有数百个连接,但是我想在得到这个设计之前得到一些反馈。

MS-SQL,如果你很好奇

+2

供应商在失败的设计中如此出色! – Danny 2009-07-06 16:41:13

+1

这个地方是所有其他供应商追求的目标:) – Hugoware 2009-07-06 16:42:42

+0

我们在谈论什么数据库? – 2009-07-06 16:43:13

回答

6

假设数据库是独立的,我可以看到,最大的风险是,你会得到一个看法不同时间点的每个数据库。这可能不是问题,也可以通过基于时间标准限制结果集来解决问题。

让单个进程打开10个数据库连接并查询它们本身并不会带来风险。

另一个更复杂的选择是使用单个主设备和10个DB作为从设备进行复制。这依赖于数据库,可能或不可行/合理。

0

你也可以考虑设置链接服务器并在一个大工会中查询所有语句。我会尽可能测试两种方法,以查看哪种效率更高。如果其中一台服务器出于任何原因停机,那么连接的服务器将会失败。根据您的需求,这可能会或可能不会是一个加号。

编辑为添加 如果它们都在同一台服务器上,则不需要执行此操作,只需运行一个查询union查询引用每个数据库即可。

2

这可能是简单的让服务器做所有的跑腿你,就像这样:

SELECT col1, col2 FROM Database1.dbo.SomeTable WHERE <some conditions here> 
UNION ALL 
SELECT col1, col2 FROM Database2.dbo.SomeTable WHERE <some conditions here> 

(snip) 

UNION ALL 
SELECT col1, col2 FROM Database10.dbo.SomeTable WHERE <some conditions here> 

没有多线程,要简单得多。 这应该只用于所有数据库都在同一个实例上

2

作为一次性操作,您可以在10个线程中运行10个查询(与您一样),您可以运行10个查询而不使用显式线程async BeginExecuteReader方法,如果所有数据库都是本地数据库,您可以通过UNION ALL(如Alex所建议的)将查询合并到一个数据库中,甚至可以使用未公开的但众所周知的sp_msforeachdb系统过程进行查询。一个人认为我建议反对的是,如果数据库单独使用链接服务器。链接服务器会导致可用性依赖关系,这可能会在操作期间受到影响(即一个链接关闭,您的报告关闭)。

如果这只是您已经做了很多次的事情之一,而且对于更多的查询和报告,可能还是值得考虑的是,将报告数据(例如通过复制)汇总到一个数据库中。作为一个便笺,不知道与该供应商的其他问题,将“业务单位”分离到单独的数据库上的做法相当普遍,并且在开发工作(=价格)和常见应用程序使用的平衡中往往是正确的做法。