在数据库中搜索文本:使用MySQL全文搜索将数据库记录缓存到域逻辑V / S中?

时间:2011-11-24 04:43:36

标签: mysql database design-patterns java-ee web-application-project

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

UI:html,javascript和jquery
域逻辑:Java和servlets
业务逻辑:MySQL

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

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

考虑坚实的设计模式,这更好(性能和速度):

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

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

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

1 个答案:

答案 0 :(得分:6)

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

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

需要考虑的一个问题是,当管理层添加新记录时,对于这种情况,我将使用另一种名为“观察者模式”的设计模式(您可以在this book中了解它。) />
更新:
如果您处理类似情况,最好使用 MySQL索引。我在“书名”的列上使用它来加快缓存对象的加载速度,因为在我的情况下,缓存对象将只包含书名,因为在UI中使用搜索字段,用户只关心一本书的名字。 PS:仅当用户点击下拉列表中的图书名称时才会加载其他图书详细信息,此时您可能想要使用另一个包含详细信息的身份图。这种架构背后的原因是,从逻辑上讲,你的应用程序的所有用户同时搜索(加载)了你的数据库中的所有书籍(及其详细信息),从而最大限度地减少服务器内存和带宽您首先使用的用法是在内存中加载整列书名,以便更快地搜索所有可用的书名只有在用户需要时才会加载它们的详细信息(即内存中的更多空间)保存在另一个身份地图中,供另一个用户搜索具有相同详细信息的同一本书。在我看来,这可以最大限度地减少服务器上的内存使用量,减少对数据库的调用,以获取之前已被其他用户提取的详细信息。