From 0decc91a4343a436557d8084c4c23afe60853e51 Mon Sep 17 00:00:00 2001 From: wenshao Date: Tue, 21 Aug 2012 08:01:46 +0800 Subject: [PATCH] add xa support --- .../druid/pool/xa/DruidAXDataSource.java | 19 +++--- .../pool/xa/DruidPooledXAConnection.java | 59 +++++++++++++++++++ 2 files changed, 68 insertions(+), 10 deletions(-) create mode 100644 src/main/java/com/alibaba/druid/pool/xa/DruidPooledXAConnection.java diff --git a/src/main/java/com/alibaba/druid/pool/xa/DruidAXDataSource.java b/src/main/java/com/alibaba/druid/pool/xa/DruidAXDataSource.java index 51dd279ac2..51b166c535 100644 --- a/src/main/java/com/alibaba/druid/pool/xa/DruidAXDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/xa/DruidAXDataSource.java @@ -28,24 +28,23 @@ public class DruidAXDataSource extends DruidDataSource implements XADataSource { Connection physicalConn = conn.unwrap(Connection.class); + XAConnection rawXAConnection; if (JdbcUtils.ORACLE.equals(dbType)) { try { - return OracleUtils.OracleXAConnection(physicalConn); + rawXAConnection = OracleUtils.OracleXAConnection(physicalConn); } catch (XAException xae) { LOG.error("create xaConnection error", xae); return null; } + } else if (JdbcUtils.MYSQL.equals(dbType)) { + rawXAConnection = MySqlUtils.createXAConnection(physicalConn); + } else if (JdbcUtils.POSTGRESQL.equals(dbType)) { + rawXAConnection = PGUtils.createXAConnection(physicalConn); + } else { + throw new SQLException("xa not support dbType : " + this.dbType); } - if (JdbcUtils.MYSQL.equals(dbType)) { - return MySqlUtils.createXAConnection(physicalConn); - } - - if (JdbcUtils.POSTGRESQL.equals(dbType)) { - return PGUtils.createXAConnection(physicalConn); - } - - throw new SQLException("xa not support dbType : " + this.dbType); + return new DruidPooledXAConnection(conn, rawXAConnection); } @Override diff --git a/src/main/java/com/alibaba/druid/pool/xa/DruidPooledXAConnection.java b/src/main/java/com/alibaba/druid/pool/xa/DruidPooledXAConnection.java new file mode 100644 index 0000000000..6f8306e987 --- /dev/null +++ b/src/main/java/com/alibaba/druid/pool/xa/DruidPooledXAConnection.java @@ -0,0 +1,59 @@ +package com.alibaba.druid.pool.xa; + +import java.sql.Connection; +import java.sql.SQLException; + +import javax.sql.ConnectionEventListener; +import javax.sql.StatementEventListener; +import javax.sql.XAConnection; +import javax.transaction.xa.XAResource; + +import com.alibaba.druid.pool.DruidPooledConnection; + +public class DruidPooledXAConnection implements XAConnection { + + private DruidPooledConnection pooledConnection; + private XAConnection xaConnection; + + public DruidPooledXAConnection(DruidPooledConnection pooledConnection, XAConnection xaConnection){ + this.pooledConnection = pooledConnection; + this.xaConnection = xaConnection; + + } + + @Override + public Connection getConnection() throws SQLException { + return pooledConnection; + } + + @Override + public void close() throws SQLException { + pooledConnection.close(); + } + + @Override + public void addConnectionEventListener(ConnectionEventListener listener) { + pooledConnection.addConnectionEventListener(listener); + } + + @Override + public void removeConnectionEventListener(ConnectionEventListener listener) { + pooledConnection.removeConnectionEventListener(listener); + } + + @Override + public void addStatementEventListener(StatementEventListener listener) { + pooledConnection.addStatementEventListener(listener); + } + + @Override + public void removeStatementEventListener(StatementEventListener listener) { + pooledConnection.removeStatementEventListener(listener); + } + + @Override + public XAResource getXAResource() throws SQLException { + return xaConnection.getXAResource(); + } + +}