0

我的应用程序使用 Sembast DB 在本地存储了个人资料和工作数据库(和其他)。请看下面的两个例子,哪一个是异步进程的更好实践?

示例 1:

final profileDBPath = p.join(appDocumentDir.path, dbDirectory, 'profile.db');
final profileDB = await databaseFactoryIo.openDatabase(profileDBPath);

final workDBPath = p.join(appDocumentDir.path, dbDirectory, 'work.db');
final workDB = await databaseFactoryIo.openDatabase(workDBPath);

final workStore = stringMapStoreFactory.store('work');
final profileStore = stringMapStoreFactory.store('profile');

示例 2:

final dbPath = p.join(appDocumentDir.path, dbDirectory, 'database.db');

final database = await databaseFactoryIo.openDatabase(dbPath);

final workStore = stringMapStoreFactory.store('work');
final profileStore = stringMapStoreFactory.store('profile');

因此请注意,示例 1 为每个profile和打开两个不同的数据库文件work。示例 2database对两者使用相同的文件。

问题是哪一个在稳定性方面更好?为了编码的简单性,我更喜欢示例 2,但我担心的是,在异步操作中,示例 2 会在它们同时写入同一个文件时崩溃。有任何想法吗?

谢谢

4

1 回答 1

1

示例 2 在同时写入同一个文件时会崩溃

我不知道这是你的实验还是只是一个假设。Sembast 数据库支持多个并发读取器和单个写入器(单个进程和单个隔离),并且会适当地使用一种互斥体来确保数据一致性。并发写入将被序列化,不应触发任何崩溃。如果是这样,那就是你应该填补的错误!

就个人而言,我会选择单个数据库,它允许跨存储事务以实现 2 个数据库无法提供的数据一致性。

于 2020-07-24T15:14:53.980 回答