Hibernate中匿名对象的内存占用

问题描述 投票:3回答:2

我目前正在开发一个使用Struts和Hibernate构建的项目。

项目中的所有DAO类都具有以下代码

内部构造函数:

hibernateSession = HibernateUtil.currentSession();      
tx=hibernateSession.beginTransaction();

所有方法的最终子句内部:

HibernateUtil.closeSession();

这实际上意味着,在我的业务代码中,我必须初始化引用变量或每次我想从数据库访问数据时创建一个匿名对象,即

如果我必须访问method1method2class A

A a= new A();

a.method1(); // access method 1 

a = new A();  
a.method2(); //access method 2

I now mostly use anonymous objects to get this done ie

new A().method1(); //access method 1
new A().method2(); //access method 2 

现在我的问题是:

  1. 使用后是否收集了匿名对象垃圾?在我的项目中,由于每次访问DAO类中的方法都是通过匿名对象进行的,它是否会对内存占用产生负面影响?如果是的话还有其他选择吗
  2. 我正确地做到了还是有更好的方法?
  3. 这是使用Hibernate实现的最佳/正确方法吗?
  4. 我对new A();使用术语“匿名对象”是否正确?在Google中搜索同样的内容时,我注意到很多评论说这不是Java中的匿名对象,但也有一些文章将其解释为匿名对象。
java hibernate anonymous-class
2个回答
3
投票
  1. 没有匿名对象这样的东西。您可以拥有匿名类实例,但在您的情况下,我认为您的意思是“局部变量”。 GC对短期对象使用高度优化的收集策略,因此即使在商品硬件上也不会出现内存问题。
  2. 还有更好的方法。使用Spring transaction management support,您可以从应用程序代码中删除事务处理例程,因此您的业务逻辑只能关注与业务相关的功能。
  3. Transient entities and detached objects是常见的做法,所以不用担心。
  4. 这个词不正确。局部变量或瞬态对象是一个更具描述性的术语。

3
投票

1)是的,他们有资格收集垃圾。在现代JVM中,这不会对垃圾收集器性能产生任何重大影响,因为这些对象将直接从Eden空间清除。

2)有一种更好的方法 - 依赖注入(DI,IoC),例如Spring DI

3)不,这不是实现它的最佳方式,因为除了有很多易出错的样板代码之外,您还将为每个DAO方法调用使用不同的事务。在许多用例中,您希望在单个事务中对相同或不同的DAO组合多个方法调用。更好的选择是使用为此目的设计的框架在服务层声明性地划分事务。一个例子是Spring transaction management

4)Java中没有官方术语(老实说,对我而言,将其命名为有意义)。在java世界中,我们简单地称之为no-arg(默认)A的构造函数的调用。

© www.soinside.com 2019 - 2024. All rights reserved.