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

sha*_*sco 2 mysql database design-patterns java-ee vs-web-application-project

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

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

我在数据库中有大量记录,其中包含有关书籍的信息.此外,该应用程序将同时被许多用户使用.我希望用户能够在搜索文本字段中输入图书的"名称",例如"book1",并使用jquery自动完成显示下拉列表.

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

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

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

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

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

sha*_*sco 6

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

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

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

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