【问题标题】:Searching text in database: caching database records into domain logic V/S using MySQL full-text search?在数据库中搜索文本:使用 MySQL 全文搜索将数据库记录缓存到域逻辑 V/S 中?
【发布时间】:2012-01-05 08:13:04
【问题描述】:

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

用户界面:html、javascript 和 jquery
领域逻辑:Java 和 servlet
业务逻辑:MySQL

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

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-03-10
      • 2013-07-21
      • 1970-01-01
      • 2010-09-22
      • 1970-01-01
      • 2016-04-05
      • 1970-01-01
      • 2011-10-02
      • 2017-08-12
      相关资源
      最近更新 更多