如何确定是从支持JTA的DataSource还是直接JDBC检索JDBC连接?

时间:2008-10-07 22:39:07

标签: java jdbc transactions jta

我正在使用供应商API来获取与应用程序数据库的JDBC连接。在应用程序服务器中运行或以独立模式运行时,API可以正常运行。我想在一个事务中运行一系列SQL语句。如果它存在,我在JTA事务的上下文中发生它们很好。但是,如果没有,那么我需要使用JDBC事务划分方法。 (在参与JTA事务的JDBC连接上调用这些方法会导致SQLException。)

所以我需要能够确定Connection是来自支持JTA的DataSource还是它只是一个直接的JDBC连接。

有没有直接的方法来做出这个决定?

谢谢!

3 个答案:

答案 0 :(得分:4)

即使它是直接的JDBC,您也可以启用JTA事务。检查autoCommit标志在这方面没有帮助。您可以处于事务中,分发或以其他方式,autoCommit设置为false。 autoCommit设置为true会告诉您您不在分布式事务中,但值false表示您不会自动提交...它可能在任何类型的事务中。

我认为您将不得不调用UserTransaction.getStatus()并验证它不等于Status.NoTransaction()。如果您正在进行JTA交易,这将告诉您。

答案 1 :(得分:0)

thilo说的确有意义。

否则,不确定直接的方式,但我会给你一个“黑客”方式

编写一个BAD SQL,你知道它会给出数据库异常。 这将导致堆栈跟踪。从堆栈跟踪中,您可以找出它是否是JTA派生连接?

答案 2 :(得分:-1)

您可以尝试检查Connection的autoCommit标志,看看它是否在事务中(无论它来自何处)。 (显然,看到接受的答案,这不能很好。我没有删除这个答案,因为以下内容仍然存在:)

但我认为你应该真正修改你的API以完全依赖外部交易。如果您仍想支持普通JDBC,请将其包装到一个仅启动事务的单独API中。

更新:只需重新阅读您的问题,看到您没有提供API,但希望使用容器管理的连接。但是,您是否可以授权(作为您的应用程序要求的一部分)JTA生效?如果没有,您可以提供配置选项以回退到手动管理的事务。对于这样一个关键特性,要求正确配置似乎是合理的(而不是试图猜测什么是合适的)。