20

我最近花了一些时间熟悉 Smalltalk 和 Seaside。我来自 Java EE 世界,正如您想象的那样,让我思考一些 Smalltalk 概念是一项挑战。:)

目前,我正试图掌握在 Smalltalk 世界中最典型的数据持久性是如何实现的。作为一名 Java 程序员,我的假设是使用 RDMS(即 MySQL)和 ORM(即 Hibernate)。我知道 Smalltalk 不是这种情况(至少使用 Hibernate)。我不一定要寻找最接近 Java EE 完成方式的方法。

将数据保存到图像、对象存储还是 RDMS 中最常见?Smalltalk 应用程序使用 RDMS 是不是很典型?

我知道这里没有一刀切的方法,正确的持久性策略将取决于应用程序的需求(数据量、并发性等)。什么是可以开始简单但也可以扩展的好方法?

我看过 Avi Bryant 的视频,他讨论了他用于持久性和扩展 DabbleDB 的策略。据我了解,客户的数据直接保存到图像中(每个客户一张图像)。这在他的用例中很有效,因为客户不必共享数据。这是一种常见的方法吗?

希望我没有制作这个 TLDR。非常感谢 Smalltalk 人员在我之前的问题中提供的见解。值得赞赏。

4

3 回答 3

13

贾斯汀,

别担心,Smalltalk 在这方面与其他语言没有太大区别,它只是添加了基于图像的持久性选项。

有像 Hibernate for Smalltalk 这样的 O/R 映射器,GLORP 及其 Pharo 端口 DBXtalk 无疑是当今最流行的映射器。如果您了解 Hibernate,这些对您来说应该会很舒服。

然后是诸如 GemStone 或 Magma DB 或 VOSS 之类的 OODB 解决方案,以及许多其他解决方案,可以让您将所有 O/R 映射问题抛在脑后。其中大部分仅限于存储 Smalltalk 对象,GemStone 是一个例外,它提供了与 Ruby 和其他语言的桥梁。

还有一些工具可以将 Smalltalk 对象存储在现代 NoSQL 数据库中,例如 CouchDB、Cassandra、GOODS 或其他数据库。这里的技巧只是将 Smalltalk 对象值转换为 JSON 流和一点 HTTP 请求。

最后还有保存完整 Smalltalk 图像的选项。我想说你可以在生产环境中做到这一点,但这不是许多人的标准或首选方式。您在开发过程中经常这样做,因为您可以简单地保存图像并在下次完全恢复您的工作时,所有对象都在您保存时的位置。

所以基线是:您所知道的所有存储选项都可以在 Smalltalk 中使用,另外还有一个。

约阿希姆

于 2011-12-01T15:34:57.183 回答
9

我想这基本上取决于您的数据库有多大以及它将处理什么样的负载。

就我而言,我编写的所有应用程序都使用图像持久性和磁盘序列化。本质上,您只需根据请求使用 Fuel 序列化您的对象。就我而言,每次处理重要数据时我都会这样做,再加上每 24 小时对它们进行序列化的常规过程。图像也会每 24 小时自动保存一次。

我使用这种方法编写的最大应用程序是处理一家由 10 名员工和大约 50 名每天使用它一年半的自由职业者组成的小公司的所有业务流程。考虑到应用程序一直在处理大文件,工作量相当“大”,但应用程序一直保持稳定和快速。切换到新服务器并更新 Pharo 映像就像从 monticello 取回项目并实现最新的序列化“数据库”一样简单。

在我看来,ORM 是一种不必要的痛苦,我们处于对象世界中,不得不扁平化我们的对象感觉是错误的,尤其是当我们有很好的面向对象解决方案时。

因此,如果您的应用程序处理相当少量的数据,我建议您使用我的简单方法或 SandstoneDB。如果您的应用程序处理大量事务和数据,我会选择 Gemstone。

只是我的两分钱。

于 2011-12-01T16:20:21.527 回答
7

Ramon Leon在他的博客文章中精美地描述了这种情况、基本策略和它们的权衡。

我将从他的 Simple Image Based Persistence 框架开始,该框架是我在 Pharo 1.3 中移植和使用的。Mariano Martinez Peck 最近将其改编为使用 Fuel(相同链接)。它非常简单,可以完成工作,让我更有信心按照自己的形象进行比赛,因为我知道即使我永久损坏它,我的所有数据都是安全的。我只是将数据文件夹复制到新的图像文件夹,加载我的包,我的所有对象都在新图像中。

于 2011-12-01T18:14:53.423 回答