在失败的Postgres SQL连接上本地保存数据有哪些选项

时间:2014-03-09 14:35:34

标签: c# entity-framework postgresql database-connection

我正在构建一个C#应用程序,它使用云中的PostgresSQL数据库(版本9.3)进行存储。虽然我的办公室连接是光纤并且对数据库提供程序非常稳定,但我的客户可能不是这样。

我正在使用Devart Entity Developer版本5.5.164,当然还有点连接PostgreSQL提供程序。

问题是,在使用应用程序时,与数据库的连接是否失败,有哪些易于实现的选项可以将当前状态本地保存到PC(如果有的话),其次是当数据库重新启动时同步选项可用于确保本地PC上的数据成功写入数据库。

我考虑过一个主从属PostgreSQL类型设置,其中设置本地计算机以提供数据库,然后将每个更改复制到云。但是客户端不想管理另一个系统。所以这不是一个选择。

所以...任何想法?

3 个答案:

答案 0 :(得分:1)

我尝试了SQLite <> PostgreSQL的在线/离线设置。根据我的经验,我强烈建议考虑:

  1. 离线和在线(1或n个表,只需插入或更新(冲突危险!)之间同步的数据库(数据库)有多大?
  2. 您在每个SQLite和PostgreSQL中使用的数据类型?它们兼容吗?
  3. 您是否有可用的工具来简化从一种数据库语言到另一种数据库语言的“翻译”?

我最终决定在Postgres上运行所有程序。同时,它带来了新的挑战:主机之间的同步。冲突问题由IT系统外部的组织责任解决。

答案 1 :(得分:0)

我认为本地的sqlite数据库可能是一个解决方案。

  • 远远优于自制文件存储解决方案
  • 没有额外的管理费用,它是磁盘上的一个文件
  • 库可轻松整合到您的程序中
  • SQL接口将导致少量代码重复

然后你可以遵循这样的策略:

  • 本地提交首先,通常非常快
  • 然后远程提交
  • 如果已提交则删除本地数据
  • 在程序启动时将本地数据存储到云中

依旧......

编辑:刚刚检查过,Devart Entity Developer支持sqlite: - )

答案 2 :(得分:0)

虽然已经仔细考虑了解决此问题的所有建议,但我决定将数据序列化并将其保存在检测到的失败连接上。这适用于我的情况,因为在客户端创建/更新记录时,系统只修改了几个表(六个)。我在执行最后的“保存数据”操作之前重试连接3次,然后锁定系统,以便通知最终用户,并且在数据连接稳定之前无法进行进一步更改。序列化数据的过程非常简单,很容易实现。

以下是您感兴趣的小样本:

 var backupfile = String.Format("ModifiedGridTotals_Backup_{0}.xml", DateTime.Now.ToString("d-MMM-yyyy-HHmmss"));
 var serializer = new XmlSerializer(typeof(List<GridTotal>));
 serializer.Serialize(new XmlTextWriter(backupfile, Encoding.UTF8), ModifiedGridTotals);

恢复数据库连接后,我从磁盘读回这些文件并提交更改。