EJB的高级扩展配置

 

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接口,可以使用传引用的方式传递参数

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值