Java 如何改进我的软件项目';速度是多少?

Java 如何改进我的软件项目';速度是多少?,java,database,performance,hibernate,Java,Database,Performance,Hibernate,我正在和我的同学用Java做一个学校软件项目。 我们将信息存储在远程数据库中 启动应用程序时,我们从数据库中提取所有信息,并将其转换为要在应用程序中使用的对象(使用java sql语句)。 在应用程序中,我们编辑其中一些对象,然后退出应用程序 我们使用Hibernate在数据库中保存或更新信息 正如您所看到的,我们不使用Hibernate来获取信息,我们只使用它来保存和更新信息 我们有两个,但非常相似的问题。 在db中加载对象(启动应用程序时)和保存对象(使用Hibernate)(关闭应用程序时

我正在和我的同学用Java做一个学校软件项目。 我们将信息存储在远程数据库中

启动应用程序时,我们从数据库中提取所有信息,并将其转换为要在应用程序中使用的对象(使用java sql语句)。 在应用程序中,我们编辑其中一些对象,然后退出应用程序 我们使用Hibernate在数据库中保存或更新信息

正如您所看到的,我们不使用Hibernate来获取信息,我们只使用它来保存和更新信息

我们有两个,但非常相似的问题。 在db中加载对象(启动应用程序时)和保存对象(使用Hibernate)(关闭应用程序时)花费的时间太多。 我们的项目不是一个大型企业应用程序,它是一个相当小的应用程序,我们只是管理一些学生、教师、家庭作业和考试。所以我们的db也非常非常小。 我们如何提高性能


稍后编辑:如果我们使用本地数据库,它运行得很快,但在远程数据库上运行得很慢

您是说您正在将整个数据库加载到内存中,然后对其进行操作?如果是这样的话,为什么不干脆将数据库用作存储设备,并根据需要进行查找和操作(如果喜欢,可以使用Hibernate,如果不喜欢,可以使用其他方法)?这里的关键是确保使用连接池,因为这将减少连接时间


如果这是您正在做的事情,那么您也可能会遇到内存问题-首先,通过不在内存中缓存整个数据库,您将减少内存,并将网络负载从开始/结束分散到需要发生的时间。

对于您正在做的事情,您最好序列化对象并将其写入平面文件

但是,更有可能的是,您应该根据需要直接从数据库读取/更新对象,而不是一次读取/更新所有对象,因为aperkins给出了所有理由


还考虑如果应用程序崩溃会发生什么?如果在应用程序关闭之前,您的所有更新都只保存在内存中,那么如果应用程序意外关闭,则所有更新都将丢失。

项目已基本完成。我们现在不能对它进行大规模重构。 我试图在保存时使用Hibernate的二级缓存。EhCacheProvider

在hibernate.xml中: net.sf.ehcache.hibernate.EhCacheProvider

我已经为缓存进行了配置,ehcache.xml:

我已将cache.jar放在项目构建路径中 我已经为每个类设置了hibernate属性,并在映射中进行了设置。 但是这个缓存似乎没有效果。我不知道它是否有效(如果被使用)

  • 尽量减少SQL查询的数量,因为每个查询都有自己的开销
  • 您可以启用数据库压缩,当有大量数据时,这将加快速度
  • 可能您多次连接到数据库
  • 检查远程数据库服务器的ping时间-这可能是问题所在

  • 这两句话对我来说是危险信号:

    当我们启动应用程序时,我们将 数据库中的所有信息 并将其转换为要使用的对象 在我们的应用程序中(使用java sql 政治家)。在我们编辑的应用程序中 一些这样的物体,然后当我们 退出我们保存或更新的应用程序 数据库中的信息使用 冬眠

    在启动时将数据库中的所有信息加载到内存中,或者为什么要等到关机后再将更改保存回数据库中,这是出于什么原因

    如果不是,我建议改变设计。如果数据库中的表已经有了Hibernate映射,那么我将对所有CRUD(创建、读取、更新、删除)操作都使用Hibernate。而且,我只加载应用程序中每个页面需要的数据,因为它需要

    如果此时无法进行这种设计更改,我认为您必须仔细研究如何管理数据库连接。您正在使用连接池吗?您是否正在打开多个连接?忘了释放它们


    还有别的东西要看。如何使用Hibernate将实体保存到数据库中?您是否正在执行getHibernateTemplate().get操作,然后执行entity.save或entity.update操作?如果是这样,这意味着您也在使Hibernate在保存或更新之前对每个数据库对象运行select查询。因此,本质上,每个数据库对象要加载两次(一次在程序开始时,一次在保存之前)。要查看是否发生了这种情况,您可以打开或使用查看Hibernate正在运行的查询。

    由于您的应用程序在远程数据库服务器上运行时速度很慢,我假设性能损失是由于:

    • 连接到服务器:尝试重用连接(传递实例)或使用连接池
    • 查询往返时间:使用尽可能少的查询,如果是手写DAL,请参见此处:
    对于hibernate,您可以使用其批处理功能并调整
    hibernate.batch\u size


    在所有情况下,尤其是当您无法重构代码库的较大部分时,请使用探查器(方法时间或sql查询)查找瓶颈。我敢打赌,您会发现数千个查询,每个查询都需要10毫秒(RTT),可以合并为一个查询。

    您可以查看其他一些内容:

    • 您可以为JVM分配更多内存
    • 使用该工具调查瓶颈是什么

    从远程数据库服务器加载所有内容与从本地数据库服务器加载所有内容的区别在于网络延迟/管道大小。网络是一个比其他任何管道都小得多的管道。两个问题:首先,我们到底在谈论多少数据