不可靠网络和低带宽的 Java ORM 策略

2024-05-10

我正在寻找 Hibernate 作为需要在不可靠网络中工作的系统。我们需要对一个中央数据库进行读写访问,但它可以通过一个相当不稳定的 Wi-Fi 网络来访问。此外,可能会出现断电而导致应用程序无法完全关闭的情况,因此任何解决方案都必须具有能够在电源周期后继续存在的持久缓存。最后,这是一个只有适度内存和磁盘空间的嵌入式系统,因此例如对数据库进行全面复制并不是一个可行的策略。

我对 Hibernate 2 级缓存有基本的了解,我想知道是否可以使用 Ehcache 之类的东西来配置它来解决这个问题,但其主要目的似乎是性能而不是可用性,所以我不知道可能存在哪些陷阱。

我也很愿意考虑涉及复制到本地数据库的其他策略。我宁愿自己不必做太多繁重的工作来实现这一点。

寻找一些经验或可能的替代方案。


“此外,可能会出现断电而无法彻底关闭应用程序的情况,因此任何解决方案都必须具有能够在电源循环后继续存在的持久缓存。”

您心中已经有了 Hibernate 2 级缓存的解决方案。但你没有说真正的要求是什么。您的网络不可靠。没关系,你的电源不可靠。那也可以。现在您希望达到什么水平的服务?什么是可以接受的,什么是不可以接受的?

数据丢失是否可以接受?你能接受多少?您接受什么风险?

更明确地说,假设您有数据库的本地副本或至少是数据库的一部分。假设您知道如何对本地进行的修改进行排队/保存。假设您将这些修改存储在硬盘上,以便在断电时保持安全。假设当连接再次可用时,您可以将更改与主数据库合并。

这已经是很多假设了。好的,但是如果一个硬盘在断电后出现故障怎么办?您知道硬盘不喜欢断电,并且很容易在断电时损坏甚至损坏吗?

因此,您建立了 RAID,并添加了不间断电源。那很好。您从操作系统检测电源故障事件。完成当前交易并正确关闭。 RAID 可保护您免受磁盘故障的影响。

好的,但是如果整个计算机停止运行会发生什么?发生火灾时会发生什么?还是水害?所有磁盘都将被管理,数据不可恢复,未与中央数据库同步的数据将丢失。可以接受吗?

即使wifi打开,电源也能正常工作......中央数据库的可靠性到底如何?您有定期备份吗?或者集群解决方案?您确定您的中央数据库可靠吗?

从数据库的角度来看,很容易使用集群或备份并使用事务来保证数据一致性。您仍然可能丢失数据(如果特别不使用集群),但您应该能够恢复到例如上次备份。

但是,如果您想脱机工作(数据库不可用),并且您不是唯一可以修改数据库的人,则会发生冲突。这不再是缓存、休眠或任何技术问题。

这是功能问题。当离线发生多个修改并且必须合并时该怎么办?什么是可以接受的?什么不是。这可能是在重新连接时,应用最新的更改,旧的更改被丢弃。或者检测到潜在的冲突并提示用户处理它们。您可以尝试应用排队更改并应用所有更改...

我倾向于认为您可以提供“离线模式”,但您的用户必须知道他们处于离线状态,并且当更改在中央数据库上永久生效并最终解决冲突时,应该收到通知。但这是我的观点。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

不可靠网络和低带宽的 Java ORM 策略 的相关文章

  • 如何将 JSpinner 的值设置为特定日期

    我有一个JSpinner我添加到JPanel我想将其时间设置为 GregorianCalendar calendar JSpinner spinner new JSpinner spinner setModel model pom add
  • 如何在log4j的配置文件中为文件附加器提供环境变量路径

    我有一个log4j xml配置文件 和一个RollingFileAppender我需要提供用于存储日志的文件路径 问题是我的代码将作为可运行的 jar 部署在 Unix 机器上 所以如果我传递这样的参数 value logs message
  • JavaFX 2.0 FXML 子窗口

    经过多次搜索我发现了这个问题如何创建 javafx 2 0 应用程序 MDI https stackoverflow com questions 10915388 how to create a javafx 2 0 application
  • 尝试获取屏幕上绘制的每个随机圆圈的 x、y 坐标

    您好 我正在制作一款游戏 该游戏将在屏幕上创建随机圆圈 随机创建的圆圈的值为红色或绿色 我的问题是 我希望不仅能够确定用户何时单击其中一个圆圈 而且还能够确定他们最终单击的圆圈 红色或绿色 下面是我的代码 我的主要问题是试图找到将要绘制的圆
  • Kafka Java Consumer 已关闭

    我刚刚开始使用卡夫卡 我面临着消费者的一个小问题 我用Java写了一个消费者 我收到此异常 IllegalStateException 此消费者已关闭 我在以下行中遇到异常 ConsumerRecords
  • Java - JPanel 内有边距和 JTextArea

    我想创建这样的东西 主面板有其边距 x 并且 TextArea 位于该面板的中心 几乎填满了面板 底部是另一个具有自定义尺寸 高度 y 的面板 可以使用某些快捷方式将其切换为可见和不可见 底部面板有 FlowLayout 和几个元素 问题是
  • java.lang.Object的hashCode具体使用的算法是什么

    中使用的算法是什么JVM实施java lang Object的隐含的hashCode 方法 OpenJDK or Oracle JDK答案中首选 它依赖于实现 并且在很大程度上 该算法是entirely取决于实施 只要它是一致的 但是 根据
  • Cucumber DataTable 错误 - io.cucumber.datatable.UndefinedDataTableTypeException:无法将 DataTable 转换为 cucumber.api.DataTable

    尝试使用 cucumber selenium java intelliJ 运行场景 但在其中一个步骤中出现有关 DataTable 的错误 在我开始使用测试运行程序并更改周围的一些内容之前 数据表工作正常并正确转换该步骤的参数 但我就是无法
  • 更改 JComboBox 中滚动条的大小

    有谁知道如何手动更改 jComboBox 中的滚动条大小 我已经尝试了一大堆东西 但没有任何效果 好吧 我明白了 您可以实现 PopUpMenuListener 并使用它 public void popupMenuWillBecomeVis
  • 如何使用 swagger-codegen-plugin (maven) 生成客户端代码?

    我需要使用 swagger codegen plugin for maven 在 eclipse 中生成服务器存根代码 你能帮忙怎么做吗 以及需要什么配置 在 pom xml 中 我找到了这个答案 您只需要像下面这样更改 pom xml 即
  • 改变 Java 中凯撒移位的方向

    用户可以通过选择 1 向左或 2 向右移动字母来选择向左或向右移动 左边工作正常 右边不行 现在它显示了完全相同的循环 但我已经改变了所有 and 以不同的方式进行标记 最终我总是得到奇怪的字符 如何让程序将字符向相反方向移动 如果用户输入
  • JAXB 编组器无参数默认构造函数

    我想从 java 库中编组一个 java 对象 当使用 JAXB marschaller 编组 java 对象时 我遇到了一个问题 A 类没有无参数默认构造函数 我使用Java Decompiler来检查类的实现 它是这样的 public
  • 文件缓存:查询字符串与上次修改时间?

    我正在研究缓存网站资源的方法 并注意到大多数与我类似的网站都使用查询字符串来覆盖缓存 例如 css style css v 124942823 后来 我注意到每当我保存 style css 文件时 最后修改的标头都会 更新 使得查询字符串变
  • Java8:流映射同一流中的两个属性

    我有课Model带有以下签名 class Model private String stringA private String stringB public Model String stringA String stringB this
  • 如何检查日期字符串的有效性?

    在我的项目中 我需要检查日期字符串是否计算为正确的日期对象 我决定允许 yyyy MM dd 和日期格式 年 月 日 和 年 月 日 小时 分钟 我如何检查它们是否有效 我的代码为 1980 01 01 和一些奇怪的日期 如 3837 05
  • Android项目中使用java获取电脑的IP地址

    我在用ksoap2 android http code google com p ksoap2 android 我需要使用java获取IP地址 这样我就不必每次都手动输入它 我所说的 IP 地址是指 例如 如果我这样做ipconfig使用命
  • MVC 框架中的缓存策略?

    我编写了自己的小型 PHP MVC 框架 现在正在探索 PHP MVC 框架中的缓存策略 我正在考虑可以缓存什么 在哪里以及如何缓存 我的框架是简单的MVC框架 我有前端控制器 它启动应用程序 注册类自动加载 设置 php 运行时指令 最后
  • Java String ReplaceAll 方法给出非法重复错误?

    我有一个字符串 当我尝试运行时replaceAll方法 我收到这个奇怪的错误 String str something op str str replaceAll o n it works fine str str replaceAll n
  • JPA 将 BigDecimal 作为整数保存在数据库中

    我在数据库中有这个字段 ITEMCOST NUMERIC 13 DEFAULT 0 NOT NULL 在JAVA中 Entity中的字段定义如下 Column name ITEMCOST private BigDecimal itemCos
  • 如何清理 Runtime.exec() 中使用的用户输入?

    我需要通过命令行调用自定义脚本 这些脚本需要很少的参数并在 Linux 机器上调用 当前版本容易出现各种shell注入 如何清理用户给出的参数 参数包括登录名和路径 Unix 或 Windows 路径 用户应该能够输入任何可能的路径 该路径

随机推荐