我目前正在开发一个使用Struts和Hibernate构建的项目。
项目中的所有DAO类都具有以下代码
内部构造函数:
hibernateSession = HibernateUtil.currentSession();
tx=hibernateSession.beginTransaction();
所有方法的最终子句内容:</ strong>
HibernateUtil.closeSession();
这实际上意味着,在我的业务代码中,每次我想要从数据库访问数据时,我都必须初始化引用变量或创建一个匿名对象,即
如果我必须访问method1
的{{1}}和method2
:
class A
现在我的问题是:
使用后是否收集了匿名对象垃圾?在我的项目中,由于每次访问DAO类中的方法都是通过匿名对象进行的,它是否会对内存占用产生负面影响?如果是的话有其他选择吗?
我是正确地做了还是有更好的方法?
这是使用Hibernate实现的最佳/正确方法吗?
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
使用“匿名对象”一词是否正确?在Google中搜索同样的内容时,我注意到很多评论说这不是Java中的匿名对象,但也有一些文章将其解释为匿名对象。
答案 0 :(得分:3)
没有匿名对象这样的东西。您可以拥有匿名类实例,但在您的情况下,我认为您的意思是“局部变量”。 GC使用针对短期对象的高度优化的收集策略,因此即使在商品硬件上也不会出现内存问题。
有更好的方法。使用Spring transaction management support,您可以从应用程序代码中删除事务处理例程,因此您的业务逻辑只能关注与业务相关的功能。
Transient entities and detached objects是常见做法,所以不用担心。
这个词不正确。局部变量或瞬态对象是一个更具描述性的术语。
答案 1 :(得分:3)
1)是的,他们有资格进行垃圾收集。在现代JVM中,这不会对垃圾收集器性能产生任何重大影响,因为这些对象将直接从Eden空间清除。
2)有一种更好的方式 - 依赖注入(DI,IoC),例如Spring DI。
3)不,这不是实现它的最好方法,因为除了有很多容易出错的样板代码之外,你还会为每个DAO方法调用使用不同的事务。在许多用例中,您希望在单个事务中对相同或不同的DAO组合多个方法调用。更好的选择是使用为此目的设计的框架在服务层声明性地划分事务。一个例子是Spring transaction management。
4)在Java中没有官方用语(老实说,对我而言,将其命名为有意义)。在java世界中,我们简单地称之为no-arg(默认)A
构造函数的调用。