Smalltalk / Seaside中的数据持久性

时间:2011-12-01 15:01:33

标签: persistence smalltalk seaside

我最近花了一些时间熟悉Smalltalk和Seaside。我来自Java EE世界,你可以想象,围绕一些Smalltalk概念进行思考是很困难的。 :)

目前我正在努力了解数据持久性最常见于Smalltalk世界。我作为Java程序员的假设是使用RDMS(即MySQL)和ORM(即Hibernate)。据我所知,Smalltalk不是这种情况(至少使用Hibernate)。我不一定非常希望找到与Java EE中的映射方式最接近的方法。

最常见的是将数据保存到图像,对象存储或RDMS中吗?对于Smalltalk应用程序来说,使用RDMS甚至是典型的吗?

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

我看过video Avi Bryant讨论他用于持久化和扩展DabbleDB的策略。根据我的理解,客户的数据被保存在图像中(每个客户一个图像)。这在他的用例中起作用,因为客户不必共享数据。这是一种常见的方法吗?

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

3 个答案:

答案 0 :(得分:13)

贾斯汀,

不用担心,Smalltalk在这个领域与其他语言没那么不同,它只是添加了基于图像的持久性选项。

有像Hibernate for Smalltalk这样的O / R映射器,GLORP及其Pharo端口DBXtalk当然是最受欢迎的。如果您了解Hibernate,这些应该让您感觉很舒服。

然后有像GemStone或Magma DB或VOSS这样的OODB解决方案以及其他许多可以让你抛开所有O / R映射问题的解决方案。其中大部分仅限于存储Smalltalk对象,GemStone是为Ruby和其他语言提供桥梁的例外。

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

最后,您可以选择保存完整的Smalltalk图像。我说你可以在生产环境中做到这一点,但对于很多人来说,它不是标准或首选的方式。你在开发过程中经常做很多事情,因为你可以简单地保存一个图像,并在下次完成所有对象时恢复你的工作,就像你保存时一样。

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

勒夫

答案 1 :(得分:9)

我想这主要取决于你的数据库有多大以及它将处理什么样的负载。

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

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

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

因此,如果您的应用处理相当少量的数据,我建议使用我的简单方法或SandstoneDB。如果您的应用处理大量交易和数据,我会去Gemstone。

只是我的两分钱。

答案 2 :(得分:7)

Ramon Leon精美地描述了情况,基本策略及其权衡in his blog post

我将从他的基于简单图像的持久性框架开始,我ported并在Pharo 1.3中使用它。马里亚诺马丁内斯佩克最近改编它使用燃料(相同的链接)。它非常简单,完成工作,让我更有信心在我的图像中玩,知道即使我永久性地损坏它,我的所有数据都是安全的。我只是将数据文件夹复制到新的图像文件夹,加载我的包,并且我的所有对象在新图像中都是活动的。