如何管理内存中的主数据以避免在 n-layered 应用程序中损害数据库
How to manage master data in memory to avoid harming database in n-layered application
我正在开发一个用于学习目的的桌面应用程序,我正在处理如何避免损坏数据库的不确定性,因为每次用户打开表单时都会不断查询主数据 (window、用户控制、视图等)和 加载时间导致的糟糕用户体验。
例如:
要创建新产品,应用程序必须加载所有类别和品牌。
通常,主表中的所有数据(客户、员工、产品类别等)都会发生这种情况。
对我来说最简单的解决方案:
由于此类数据的性质,我可以得到一个collections:
- 在需要新数据时查询自上次更新时间跨度。
- 每 X 次(可能 1 小时)更新 collections 的所有内容。
如果这是最好的解决方案,我应该把这些 collections 放在哪里?
我使用 3 层,DAL、BLL、PL,其中 PL 知道 BLL。
这些 collections 应该是静态的吗?或者在单例中 class?
额外:
我尽量做到笼统(不提及语言或框架)。
不过,我用的是C#和MySQL。
我在没有 DataTable
s 的情况下编写程序(只是将使用 Command.ExecuteReader()
获得的数据映射到我的实体)。
我最近制作了一份副本并开始使用 EntityFramework 6。
我想可能有办法让 EF 缓存结果,但为此你需要实现二级缓存,我不想那样做(因为考虑到数据的性质,我的需求更简单)。
谢谢,如果我的英语不好,请见谅!
我不确定如何将主数据值存储在内存中,但逻辑上应该如下所示。
BLL 应首先在 in-memory
中查找主数据,如果找到则使用该数据。
如果数据在 in-memory
中不可用,那么它应该从 DAL 请求该数据。 DAL 将从数据库中提取数据而不用担心最后更新日期并将其发送回 BLL。
现在BLL应该首先将来自DAL的数据存储在in-memory
中,并有一定的有效期,然后再使用这些数据。有效期将确保,当有效期结束时,数据会自动从 in-memory
中删除。
然后循环重复。
在in-memory
中存储数据的最佳方式是像List这样的集合。这样您就可以轻松地迭代它并轻松访问它的属性。
理想情况下,如果您有存储库层,那么存储库层应该会处理这些事情。 BLL 层只为主数据调用 Repository,如果在 in-memory
中不可用,存储库会担心签入 in-memory
并从 Db 获取并在到期时将其存储回 in-memory
。
我正在开发一个用于学习目的的桌面应用程序,我正在处理如何避免损坏数据库的不确定性,因为每次用户打开表单时都会不断查询主数据 (window、用户控制、视图等)和 加载时间导致的糟糕用户体验。
例如:
要创建新产品,应用程序必须加载所有类别和品牌。
通常,主表中的所有数据(客户、员工、产品类别等)都会发生这种情况。
对我来说最简单的解决方案:
由于此类数据的性质,我可以得到一个collections:
- 在需要新数据时查询自上次更新时间跨度。
- 每 X 次(可能 1 小时)更新 collections 的所有内容。
如果这是最好的解决方案,我应该把这些 collections 放在哪里?
我使用 3 层,DAL、BLL、PL,其中 PL 知道 BLL。
这些 collections 应该是静态的吗?或者在单例中 class?
额外:
我尽量做到笼统(不提及语言或框架)。
不过,我用的是C#和MySQL。
我在没有 DataTable
s 的情况下编写程序(只是将使用 Command.ExecuteReader()
获得的数据映射到我的实体)。
我最近制作了一份副本并开始使用 EntityFramework 6。
我想可能有办法让 EF 缓存结果,但为此你需要实现二级缓存,我不想那样做(因为考虑到数据的性质,我的需求更简单)。
谢谢,如果我的英语不好,请见谅!
我不确定如何将主数据值存储在内存中,但逻辑上应该如下所示。
BLL 应首先在 in-memory
中查找主数据,如果找到则使用该数据。
如果数据在 in-memory
中不可用,那么它应该从 DAL 请求该数据。 DAL 将从数据库中提取数据而不用担心最后更新日期并将其发送回 BLL。
现在BLL应该首先将来自DAL的数据存储在in-memory
中,并有一定的有效期,然后再使用这些数据。有效期将确保,当有效期结束时,数据会自动从 in-memory
中删除。
然后循环重复。
在in-memory
中存储数据的最佳方式是像List这样的集合。这样您就可以轻松地迭代它并轻松访问它的属性。
理想情况下,如果您有存储库层,那么存储库层应该会处理这些事情。 BLL 层只为主数据调用 Repository,如果在 in-memory
中不可用,存储库会担心签入 in-memory
并从 Db 获取并在到期时将其存储回 in-memory
。