我正在和我的同学一起做一个Java的学校软件项目。我们把信息存储在远程数据库上。
在启动应用程序时,我们从数据库中提取所有的信息,并将其转换为应用程序中要使用的对象(使用java )。在应用程序中,我们编辑这些对象中的一些,然后当我们退出应用程序时,我们使用Hibernate在数据库中保存或更新信息。
正如您所看到的,我们不使用Hibernate来提取信息,而是使用Hibernate保存和更新信息。
我们有两个,但非常相似的问题。对象的加载(当我们启动应用程序时)和对象的保存(使用Hibernate)在db中(关闭应用程序时)花费了太多的时间。我们的项目不是一个庞大的企业应用程序,它是一个很小的应用程序,我们只是管理一些学生,教师,家庭作业和测试。所以我们的数据库也很小。我们如何才能提高业绩?
稍后编辑:如果我们使用本地数据库,它运行得非常快,它只是在远程数据库上运行缓慢。
发布于 2010-05-18 19:05:32
您是说要将整个数据库加载到内存中,然后操作它吗?如果是这样的话,为什么不直接使用数据库作为存储设备,并根据需要进行查找和操作(如果您愿意的话使用Hibernate,或者如果您不愿意的话使用其他的东西)?关键是确保您正在使用连接池,因为这将减少连接时间。
如果这就是您正在做的事情,那么您可能也会遇到内存问题--首先,如果不将整个数据库缓存在内存中,您将减少内存,并将网络负载从开始/结束分散到需要发生的时间。
发布于 2010-05-18 19:20:53
这两句话对我来说是个危险信号:
在启动应用程序时,我们从数据库中提取所有信息,并将其转换为应用程序中要使用的对象(使用)。在应用程序中,我们编辑这些对象中的一些,然后当我们退出应用程序时,我们使用Hibernate在数据库中保存或更新信息。
是否需要在启动时将数据库中的所有信息加载到内存中,或者为什么要等到关机才将更改保存回数据库中?
如果没有,我建议改变设计。如果您已经为DB中的表获得了Hibernate映射,那么我将在所有CRUD操作(创建、读取、更新、删除)中使用Hibernate。而且,我只会加载您的应用程序中的每个页面所需的数据,就像它所需要的那样。
如果此时无法进行这种设计更改,我认为您必须仔细研究如何管理数据库连接。您正在使用连接池吗?你要打开多个连接吗?忘了释放他们?
还有别的东西要看。如何使用Hibernate将实体保存到数据库?您是对每个.get执行一个entity.save ().get,然后对每一个执行entity.save或entity.update吗?如果是这样的话,这意味着您还会导致Hibernate在每个数据库对象进行保存或更新之前运行一个select查询。因此,实际上,您需要加载每个数据库对象两次(一次在程序开始时,一次在保存之前)。要查看是否发生了这种情况,您可以打开sql属性或使用P6Spy查看Hibernate正在运行的查询。
发布于 2010-05-18 19:11:57
对于您正在做的事情,最好是序列化对象并将它们写入一个平面文件。
但是,更有可能的是,您应该根据需要直接从数据库中读取/更新对象,而不是一次性读取/更新对象,这是aperkins给出的所有原因。
另外,考虑一下如果应用程序崩溃会发生什么?如果所有更新都保存在内存中,直到应用程序关闭为止,如果应用程序意外关闭,所有更新都会丢失。
https://stackoverflow.com/questions/2860217
复制相似问题