> 谢谢楼上的那位兄弟,我在《EJB设计模式》里找到了。(第2
> 8页)

_0_我的一共就205页

出了什么错,帖出来嘛!我说不定能找得到!

我前段时间刚在JBOSS配置过XA DataSource。中间是很多环节都容易出错。主要原因不是Application Server的问题,而是像Oracle这样支持分布式数据库的问题。按网上Oralce的安装攻略,安装好的Oracle,其实根本还不支持分布式事务,需要另外做一些初始化的工作。

鉴于有的道友看不到《EJB设计模式》的原话,我在这里还是把它列出来。


引用《EJB设计模式》里的原话,第228页

Always Call setRollbackOnly when
Application Exceptions Occur

An important but unemphasized fact is that application exceptions(developer
written exceptions) thrown from an EJB to client don't trigger automatic
rollbacks of the running transaction,in contrast to EJBExceptions,which auto-
matically trigger the current transaction to roll back.Serious data consistency
problems can arise if a use case fails without the transaction rolling back.
Therefore,always remember to first catch application exceptions and call
ctx.setRollbackOnly() (where ctx is of type javax.ejb.SessionContext
for session beans)before rethrowing or wrapping application exceptions to the
client.

我同意有位道友的观点,遇到运行时异常(RuntimeException)及其子类,容器管理的Bean才回滚。
在文中提到的EJBException是RuntimeException的子类。而SQLException,NamingException的父类是Exception。个人感觉就《EJB设计模式》中所说的application exception概念有的笼统,按习惯性的思维SQLException应该不会包括在里面。

哎,可是事实胜于雄辩。

SQLException不会回滚,必须ctx.setR...

嗯,有了这些理论基础,我们就可以方便的搭建这样的系统了:
struts+BusinessDelegate(业务代理)+SLSB(封装业务逻辑)+DAO(数据访问逻辑)

我们都知道,struts实现了MVC中的V和C,对M没有实现,我们需要写一些业务代理(普通java对象)来实现M,所谓的业务代理只不过是隐藏了对SLSB的查找逻辑和一些异常的包装;SLSB封装了业务逻辑,它通过JNDI获取数据源,然后取得连接,然后用数据库连接构造若干DAO并调用起方法,对事物进行管理(例如当DAO抛出SQLException时调用ctx.setRollbackOnly() ,这样保证了数据的完整性)

> >sessionContext.setRollBackOnly(),
>
> 在EJB方法中不需要写任何语句,只要有Exception抛出,就可

banq还真顽固,不懂装懂呵呵

搞这么复杂干吗啊。存储过程狂说这个不是问题!挖哈哈

众位好!我初次使用jboss(3.2),不知如何配置ms-sqlserver的xa数据源,困惑好久。从网上看到这篇帖子知道也许从这里可以得到些帮助,特意求教来了。
我把jboss下的示例文件mssql-xa-ds.xml粘贴在default-deploy目录下并修改如下:
<?xml version="1.0" encoding="UTF-8"?>
<!-- some intro....-->
<datasources>
<xa-tx-datasource>
<jndi-name>MSSQLXADS</jndi-name>
<xa-datasource-class>sun.jdbc.odbc.JdbcOdbcDriver</xa-datasource-class>
<xa-datasource-property name="ServerName">jbosstest</xa-datasource-property>
<xa-datasource-property name="DatabaseName">test</xa-datasource-property>
<xa-datasource-property name="SelectMethod">cursor</xa-datasource-property>
<!-- not sure if these should be here-->
<user-name>sa</user-name>
<password>sa</password>
</xa-tx-datasource>

</datasources>

然后程序这样调用:
InitialContext ctx = new InitialContext();
Object txObj = ctx.lookup("java:/MSSQLXADS");
UserTransaction utx = (UserTransaction) txObj;
utx.begin();
Context initCtx = new InitialContext();
javax.sql.DataSource ds =( javax.sql.DataSource)initCtx.lookup("java:/MSSQLXADS");
Connection conn = ds.getConnection();
PreparedStatement pstm= conn.prepareStatement("insert into dstest values (?)");
pstm.setString(1,"begin");
pstm.executeUpdate();
utx.commit();

结果报错:javax.naming.NameNotFoundException: MSSQLXADS not bound :(
请问还需要在哪里配置数据源么? 或者是我的写法有问题? 不胜感激!

刚才发的xml文件不能正确显示,帖图如下

> >sessionContext.setRollBackOnly(),
>
> 在EJB方法中不需要写任何语句,只要有Exception抛出,就可
> 允挛窕毓觥?
请参考EJB的规范,并不是只要有Exception抛出就可以回滚,而是RuntimeException