料 部分,获得 Sun 公司的 JavaDocs 中有关 UserTransaction 和 UserStatus 接口的链接。
如何使用 bean 方法获得 UserTransaction 的最初引用呢?基于企业 bean 的类型,您可从 bean 上下文中获得接口:
对于会话 bean,可从 javax.ejb.EJBContext 调用 getUserTransaction()。
对于 MDB,可从 MessageDrivenContext.getUserTransaction() 调用 getUserTransaction()。
权衡Apache Geronimo EJB事务选项,第2部分: Bean管理事务(2)
时间:2011-03-13 IBM Jonathan Sagorin
您也可以通过 JNDI 检索接口。清单 1 显示了一个例子。
清单 1. 如何通过 JNDI 获取 UserTransaction 接口
public MySessionBean implements SessionBean {
public someMethodOnMyBean()
{
Context initCtx = new InitialContext();
UserTransaction utx = (UserTransaction)initCtx.lookup(
"java:comp/UserTransaction");
utx.begin();
...
utx.commit();
}
...
}
通常,在同一个方法中启动事务并提交该事务是一个好主意。这有助于您跟踪事务开始和结束的地方。同样,要使事务开放的时间尽可能的短。事务需要系统资源,因此如果保持事务长时间的开放,可能会影响多用户性能。
使用 JTA 事务的最大好处是它允许您跨越多个不同数据库的多个更新。但要记住,JTA 实现不支持嵌套事务。
清单 2 显示了会话 bean 更新两个不同数据库的例子。数据源是通过 JNDI 进行检索的。您可以像往常一样检索数据库连接并准备语句。
(注意,我在演示 JTA 事务的基本实现(用粗体显示)。为了实现这一点,我将用顶级方法来显示所有代码。不要尝试使用任何重用形式的普通抽象。)
清单 2. 会话 bean Java 代码示例
public class MySessionEJB implements SessionBean {
EJBContext ejbContext;
public void updateTwoDatabases(...) {
DataSource dbOneDataSource = null;
DataSource dbTwoDataSource = null;
Connection dbOneConnection = null;
Connection dbTwoConnection= null;
Statement dbOneStatement = null;
Statement dbTwoStatement = null;
String sqlUpdateDbOne = null;
String sqlUpdateDbTwo = null;
javax.transaction.UserTransaction ut = null;
try {
InitialContext initCtx = new InitialContext();
// retrieve our first Connection and
// prepare a statement
dbOneDataSource = (javax.sql.DataSource)
initCtx.lookup("java:comp/env/jdbc/dbOneDS");
dbOneConnection = dbOneDataSource.getConnection();
// setup SQL here,
// perhaps we''re using parameterized queries
sqlUpdateDbOne = ...
dbOneStatement =
dbOneConnection.prepareStatement(sqlUpdateDbOne);
// retrieve our second Connection and
// prepare a statement
dbTwoDataSource = (javax.sql.DataSource)
initCtx.lookup("java:comp/env/jdbc/dbTwoDS");
dbTwoConnection = dbTwoDataSource.getConnection();
// setup SQL here,
// perhaps we''re using parameterized queries
sqlUpdateDbTwo = ...
dbTwoStatement =
dbTwoConnection.prepareStatement(sqlUpdateDbTwo);
// Now setup a JTA transaction to encompass both
// database updates //
ut = ejbContext.getUserTransaction();
/
|