JTA经典问答(初译版)

news/2024/5/18 22:43:18 标签: jdbc, weblogic, transactions, oracle, jms, wrapper

/*
这篇JTA问答问题都很经典,回答也十分言简意赅。通过问答将XA drivernon-XA driver在分布式事务中的使用注意事项讲述的很清楚,解决了我原先的一些困惑。现把原文贴出来,希望对大家有所助益。
*/

1.        Can I use a non-XA driver in distributed transactions?
我能在分布式事务中使用非XA驱动吗?

When the non-XA connection pool is the only resource participating in a transaction distributed across multiple servers, you just need to configure a TxDataSource for the non-XA driver. (This configuration is the same as the JTS driver usage in WLS 5.1.)
当非XA连接池是分布在多个server中的唯一的资源时,你仅仅需要为非XA驱动配置TxDataSource
However, when more than one resource participates in the distributed transaction, you must also set the TxDataSource property EnableTwoPhaseCommit=true. For more information, see Managing JDBC Connectivity in the Administration Guide. In both cases, always obtain a connection via the DataSource interface, not through the deprecated DriverManager interface. If you obtain a connection via DriverManager, the interface cannot pick up the EnableTwoPhaseCommit setting of the TxDataSource; this may result in unexpected behavior in distributed transactions. Also, when you use the DataSource interface, you do not need to distinguish either the URL or the specific WebLogic multitier driver (JTS, RMI, or pool.) The URL and specific driver are obtained through the config.xml file and JNDI lookup.
然而,当在分布式事务中超过一个参与的资源时,你必须设置TxDataSource属性“EnableTwoPhaseCommit=true”。更多信息参见在管理指南中的管理JDBC连接。在所有的情况下,经常通过DataSource接口获得连接,不通过DriverManager接口。如果你通过DriverManager获得了一个连接,接口不能获得TxDataSource的“EnableTwoPhaseCommit”的设置;这可能导致在分布式事务中不希望的行为。所以,当你使用DataSource接口,你不需要区别URL或特定的WebLogic驱动(JTS,RMI或池)URL和特定的驱动通过config.xml文件和JNDI查找获得。

2.        Can I use more than one non-XA connection pool in distributed transactions? 在分布式事务中,我能使用超过一个的非XA连接池吗?

No. Even if you set EnableTwoPhaseCommit=true for both TxDataSources of the connection pools, attempting to use two non-XA connection pools in the same distributed transaction will result in
"java.sql.SQLException: Connection has already been created in this tx context for pool named <first pool's name>. Illegal attempt to create connection from another pool: <second pool's name>"
when you attempt to get the connection from the second non-XA connection pool.
不能。即使你为所有的这些连接池都设置了EnableTwoPhaseCommit=true,在同一个分布式事务中尝试使用两个非XA连接池会导致“java.sql.SQLException:Connection has already been created in this tx context for pool named <first pool’s name>.Illegal attempt to create connection from another pool:<second pool’s name>”这样的异常。当你试图从第二个非XA连接池获得连接时,你会得到以上的异常。

3.        How do XA and non-XA drivers differ in distributed transactions?
XA
驱动和非XA驱动在分布式事务中的区别是什么?

The differences between XA and non-XA JDBC drivers are:
XA
和非XAJDBC驱动是:

Atomicity Guarantee. An XA driver implements the XAResource interface and can participate fully in the 2PC protocol driven by the WLS Transaction Manager. This guarantees atomicity of updates across multiple participating resources.

原子保证XA驱动实现XAResource接口并且能通过WLS事务管理器在2PC协议驱动间完全分享。多个一同参与的资源保证原子级更新。???
However, a non-XA driver does not implement the XAResource interface and cannot fully participate in the 2PC protocol. When using a non-XA driver in a distributed transaction, WLS implements the XAResource wrapper on behalf of the non-XA driver. If the data source property EnableTwoPhaseCommit is set to true, then the WLS XAResource wrapper returns XA_OK when the Transaction Manager calls prepare on it. When the Transaction Manager calls commit or rollback on it during the second phase, the WLS XAResource wrapper delegates the commit/rollback call to the non-XA JDBC connection. Any failure during commit/rollback results in heuristic exceptions. Application data may be left in an inconsistent state as a result of heuristic failure.

XA驱动没有实现XAResource接口,不能完全的在2PC(tow phase commit 译者注)协议间分享。当在分布式事务中使用一个非XA驱动时,WLS代表非XA驱动实现XAResource wrapper。如果DataSource属性“EnableTwoPhaseCommit”被设置为true,当事务管理器调用prepare时,WLS XAResource wrapper返回XA_OK。当事务管理器在第二个阶段中调用commitrollback时,WLS XAResource wrapper代理commit/rollback调用到非XAJDBC连接。在commit/rollback过程中的任何失败都会导致heuristic exception(启发式异常?)。作为启发式失败的结果,应用数据可能会保留在一种不一致的状态。
Redirecting Connections. As in WLS 5.1, a non-XA driver can be configured to perform updates in the same distributed transaction from more than one process, as explained in Can I use a non-XA driver in distributed transactions?. WLS internally redirects the JDBC calls made from different processes to the same physical JDBC connection in one process. However, when you use a XA driver, no such redirection will be done. Each process will use its own local XA database connection, and the database ensures that all the distributed updates made in the same distributed transaction from different processes will be committed atomically.
重定向连接。在WLS 5.1中,非XA驱动能被配置执行在相同的分布式事务中更新。WLS内部重定向JDBC调用由不同过程到过程中的相同物理JDBC连接。然而,当你使用XA驱动时,没有这样的重定向会产生。每个过程会使用自己的本地XA数据库连接,并且数据库确保所有的分布式更新在同一个分布式事务中产生,从不同的处理会被原子化提交。
Connection Management. Whether you are using the non-XA driver or XA driver in distributed transactions, WLS implements JDBC wrappers that intercept all the JDBC calls and obtains a physical JDBC connection from the connection pool on demand.
连接管理。无论是否你正在分布式事务中使用非XA驱动或者XA驱动,WLS实现JDBC wrappers来截获所有的JDBC调用并且获得一个物理JDBC连接从连接池中按需要获取。
When you use a non-XA driver in distributed transactions, in order to ensure that updates made from different processes are committed atomically, WLS associates the same physical JDBC connection with the distributed transaction until it is committed or rolled back. As a result, the number of active distributed transactions using the non-XA connection pool is limited by the maximum capacity of the JDBC connection pool.
当你在分布式事务中使用非XA驱动,为了确保更新从不同的进程被原子化提交完成,WLS联系相同的物理JDBC连接和分布式事务,直到他被commitrollback。作为结果,活动的分布式事务的数量使用非XA连接池被JDBC连接池的最大容量所限制。
When you use an XA driver, the connection management is more scalable. WLS does not hold on to the same physical XA connection until the transaction is committed or rolled back. In fact, in most cases, the XA connection as only held for the duration of a method invocation. WLS JDBC wrappers intercept all JDBC calls and enlist the XAResource associated with the XA connection on demand. When the method invocation returns to the caller, or when it makes another call to another server, WLS delists the XAResource associated with the XA connection.
当你使用XA驱动,连接管理是更可升级的。WLS在事务被提交或回滚前不持有相同的物理XA连接。事实上,大多数情况中,XA连接仅仅持续在方法调用期。WLS JDBC wrappers拦截所有的JDBC调用和按需要调配和XA连接联系的XAResource。当方法调用返回到调用者,或当它产生另外一个调用到另外的服务器,WLS划掉和XA连接管理的XAResource
WLS also returns the XA connection to the connection pool on delistment if there are no open result sets. Also, during commit processing, any XAResource object can be used to commit any number of distributed transactions in parallel. As a result, neither the number of active distributed transactions using the XA connection pool nor the number of concurrent commit/rollbacks is limited by the maximum capacity of the connection pool. Only the number of concurrent database access connections is limited by the maximum capacity of the connection pool.
WLS
也返回在划掉清单上的XA连接到连接池,如果没有打开的结果集。然而,在提交处理过程中,任何XAResource对象能被用于并行提交任意数量的分布式事务。作为结果,既没有活动分布事务使用XA连接池的数量,也没有并发的commit/rollback被连接池的最大能力所限制的数量。只有并发数据库访问连接的数量被限制,由连接池的最大能力。

4.        What XA drivers can I use in addition to the WebLogic jDriver for Oracle/XA? 除了WebLogic jDriver for Oracle/XA驱动外还可以使用什么XA驱动?

Theoretically, you can use any third party XA driver that is compliant with the JDBC 2.0 standard extension specification with WLS. However, an individual vendor's XA driver may have bugs that prevent it from working properly.
理论上,你可以使用任何兼容JDBC2.0标准的为WLS扩展的第三方的XA驱动。然而,独立的XA驱动提供商可能有一些bug妨碍正常工作。
Refer to JDBC Configuration guidelines for details about how to configure them at ../adminguide/managetx.html.

5.        Can I use the Oracle thin driver as an XA driver in distributed transactions?
我能使用Oracle thin driver作为分布式事务中的XA驱动吗?

Oracle 8.1.6 thin driver has a bug that does not accept any foreign Xid, and so does not work at all with any other vendor's transaction manager, including WLS.
Oracle8.1.6 thin driver
bug,不接收如何外部的Xid,并且因此不能和任何其他提供商的事务管理器协同工作,也包括 WLS
Oracle 8.1.7 thin driver has threading problems and we do not recommend using it at this point. A workaround is not yet available in SP1. It will be available in the Silversword release. For this workaround, we use a dedicated XA connection for the duration of prepare, commit, and rollback operation. This is different from the default XA connection management model (see FAQ 3 for description) in that any XAResource object is used to commit any number of transactions in parallel. This limits the number of concurrent commits to the max capacity of the XA connection pool. Note that this workaround is an Oracle specific workaround and will not affect the usage of other XA drivers.
Oracle8.1.7 thin driver
有线程问题,并且我们不建议使用。会在Silversword发布时可用。对这种情况,我们使用专门的XA连接在prepare,commit,rollback操作。这与默认的XA连接管理模型不同。这限制了并发提交的数量因为XA连接池的最大容量。注意这是oracle特有的情况,不会影响到其他XA驱动。
Meanwhile, if you still want to try it out in SP1 without the workaround, you can configure the XA connection pool. For more information, see Managing JDBC Connectivity in the Administration Guide.
期间,如果你仍然想试用SP1,你可以配置XA连接池。要获得更多的信息,参见在管理指南中的管理JDBC连接。

6.        Why do I get SQLException "Result set already closed" message?
为什么我会获得SQLException "Result set already closed"

Problem: I am using Weblogic jDriver for Oracle/XA (transaction mode) from the client side. Updating in a distributed transaction works fine. However, when I try to perform a query, I get SQLException Result set already closed. How do I work around this?
问题:我正试用WebLogic JDriver for Oracle/XA(事务模式)从客户端。更新一个分布式事务工作的很好。然而当我要执行一个查询,我得到了这个SQLexception,我应该怎么作?
Weblogic jDriver for Oracle has a limitation that closes all open result sets when the method returns to the caller. For more information, see Limitations of the Weblogic jDriver for Oracle XA in Using WebLogic jDriver for Oracle/XA in Distributed Transations.
Weblogic jDriver for Oracle
有一个限制,那就是当方法返回到调用者时会关闭所有的结果集。
Using the driver from the server side, for example, in a bean, does not have this limitation. Using the driver from the server side is also recommended from application architecture and performance perspective. Using the driver from the client side incurs round-trip cost for every JDBC call being made.
从服务端使用这个驱动,例如在bean中,没有这个限制。从服务端使用驱动也是应用架构和性能方面所推荐的。从客户端使用驱动导致了每个JDBC调用产生往返成本。
This limitation exists because Weblogic jDriver for Oracle XA is implemented using Oracle's OCI API and C XA switch, and there is an Oracle problem when using OCI with XA in multi-threaded mode. Closing an OCI cursor in a thread that is different than the thread in which it is opened may result in server crash or unexpected behavior. As a result, the Weblogic driver implicitly closes all open result sets upon returning a call to the caller.
存在这个限制是因为WebLogic jDriver for Oracle XA是使用OracleOCIC XA交换的实现,当使用OCI XA在多线程模式时Oracle存在问题。在线程中关闭OCI比在线程中打开有不同会导致服务器崩溃或出现不希望的行为。因为这个原因,WebLogic driver隐含关闭所有打开的结果集,一旦返回调用到调用者。

7.        Do I need a 2PC license when I use JMS with one JDBC non-XA driver?
当我使用JMSJDBCXA驱动时,我需要2PC许可吗?

Yes, you do. JMS is also a XAResource that participates in the distributed transaction. Therefore, there are two resources participating in the distributed transaction, and a 2PC license is needed.
是的,你需要。JMS也是一种参与分布式事务的XAResource。因而,有两个资源参与分布式事务,并且2PClicense也需要。

8.        Why am I getting an exception when I use JMS with a non-XA driver?
为什么我得到了一个异常,当我使用非XA驱动的JMS

Problem: I am using JMS with one JDBC non-XA driver. Transaction fails to commit with the following exception: javax.transaction.xa.XAException: JDBC driver does not support XA, hence cannot be a participant in two-phase commit.
问题:我正使用JMS with one JDBC non-XA驱动。事务提交失败,产生下面的异常:”javax.transaction.xa.XAException: JDBC driver does not support XA, hence cannot be a participant in tow-phase commit.”
As mentioned in the previous question Do I need a 2PC license when I use JMS with one JDBC non-XA driver?, JMS is also a XAResource that participates in the distributed transaction. When more than one resource is participating in the distributed transaction, you need to set the data source property EnableTwoPhaseCommit=true as explained in " Can I use a non-XA driver in distributed transactions?"
根据在上面问题的提示,我需要2PC许可当使用JMS with one JDBC non-XA driver? ,JMS也是一种参与分布式事务的XAResource。当超过一个资源参与分布式事务时,你需要设置数据源属性 “EnableTwoPhaseCommit=true”

9.        Why do I get an exception when I use EJB CMP 1.1?
为什么当我使用EJB CMP 1.1时会产生异常?

Problem: I am using distributed transactions with EJB CMP 1.1 and a non-XA connection pool. I configured the JDBC connection pool and the TxDataSource according to instructions in Can I use a non-XA driver in distributed transactions?. However, commit still gives javax.transaction.xa.XAException: JDBC driver does not support XA, hence cannot be a participant in two-phase commit. Why?
问题:我正在使用分布式事务 EJB CMP 1.1和非XA连接池。我配置JDBC连接池和TxDataSource 依据指示。然而,commit仍然给出了 “javax.transaction.xa.XAException: JDBC driver does not support XA, hence cannot be a participant in two-phase commit.”
The old style CMP 1.1 DTD does not allow you to specify the data source name. When only the connection pool name is specified, the EnableTwoPhaseCommit setting of the TxDataSource is ignored. You should use the new style CMP 1.1 DTD and specify the data source name instead of the pool name.
旧格式CMP1.1 DTD不允许你指定数据源名字。当只有连接池的名字被指定时,TxDataSourceEnableTwoPhaseCommit设置被忽略。你应该使用新格式的CMP1.1DTD并且指定数据源的名字而不是连接池的名字。
To ensure that the descriptor is using the latest DTD file, verify that the DOCTYPE header for the WebLogic CMP 1.1 descriptor file is as follows:
要确认你是否使用的是最新的DTD文件,从WebLogic CMP1.1描述符中验证下面的DOC TYPE头:

<!DOCTYPE weblogic-rdbms-jar PUBLIC '-//BEA Systems, Inc.//DTD WebLogic 6.0.0 EJB 1.1 RDBMS Persistence//EN'http://www.bea.com/servers/wls600/dtd/weblogic-rdbms11-persistence-600.dtd'>

To see the DTD file, go to http://www.bea.com/servers/wls600/dtd/weblogic-rdbms11-persistence-600.dtd.

10.    Can I obtain a JDBC connection before I start a distributed transaction?
在我启动一个分布式事务前我能获得一个JDBC连接吗?

This depends on whether you are using a non-XA or XA driver.
这取决于你使用的是非XA驱动还是XA驱动。
When you use a non-XA driver in a distributed transaction, always obtain a JDBC connection after the distributed transaction is begun.
当在分布式事务中你使用非XA驱动时,经常在分布式事务被开始后获得JDBC连接。
If you are using an XA driver, you can obtain the connection before the distributed transaction is begun.
如果你使用的是XA驱动,你可以在分布式事务开始前获得连接。

11.    Can I close a JDBC connection after the distributed transaction is committed or rolled back? 我能关闭JDBC连接在分布式事务被提交或回滚后?

For both non-XA and XA driver, you can close the connection after the distributed transaction is completed.
对所有的非 XA XA 驱动,你可以关闭连接,在分布式事务完成后。
http://edocs.bea.com/wls/docs60/faq/transactions.html

http://www.niftyadmin.cn/n/1140841.html

相关文章

如何处理Oracle中TEMP表空间满的问题?

如何处理Oracle中TEMP表空间满的问题&#xff1f; 选择自 hrb_qiuyb 的 Blog 正常来说&#xff0c;在完成Select语句、create index等一些使用TEMP表空间的排序操作后&#xff0c;Oracle是会自动释放掉临时段a的。但有些有侯我们则会遇到临时段没有被释放&#xff0c;TEM…

9i控制台访问10g的一个有意思的bug

临时表空间在9i的控制台中显式不出来&#xff0c;在10g的控制台环境下可以正常显示。有空看看到底差在哪了。

condition生成等待

关键字Synchronized与wait()和notify()/notifyAll()方法相结合可以实现等待通知&#xff0c;ReentrantLock借助Condition对象可以实现同样的功能&#xff0c;而且一个lock对象可以创建多个condition对象&#xff0c;从而能够选择性condition对象进行等待/通知

查看当前有哪些端口被开放

C:/Documents and Settings/Administrator>netstat -b Active Connections Proto Local Address Foreign Address State PID TCP neuqsoft:2904 221.234.212.144:4662 SYN_SENT 5812 [eMule.exe] .....

clh

什么是CLH队列锁 CLH锁即Craig, Landin, and Hagersten (CLH) CLH锁也是一种基于链表的可扩展、高性能、公平的自旋锁&#xff0c;线程只需要在本地自旋&#xff0c;查询前驱节点的状态&#xff0c;如果前驱节点释放了锁&#xff0c;就结束自旋。 CLH的原理 因为CLH是一个基…

007中又一个答案出错的题目

Which of the following operators cannot be used with distinct? A.MAX B.COUNT C.all of the above D.MIN 做了一个实验如下&#xff0c;发现这些都可以和distinct一起使用&#xff0c;所以这个题没有答案。 SQL> select distinct count(empno) from emp; COUNT(…

aqs clh

在并发编程领域&#xff0c;AQS号称是并发同步组件的基石&#xff0c;很多并发同步组件都是基于AQS实现&#xff0c;所以想掌握好高并发编程&#xff0c;你需要掌握好AQS。 本篇主要通过对AQS的实现原理、数据模型、资源共享方式、获取锁的过程&#xff0c;让你对AQS的整体设计…

今天通过了007,小庆祝一下

今天通过了007&#xff0c;小庆祝一下。考试中一些题都做过&#xff0c;45/52 通过的。再接再厉。&#xff1a;&#xff09;