关于 Entity Bean 生命周期相关的讨论,欢迎发言

wspsc 2003-09-15 02:14:18
我有几个地方不太清楚:
1、ejb 容器首先会生成一定数量的 ejb 实例,再给这些实例 setEntityContext(),然后放入 ejb pool 中(等待将他们分配给具体的 bean),那么这么说来在 pool 中的每个 ejb 实例都具有相同的 context(在没被分配到特定的数据库记录之前),那么请问在什么时候,这个 context 和具体的数据库记录对应的 ejb 实例关联的,因为对于一个特定的和数据库对应的ejb实例可以通过 context.getPrimaryKey() 得到主键,那么这个方法又是怎么得到对应的主键的呢?而且该方法会在 ejbLoad()和ejbRemove()方法中有用。

2、对于BMP中,通常是在什么时候获取数据库连接 Connection 对象更好?
在 setEntityContext()方法中?还是在每个需要调用数据库操作的方法中?
如果在 setEntityContext()方法中,那么通常也是在 unsetEntityContext()方法中将 Connection 关闭。那么请问unsetEntityContext()什么时候被调用。那也就是说在 unsetEntityContext()方法调用之前,Connection 一直打开,这样数据库的Connection够用吗?
如果在每个方法中都获得Connection,并在方法结束时close,这样会不会效率太差啊。

...全文
28 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
wspsc 2003-09-16
  • 打赏
  • 举报
回复
首先很感谢caodavid2003(骆驼祥子)的回答,
1、但是你的观点毕竟只是感性的认为,要是有什么确切的证据表名 Context 是在 findPrimaryKey or create 后就和特定的 ejb 关联就好了?还有你说“context.getPrimaryKey() :他需要你自己代码,一般代码向下面这段代码,j2ee的容器根据你写的ejbFindByPrimaryKey(ShipKey primaryKey) 方法来生成查询对应数据库表对应纪录,并以该数据库表的关键字段作为实体bean的关键字的一个特定字段的特定值。”
我觉得不对,context.getPrimaryKey() 本身就是取得关键字,如果关键字本身都未取到,如何从数据库中找到相关的信息呢?context.getPrimaryKey() 的调用时机就是不能确定主键的时候而获得组件来进行后面的操作。

2、其实我自己也认为 getConnection()应该在需要的时候调用并在不用的时候关闭,但是sun 的ejb指南中的很多例子却不是这样做的,(我觉得很纳闷)。另外,如果按照“即用即关”的方法,那还是有几个值得考虑的地方,首先是通过 jndi 获取 dataSource,然后通过dataSource.getConnection() 获取 Connection,这个过程的开销大不大?(主要是时间的开销,特别的是 ejb容器 和 命名目录服务器 不在同一个服务器内的情况)
phoenixtree 2003-09-16
  • 打赏
  • 举报
回复
lookup过程比较昂贵,需要缓存
caodavid2003 2003-09-15
  • 打赏
  • 举报
回复
我认为在你使用ejb home接口调用findByPrimaryKey(XXXKey key)(或create(...)插入数据库成功返回XXXKey时)时这个 context 和具体的数据库记录对应的 ejb 实例关联的。
关于:context.getPrimaryKey() :他需要你自己代码,一般代码向下面这段代码,j2ee的容器根据你写的ejbFindByPrimaryKey(ShipKey primaryKey) 方法来生成查询对应数据库表对应纪录,并以该数据库表的关键字段作为实体bean的关键字的一个特定字段的特定值。
public ShipKey ejbFindByPrimaryKey(ShipKey primaryKey) throws FinderException{
Connection con=null;
PreparedStatement ps=null;
ResultSet result=null;
try{
con=this.getConnection();
ps=con.prepareStatement("select id from Ship where id=?");
ps.setInt(1,primaryKey.id);//id是Ship表中关键字断
result=ps.executeQuery();
if(!result.next()){
throw new ObjectNotFoundException("Cannot find Ship with id= "+id);
}
}
catch(SQLException se){
throw new EJBException(se);
}
finally{
try{
if(result!=null)
result.close();
if(ps!=null)
ps.close();
if(con!=null)
con.close();
}
catch(SQLException se){
se.printStackTrace();
}
}
return primaryKey;
}

其中getConnection()
public Connection getConnection(){
Connection con=null;
try{
Context context=new InitialContext();
//Connection con=null;
DataSource source=(DataSource)context.lookup("ORDR");
con=source.getConnection();

}
catch(Exception e){
throw new javax.ejb.EJBException(e.toString());
}
return con;
}

在容器调用ejbLoad()和ejbRemove()方法时它会根据关键字对象中对应数据库表的关键字段值来对数据库表中相对纪录进行操作的。
对于连接问题:在实体bean对象创建之前连接池已经预先创建了几个(一般小于最大设值数)(这个数据可以自己设定)数据库连接。一般写实体bean中操作方法什么时候用到连接就调用getConnection()这个方法(它从连接池中闲置的数据库连接随机取得一个),用完就立即关闭数据库连接(con.close();实际上时关闭于连接池的连接)。如果不关闭数据库服务器很快就会被搞死的!
wspsc 2003-09-15
  • 打赏
  • 举报
回复
up

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧