2

我正在开发一个分层的网络应用程序。简而言之,它有:

UI:html、javascript 和 jquery
领域逻辑:Java 和 servlet
业务逻辑:MySQL

我在数据库中有大量包含书籍信息的记录。此外,该应用程序将被很多用户同时使用。我想让用户在搜索文本字段中输入一本书的“名称”,比如“book1”并使用jquery autocomplete显示一个下拉列表。

数据库中的记录是不可更新的,因为它们永远不会改变。

考虑到可靠的设计模式,哪个更好(性能和速度方面):

将这些数据库记录预加载到域逻辑的缓存对象中,并让用户从该对象中搜索(查询)它们?还是使用 MySQL 全文搜索之类的方法直接从数据库中查询?

如果使用 MySQL 全文搜索,我担心许多用户同时对数据库进行大量调用。至于预加载到缓存对象中,我不确定这是否是一个好的软件实践,有人推荐吗?我应该为记录设置一个计时器以保持缓存在内存中吗?

这两种方法中哪一种更可取?对于这种情况,还有其他更好的方法吗?

4

1 回答 1

6

我找到了一个解决方案,希望这个答案能帮助那些处理类似情况的人:
我将使用我过去经常使用的软件工程设计模式,称为Identity Map

只是这一次,由于记录不可更新(即不可更改),我将仅使用身份映射的缓存功能。因此,一旦服务器启动,我将把数据库中的记录加载到这个身份映射对象中。这样,用户将直接从域层查询它们,从而更快、更少地调用数据库。

需要考虑的一个问题是,当管理人员添加新记录时,对于这种情况,我将使用另一种称为“观察者模式”的设计模式(您可以在本书中了解它)。

更新:
如果您正在处理类似的情况,一个好主意是使用MySQL indexing。我在“书名”列上使用它来加快缓存对象的加载速度,因为在我的情况下,缓存对象将只包含书名,因为使用 UI 中的搜索字段,用户只关心一本书的名字。PS:只有当用户单击下拉列表中的书名时,才会加载其他书的详细信息,此时您可能希望使用另一个包含详细信息的身份映射。这种架构背后的原因是,从逻辑上讲,您永远不会让您的应用程序的所有用户同时搜索(加载)数据库中的所有书籍(及其详细信息)......从而最大限度地减少服务器内存和带宽使用你首先妥协在内存中加载整列书名,以便更快地搜索所有可用的书名但是他们的详细信息(即内存中的更多空间)将仅在用户需要时加载,并将保存在另一个身份映射中,以供另一个用户使用相同的详细信息搜索同一本书。在我看来,这可以最大限度地减少服务器上的内存使用,并减少对数据库的调用以获取其他用户之前已经获取的详细信息。

于 2011-12-12T18:32:36.623 回答