关于Java Persistence的问题,向板桥大哥请教

08-10-15 tom01
                   

我是EJB3.0的初学者,关于Java Persistence有两种类别

1\Transaction-scoped persistence context

2\extended persistence context

在extended persistence context的上下文中,实体bean一直都是托管状态直到persistence context关闭,这种方式中使用想到了banq大哥的<数据库已死>一文,访问过的实体bean被缓存到了ejb容器中,再次访问该实体bean时直接使用缓存中的对象,不用再从数据库中查询,从而减少了对数据库的访问次数,分担了数据库的压力.这一点我已经测试过了

关于使用:

1\在stateful session bean 中可以使用

@PersistenceContext(unit="...",type=PersistenceContextType.EXTENDED)

EntityManager em;

2\在stateless session bean 中则EntityManagerFactory创建

@PersistenceUnit(unit="...")

EntityManagerFactory emf

EntityManager em=emf.createEntityManager()

我在网上看到很多都建议用前一种方式来使用(type=...)Persistence Context,以达到利用ejb容器自动管理之优点.但我想这种方式只适用于stateful session bean.

如果在在stateless session bean使用extended persistence context就必须自己去em.joinTransaction();

在这里请高手们请教该如何在使用时做选择

                   

banq
2008-10-15 18:08

type=PersistenceContextType.EXTENDED一般适合特殊场合,比如login登录时需要填写多个页面,第一页是用户和密码,第二是详细资料,第三页面..等等,只有某个用户在三个页面全部完成才能保存数据库。

以前是怎么做?就是使用HttpSession,那么临时数据保存在哪里?数据库是不行的,因为一旦用户填写第二个页面,就离开,就成数据库垃圾数据。只是保存到内存缓存中,带来问题就是事务还要自己做,这些很麻烦。

现在使用有态Bean再加上PersistenceContextType.EXTENDED就可以将上面这些工作交给容器实现,节省了开发效率。

所以,PersistenceContextType.EXTENDED是特殊场景下使用,不是经常使用,比如一个业务事务需要多次请求才能完成的。

缺省的是第一个情况,都是由容器管理的。

tom01
2008-10-16 09:11

没想到banq大哥这么快就回复了,您真是个热心肠的人啊,呵呵

那么在实际应用的时候怎么实现实体bean的缓存或者说如何减轻数据库的访问压力,怎么用是比较好的方式

banq
2008-10-16 09:40

>在实际应用的时候怎么实现实体bean的缓存或者说如何减轻数据库的访问压力

你选择EJB3这个架构后,容器就内置实体Bean的缓存了,当然关于批量查询,你需要优化。

如果想明显体验缓存的作用,可以用Jdon框架试验看看。不少道友用后,都有此感概。

tom01
2008-10-16 10:32

我测试过了,方法:用SQL的事件查看器监视数据库的访问

Transaction-scoped Persistence Context的EntityManager操作(比如em.find()),每调用一次就会访问一次数据库.

而Extended Persistence Context的EntityManager操作,实体bean才能真正缓存,第一次调用的时候访问一次数据库,以后再调用就不用再访问数据库了.

这不是很好的减轻了数据库的负载吗

所以我就想用stateless session bean 中使用Extended Persistence Context的EntityManager来操作实体bean,

当然我也可以在stateful session bean 中使用Extended Persistence Context,然后调用方始终保存ejb的引用

这两种方式我就不知道会出现什么性能和安全等方面的问题,还有没有更好的方法.

好像在EJB2.0中都是容器来管理实体bean的...

[该贴被tom01于2008-10-16 10:34修改过]

4Go 1 2 3 4 下一页