繁体   English   中英

数据库或ObjectOutputStream,特定于对象的成员或实际对象供参考

[英]database or ObjectOutputStream, Object specific member or actual object for reference

我正在开发一个药房应用程序,基本上该应用程序有一个“项目”类和另一个记录销售过程的“销售发票”类。 所以我在这里的问题是,如果药房有大约一万种产品库存,我将这些产品存储在Item类型的链接列表中,并将发票也存储在链接列表中,然后在关闭应用程序时保存它们使用对象输出流并在开始时重新加载它们,这是一种不好的做法吗? 我可以改用数据库吗? 我的第二个问题是,如果我继续使用链表和对象输出流,那么对性能和内存有什么好处,将实际项目存储为发票类中的字段成员或仅存储其ID,然后在使用该ID进行调用时获取该项目参考,还有什么更好的? 提前致谢 。

像这样使用ObjectOutputStream是一个坏主意。

原因如下:

  1. 如果在“保存”之前应用程序崩溃(或电源中断),则所有更改都将丢失。

  2. 保存“所有对象”非常昂贵。

  3. 序列化的对象是不透明的。 从Java代码查看它们是仅实际的。

  4. 序列化的对象很脆弱。 如果您的应用程序类更改,您可能会发现不再可以读取旧的序列化对象。 这已经够糟糕了,但是现在考虑如果您的客户想要从备份磁带查看5年前的药房记录会发生什么。

  5. 序列化对象除了一次读取所有对象之外,没有提供搜索的方法。

  6. 涉及将所有对象读取到内存中的设计不会扩展。 您可能会耗尽内存。 或者妥协您的要求,以免耗尽内存。

相比之下:

  1. 数据库不会丢失任何已提交的更改。 它们对应用程序错误和系统级故障之类的东西更具弹性。

  2. 提交数据库更改并不那么昂贵,因为您只需写入已更改的数据。

  3. 可以使用现成的数据库工具查看,查询和修复典型的数据库。

  4. 更改Java代码不会破坏数据库。 对于某些架构更改,有一些方法可以迁移数据库架构和记录以匹配更新的数据库。

  5. 数据库具有用于实现有效搜索的索引和查询语言。

  6. 数据库可以扩展是因为数据的主副本在磁盘上,而不在内存中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM