我使用一个用 Java 编写的非常大的企业应用程序,该应用程序查询 Oracle SQL 数据库。我们在前端使用 JavaScript,并且一直在寻找通过增加使用来提高应用程序性能的方法。
我们现在遇到的问题是,我们正在通过 Java 发送一个查询,该查询会产生 39,000 条记录。这会给服务器带来很大的负载并导致浏览器挂起。我应该提到的是,数据是相对静态的(大约每年只更改一次),我们可以使用 xml 映射或类似的东西(平面文件),因为我们知道每次返回的确切结果。
但是,该查询的加载时间仍为 1.5 - 2 分钟,这是 Not Acceptable 。我想看看是否有关于如何优化此场景的任何建议,特别是如果可以使用 JavaScript(或 jQuery)并使用 AJAX 进行数据库连接更快地完成。或者,我们对这个问题的处理完全错误吗?
最佳答案
您想要确定速度缓慢是否是由于:
- 在数据库中执行的查询
- 网络速度缓慢,返回 39k 条记录
- ajax 完成后,JavaScript 处理 39k 条记录
如果您可以在 sqlplus 或 toad 中运行查询,这将消除 Web 层和网络。如果速度很慢,则通过检查索引来调整查询。
如果添加适当的索引后,查询仍然很慢,那么您可以预先构建查询的结果并将结果存储在表中,或者您可以创建一个物化 View 。
一旦您的 sqlplus 查询运行良好,就可以将网络重新添加到方程中。从网络浏览器运行它并查看增加了哪些开销。
如果仍然很慢,那么您需要确定问题是否出在 ajax 数据操作上,或者是否在页面对数据执行某些操作(即通过 JavaScript 填充数据网格)之后发生缓慢。
如果速度缓慢是因为浏览器正在等待数据,那么您需要确保只提取一次数据。您可以通过在 ajax 请求中设置缓存 header 来将结果缓存 1 年来实现此目的。或者您可以将结果存储在localstorage
中。
如果速度缓慢是由于浏览器处理 39k 行(即将数据移动到数据网格中)造成的,那么您有几个选择。
- 寻找更好的方法或库
- 使用分页
您可能会发现这些方面存在性能问题。最有可能的是,查询只需要调整,通过添加索引或预查询数据并存储它就可以解决问题。
要考虑的另一件事是您是否确实一次需要 39k 行。如果可以,请在数据库级别进行分页,以便每页返回 100 行。
关于java - AJAX/JavaScript 搜索性能优于 Java/Oracle,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28696330/