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

时间:2015-02-18 10:59:13

标签: java performance

根据我的理解,java程序的执行速度非常快,使应用程序变慢的主要原因是网络和IO操作。

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

我有一个MVC应用程序,在我查看页面之前,我经过一个Controller,后者又调用了Services,最后调用了一些DAO方法。

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

由于服务调用各种DAO方法,并且每个DAO方法使用不同的连接对象,我想到这样做:“只创建一个服务可以调用的DAO方法,这个DAO方法将触发所有查询连接对象。“

这样可以节省连接和断开连接数据库的时间。

但是,我的应用程序中的连接对象来自连接池。并且大多数连接池都不会关闭它们只是将它们发送回连接池的连接。所以我的上述解决方案不会产生任何影响,因为无论如何都没有打开和关闭连接。

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

4 个答案:

答案 0 :(得分:1)

首先,您应该使用Profiler等工具准确确定花费的时间。

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

如果没有准确理解花费时间的处理,就很难做出任何合理的优化。

答案 1 :(得分:1)

如果重用池中的连接对象,这意味着连接/断开连接不会产生任何性能问题。

我同意Ashwinee K Jha的说法,Profiler会给你一些关于你可以优化的明确信息。

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

  1. 你能保留一些答案吗?我猜不是所有10,000个查询都不同!
  2. 尝试调整池中的Connection对象数。应该有一个最佳数字。
  3. 您的查询执行是否已经是多线程的?我想是的,所以尝试调整线程数。一般来说,内核的数量是很多线程但是在I / O的情况下,数量要大得多(成本最高的是I / O,而不是CPU)。

答案 2 :(得分:0)

您可以使用使用连接池的Apache DBCP,调用数据库IO的成本很高,但主要是数据库连接打开和关闭占用大量时间。 您还可以增加maxIdle时间(池中可以保持空闲的最大连接数) 您还可以查看内存数据网格中的 ,例如hazelcast

答案 3 :(得分:0)

一些建议:

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