【问题标题】:Is data loss possible when connection is closed连接关闭时是否可能丢失数据
【发布时间】:2015-09-25 11:06:10
【问题描述】:

我有大量的列表结构数据正在流式传输到处理程序。 Handler 是一个构建INSERTUPDATE 准备好的语句并执行它的类。现在所有准备好的语句都在一个连接和事务中执行。所以,想象一下从数据库服务器意外关闭连接的情况,这显然会导致应用程序崩溃。如何在不丢失数据的情况下重新连接到数据库?如果我只打电话给DriverManager.getConnection,我会不会丢失之前连接的所有数据?

数据是一个包含无序条目列表的大型 (1-2 GB) XML,应仅通过一个事务上传到数据库,没有中间事务。

我使用 postgres 数据库和 jdk7。

【问题讨论】:

  • 这里听起来像数据库代码优化:2 条建议:1) 使用池化 DataSource 来获取 JDBC 连接,2) 批量插入/更新语句而不是单独执行,一个一个。
  • 肯定会把它分成块并批量插入/更新这些块。我想这对任何人来说都是清楚的。
  • @BuhakeSindi 我看不到在关闭连接的情况下它如何保存数据以防丢失。

标签: java postgresql jdbc database-connection


【解决方案1】:

所以,想象一下从数据库服务器意外关闭连接的情况,这显然会导致应用程序崩溃。

是的。

如何在不丢失数据的情况下重新连接到数据库?

在数据库确认提交数据之前,您不会丢弃应用程序端的数据。这可能需要确保可以要求客户端再次发送数据,让客户端在您确认成功、写入临时文件或其他任何操作之前依次等待。

如果我只调用 DriverManager.getConnection,我会丢失之前连接的所有数据吗?

是的。当连接关闭时,事务将回滚。

数据是一个包含无序条目列表的大型 (1-2 GB) XML,应仅通过一个事务上传到数据库,没有中间事务。

那你最好不要崩溃。真的,我觉得就这么简单。您可以通过其他方式代理连接,让您在应用程序崩溃并重新启动后恢复连接,但它不会确切知道它已经发送到服务器的文件有多少。所以它无法安全地继续下去。

确实,您需要能够以较小的块完成此操作,或者只是接受如果您崩溃,您必须从头开始重新开始。

【讨论】:

  • 非常感谢。我会考虑另一种上传数据的方式。
猜你喜欢
  • 2016-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-08
相关资源
最近更新 更多