gpt4 book ai didi

c# - 使用C#同步不同数据库中的两个表

转载 作者:搜寻专家 更新时间:2023-10-30 20:29:22 24 4
gpt4 key购买 nike

我有一个远程 Postgresql 数据库,它有一个表(我无法更改),其中包含信息(只有几列而不是整个表)我想同步到本地 SQL Server 2008 Express 数据库和一个表(我可以改变)。

现在我正在寻找一种有效的方法来做到这一点。由于同步将每大约 5 分钟运行一次,因此每次都重新加载整个表会产生大量我试图避免的不必要的流量。

我考虑过保存最新的 ID 并只获取所有较新的数据,但是旧数据有可能(不太可能但仍然有可能)被更改。就这样我会错过更改后的数据。

同步将由与本地 SQL Server 在同一台计算机上运行的 C# 程序完成。

最佳答案

这个问题有两个解决方案。您可以尝试变得聪明,只传输更改 - 但这需要对源数据库进行一些集成;我相信您的数据库管理员可以帮助您 - 可能会触发跟踪所有接触的行(例如使用源表的主键)。该解决方案的扩展性相当好,但更复杂。我认为您应该考虑第二种选择:简单的蛮力。

根据它的声音,您的整个 table 都可以舒适地容纳在 100MB 内。这只是没有多少数据。假设您可以获得 10MB/s 的传输速率(这一点也不奇怪),您可以在 10 秒内传输所有内容。如果像您所说的那样只需要几列,则总数据传输量可能会少得多。每五分钟使用 10 秒的数字,这大约是 3% 的负载以保持数据最新——这是对源数据库的一个微不足道的查询,可能不会造成太多负载,尤其是因为它'由于数据集很小,所有这些都会缓存在内存中。

看看SqlBulkCopy .本文 ( Transderring data using SqlBulkCopy) 是使用它将数据从一个数据库复制到下一个数据库的示例。源数据读取器可以是任何东西;例如,我用它从对象中插入计算数据,但一个特别简单的例子是 DbDataReader,您可以从 Postgresql 的 select 语句中获取它。

不幸的是,默认选项不太好,所以您可能需要指定 SqlBulkCopyOptions对你有用。 TableLock 可能还不错。此外,如果您并行执行此操作(即,将多个批量插入到一个表中),请注意索引(这可能导致死锁)。如果您使用批量复制批量大小,您可以优化吞吐量和内存使用之间的权衡,尽管默认设置可能工作得很好。

从概念上讲,我会这样做:

  • 打开与源数据库和目标数据库的连接(使用using)
  • 在目标数据库连接上启动一个SqlTransaction
  • 从目标表中删除所有行。
  • 从源批量复制到目标(不要忘记传递事务)
  • promise

这样,您将自动更新目标表。

我不确定您要做什么,但如果这是某种形式的缓存,请考虑完全取消目标 SQL 服务器并将数据作为对象数组保留在内存中。对只读数据的内存访问速度超快,您的数据集很容易放入内存。

关于c# - 使用C#同步不同数据库中的两个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14622822/

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