Weblogic中的
生产模式: -DproductionModeEnabled=true
可以利用weblogic builder来配置ejb的xml文件
访问环境入口
InitialContext ctx = new InitialContext ();
Integer max = (Integer)ctx.lookup("java:comp/env/maxMessage");
另一种方式
InitialContext ctx = new InitialContext ();
Context envctx = (Context)ctx.lookup("java:comp/env");
Integer max = (Integer)envctx.lookup("maxMessage");
资源引用
资源:
Database javax.sql.DataSource java.sql.Connection
JMS Topic java.jms.TopicConnection javax.jms.TopicConnection
JMS Queue javax.jms.QueueConnectionFactory javax.jms.QueueConnection
Internet location java.net.URL java.net.URL.Connection
ejb-jar.xml
<resource-ref>
<res-ref-name>jdbc/DSRef</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>
weblogic-ejb-jar.xml
<reference-descriptor>
<resource-description>
<res-ref-name>jdbc/DSRef</res-ref-name>
<jndi-name>ExampleDS</jndi-name>
InitialContext ctx = new InitialContext ();
DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/DSRef");
认证:
<res-auth>Application</res-auth>
InitialContext ctx = new InitialContext ();
DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/DSRef");
Connection conn = ds.getConnection(username,password);
Statement stmt = conn.createStatement();
EJB 引用 EJB
ejb-jar.xml
<ejb-ref>
<ejb-ref-name>ejb/HelloWorldRef</ejb-ref-name>
<ejb-ref-type>Session</ejb-ref-type>
<home>...
<remote>...
<ejb-link>./example01-HelloEJB.jar#HelloEJB</ejb-link>
</ejb-ref>
welogic-ejb-jar.xml
<reference-descriptor>
<ejb-reference-description>
<ejb-ref-name>ejb/HelloWorldRef</ejb-ref-name>
<jndi-name>HelloWorld</jndi-name>
ejb的安全
角色
(1)在部署描述文件中读出角色定义
(2)在管理控制台中管理的角色
在安全域中选择"Ignore Security Data in Deployment Descriptors", 则角色和其他安全信息将不从部署描述文件中读出
- 容器管理的安全
在XM部署描述文件中声明
访问的资源取决于用户的角色
<method>
<ejb-name>ServerControllerEJB</ejb-name>
<method-intf>Remote/Home(Remote和Home对象)</method-intf>
<method-name>execute(*表示所有方法)</method-name>
</method>
- bean管理的安全
可以映射到部署描述文件中的角色
可以使用EJBContext的方法获得安全信息
//返回当前调用者的安全身份
java.security.pricipal getCallerPrincipal();
//如果当前调用者是定义在部署描述文件中安全角色组的一部分,则返回真
boolean isCallerInRole(String roleName);
- EJB和事务
<transaction-type> Bean或Container
只与<session>或<message-driven>一起使用(实体EJB通常使用容器管理事务)
容器管理事务(CMT)
<trans-attribute>Required</trans-attribute>
有六个值:
Never:不能有事务
Mandatory:必须启动全局事务
NotSupported:将客户事务挂起
Supports:可包含在任意客户启动的事务中
Required:强制EJB在客户或容器启动的事务中执行
RequiresNew:只能在容器启动的新事务中执行
过多的细粒度事务可对事务和资源管理器带来过多的数据流量
过多的粗粒度事务可阻塞其它客户访问相同的资源
写操作使用Required,读操作使用Supports或NotSupported
事务隔离级别(Isolation):平衡以下指标
(1)数据的完整性
(2)并发的访问速度
Dirty Read:读未提交
Non-repeatable Read:在同一事务内
Phantom Row:读取被其他人删除(但尚未提交)的行数据
在weblogic-ejb-jar.xml中设置
<transaction-isolation> 文件中的最后一个元素
<isolation-level>xxx_xxx_xxx</isolation-level>
<method>
<ejb-name>xxx</ejb-name>
<method-name>*</method-name>
</method>
... ... ...
</weblogic-ejb-jar>
TRANSACTION_READ_UNCOMMITTED: 最快许可的事务隔离级别,可以脏读,幻行和不可重复读
TRANSACTION_READ_COMMITTED: 不可以脏读,可以幻行和不可重复读
TRANSACTION_REPEATABLE_READ: 不可以脏读和不可重复读,可以幻行
TRANSACTION_SERIALIZABLE: 不可以脏读,不可重复和幻行
强制事务回滚
EJBContext的setRollbackOnly():强制当前事务在结束时回滚
有效的事务管理:
if (ctx.getRollbackOnly()) {
return;
}
Bean管理的事务(BMT)
javax.transaction.UserTransaction接口(只有会话和消息驱动bean能使用)
begin()
commit()
rollback()
setRollbackOnly()
getStatus()
setTransactionTimeout()
在有状态的会话EJB中
rollback不能恢复实例中任何修改过的属性,SessionSynchronization接口可以用来手工恢复修改过的属性
EJB本地(Local)接口
Local接口和Remote接口的区别
. Local接口是EJBLocalObject
. Local本地接口是EJBLocalHome
. 不能抛出RemoteException
. 允许使用Non-Serializable的方法参数和返回类型
. 当访问local对象时不必调用PortableRemoteObject.narrow()
HelloWorldLocal, HelloWorldLocalHome
HelloWorldRemote, HelloWorldRemoteHome
可以同时使用local和远程接口
部署描述文件
<home>
<remote>
<local-home>
<local>
<ejb-class>
<jndi-name>
<local-jndi-name>
使用local接口不能实现负载均衡和故障恢复。
使用远程接口,必须通过传值的方式传递参数
使用local接口,可以使用传引用的方式传递参数