惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

J
Java Code Geeks
GbyAI
GbyAI
Google DeepMind News
Google DeepMind News
Jina AI
Jina AI
B
Blog
aimingoo的专栏
aimingoo的专栏
酷 壳 – CoolShell
酷 壳 – CoolShell
T
The Blog of Author Tim Ferriss
Last Week in AI
Last Week in AI
月光博客
月光博客
H
Help Net Security
V
Visual Studio Blog
量子位
A
About on SuperTechFans
博客园 - Franky
人人都是产品经理
人人都是产品经理
N
Netflix TechBlog - Medium
云风的 BLOG
云风的 BLOG
雷峰网
雷峰网
Martin Fowler
Martin Fowler
Microsoft Security Blog
Microsoft Security Blog
博客园 - 叶小钗
P
Proofpoint News Feed
MongoDB | Blog
MongoDB | Blog

夜行人

回家路上 第一期的直播演示项目 震动检测器 正能量 在线参观CodeLab Neverland 发布 CodeLab Adapter 3.3.1 DynamicTable 之 纸糊方向盘 CodeLab DynamicTable: 一个可实施的技术方案 CodeLab Insight 发布 Alpha 版 情人节 Home Assistant 周报 && IoT 周报 (02) Joplin: 关注隐私的 Evernote 开源替代软件 浏览器的未来与 Web 传感器 Home Assistant 周报 && IoT 周报 (01) 百宝箱(01) 论自由 介绍 WebThings Home Assistant 周报 && iot 周报 (00) 百宝箱(00) 毛姆读书心得 传世之作 周末徒步 CodeLab Adapter ❤️ Jupyter/Python 航班 躲雨 夏令营途中 [译]思想--作为一种技术 The future of coding 美国之行 三门问题的程序模拟
SandstoneDb: Squeak 中的简易持久化存储
种瓜 · 2022-09-08 · via 夜行人

文章目录

前言

Seaside 文档所言, 不同的情况下,有不同的存储需求:

  • 如果你在编写小型演示程序,并希望在系统中填充一些典型数据。使用类实例变量来存储数据,然后简单地保存 image 就行了。这种情况下,直接存储 image 是最简单的。
  • 如果你有一个包含几十万个对象的小型系统,并且不想依赖于外部系统. SandstoneDB 可能是一个完美选择。对象将保存在文件系统里, 并保留了一些旧版本的数据,因此备份或恢复很容易。
  • 如果你有一个遗留的关系数据库,需要为其编写了大量报表。可使用 ORM。
  • 如果你有一个复杂且大型的对象模型,它必须支持在开发时更改对象模型。解决方案是 OODB。Gemstone 是经过验证的大型商业产品。

SandstoneDB 足以覆盖多数人的多数用例,SandstoneDb, Simple ActiveRecord Style Persistence in Squeak 对此有精彩论述。

使用 SandstoneDB 的场景

以下是我自己可能会用到 SandstoneDB 的场景:

  • 使用 Seaside 构建小型 Web 应用
  • 数据类型的应用(如爬虫)
  • 将 Squeak 作为日常工作环境使用时,需要 SandstoneDB 实时持久化一些实例数据(诸如备忘录),避免图像意外崩溃造成的数据丢失

使用

SandstoneDb 文档匮乏,而且一些过时的信息已经不再适用(如这个视频演示)。以下是我的使用笔记,供其他新用户参考 (Squeak/Pharo 中应该都能使用).

安装

1
2
3
4
Gofer new
    squeaksource: 'SandstoneDb';
    package: 'SandstoneDb';
    load.

SandstoneDb 支持多种不同的存储后端, 在此我们使用基于文件系统的存储后端。

打开 Monticello,加载我们需要的存储后端: SandstoneDbFileDirectoryStore, 其中包含 SDFileStore 类。SandstoneDbFileDirectoryStore 依赖于SandstoneDbTests,所以先加载SandstoneDbTests。如果你跟我一样在使用 Squeak,建议也顺便加载 SandstoneDbSqueak

完成后,你应该能够在 browser 里看到这几个包:

测试一下

Test Runner运行测试看看是否一切正常

如果一切正常,你应该会在 Squeak 目录里看到 SandstoneDb 的数据目录:

.

开始使用

结下来就可以开始创建我们的第一个数据类:

开始创建我们的第一个数据存储类: Person

1
2
3
4
5
SDActiveRecord subclass: #Person
	instanceVariableNames: 'name'
	classVariableNames: ''
	poolDictionaries: ''
	category: 'Data-Fun'

实例方法:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
Person>>name

    ^ name

Person>>name: aString

    name := aString

printOn: aStream
	
	aStream nextPutAll: self name

类方法:

1
2
3
Person class>>named: aString

    ^ self new name: aString

创建完成后,保存并退出 image。再次加载 image,你就能在 Squeak 目录里(跟 image 在同一层级)看到:

每次创建完新的数据类,需要保存并退出 image, 来创建本地数据仓库。

现在就可以开始使用 SandstoneDb 持久化的能力了。

在 Workspace 里创建 3 条数据:

1
2
3
4
5
(Person named: 'joe') save.
(Person named: 'bob') save.
(Person named: 'alice') save.

Person findAll size.

直接退出 image.

再次进入镜像, 运行 Person findAll size. 发现存在 3 条数据,说明这些数据已经在镜像之外持久化了.

版本信息

在次列出我的系统和软件包信息:

Squeak: Squeak6.1alpha-22143-64bit

SandstoneDb:

  • SandstoneDb-tcj.152
  • SandstoneDbFileDirectoryStore-RamonLeon.2
  • SandstoneDbSqueak-RamonLeon.1
  • SandstoneDbTests-RamonLeon.13

参考