如何提高对数据库进行多次调用的Java应用程序的性能?

如何提高对数据库进行多次调用的Java应用程序的性能?,java,performance,Java,Performance,据我所知,java程序的执行非常快,减慢应用程序速度的主要是网络和IO操作 例如,如果我有一个For循环运行10000次,它打开一个文件,处理一些数据并将数据保存回文件中如果应用程序运行缓慢,不是因为循环执行10000次,而是因为循环中的文件打开和关闭。 我有一个MVC应用程序,在我查看页面之前,我先浏览一个控制器,该控制器依次调用服务,最后调用一些DAO方法 问题是在页面加载之前有太多的查询被触发,因此页面加载时间为2分钟,这很可怜。 由于服务调用不同的DAO方法,并且每个DAO方法使用不同的

据我所知,java程序的执行非常快,减慢应用程序速度的主要是网络和IO操作

例如,如果我有一个For循环运行10000次,它打开一个文件,处理一些数据并将数据保存回文件中如果应用程序运行缓慢,不是因为循环执行10000次,而是因为循环中的文件打开和关闭。

我有一个MVC应用程序,在我查看页面之前,我先浏览一个控制器,该控制器依次调用服务,最后调用一些DAO方法

问题是在页面加载之前有太多的查询被触发,因此页面加载时间为2分钟,这很可怜。

由于服务调用不同的DAO方法,并且每个DAO方法使用不同的连接对象,因此我考虑这样做:“只创建一个服务将调用的DAO方法,此DAO方法将在一个连接对象上触发所有查询。”

因此,这将节省连接和断开与数据库连接的时间

但是,我的应用程序中的连接对象来自连接池。大多数连接池不会关闭连接,而是将它们发送回连接池。因此,我的上述解决方案不会产生任何效果,因为无论如何都不会打开和关闭连接


如何提高应用程序的性能?

首先,您应该使用Profiler之类的工具准确地确定时间花在哪里

一旦知道根本原因,您就可以看到是否可以优化操作,即删除不必要的步骤。如果没有,则可以查看操作的结果是否可以缓存和重用

如果不准确了解需要花费时间的处理过程,就很难进行任何合理的优化。

您可以使用which use连接池,调用数据库IO的成本很高,但大多数情况下,打开和关闭数据库连接需要大量时间。 您还可以增加maxIdle时间(池中可以保持空闲的最大连接数)
此外,如果重用池中的连接对象,则可以查看内存中的数据网格,这意味着连接/断开不会产生任何性能问题

我同意Ashwine K Jha的观点,剖析器会给你一些清晰的信息,告诉你可以优化什么

同时,一些其他想法/建议:

  • 你能保存一些答案吗?我猜不是所有的10000个查询都是不同的
  • 尝试调整池中连接对象的数量。应该有一个最佳的数字
  • 您的查询执行是否已经是多线程的?我想是的,所以试着调整线程的数量。通常,内核的数量是一个很好的线程数量,但在I/O的情况下,更大的数量是最佳的(最大的成本是I/O,而不是CPU)
  • 一些建议:

    • 扩展数据库。也许数据库本身就是很慢
    • 使用“二级缓存”或应用程序会话缓存来 可能会加快速度并减少查询的需要
      数据库
    • 更改查询、应用程序或架构以减少 打过电话

    我会尽量减少被触发的查询数量。你通常不需要一次就需要这么多。查找通过另一个查询已经获得的数据,或者尝试以某种方式组合查询。如果没有任何结果,你应该使它异步(像AJAX那样)@Jan:我试图减少查询,但要求说我需要这么多数据,而且每个查询都完全不同于另一个查询。AJAX调用本身需要1分钟47秒。在服务器上执行的时间太长了,我该怎么办?你能把它分成更多的AJAX调用吗?这会产生开销,但如果您不需要同时使用所有内容,则可以显示已经可用的结果。其他答案已经提到:探查器和性能优化或缓存。悲哀的是:在某些情况下,需求是错误的/不现实的……我不知道这个分析器。但是我使用定制的DateDifference方法来检查它们的性能,这些方法非常耗时。在服务器上花费的时间为1分钟50秒Profiler可以告诉您更多详细信息,如最常调用的方法、在方法上花费的平均时间等。有时分析可能会揭示导致性能问题的有趣的事情。我不允许接触该方案。您使用任何类型的缓存吗?如果您使用的是Hibernate等,您可以启用二级缓存。如果应用程序两次执行相同的查询,第二次将无法访问数据库。否。使用纯JDBC.Ok。如果您能够以某种方式“拦截”对DAO方法的调用,您可以:检查是否已经进行了此调用,如果已经进行了,则从“其他地方”返回,否则调用数据库,将结果放在“其他地方”,然后返回。要做到这一点,您需要使用AOP和EHCache。您在使用Spring吗?实际上,从您对上面Jan的响应来看,缓存可能没有帮助。您只需要使您的数据库“更好”。你的数据库技术是什么?你能把它集中起来吗?