call XAConnection.commit() when autoCommit=true throw InvocationTargetException not SQLException.

From: Yaocl <chunlinyao(at)gmail(dot)com>
To: pgsql-jdbc(at)postgresql(dot)org
Subject: call XAConnection.commit() when autoCommit=true throw InvocationTargetException not SQLException.
Date: 2010-10-14 10:24:08
Message-ID: AANLkTimTFWMnXoQaY+qVUSPkv-Y=rzCF=dvD_JiumxRA@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-jdbc

Hi

According to the javadoc call commit() on autoCommit=true connection
will throw a SQLException. But a PGXAConnection
thrown a InvocationTargetException.

Because the following code, It use reflection internally.
method.invoke() will throw InvocationTargetException when underlying
method throw a Exception.

 /*
     * A java.sql.Connection proxy class to forbid calls to transaction
     * control methods while the connection is used for an XA transaction.
     */
    private class ConnectionHandler implements InvocationHandler
    {
private Connection con;
public ConnectionHandler(Connection con)
{
            this.con = con;
        }
        public Object invoke(Object proxy, Method method, Object[] args)
        throws Throwable
        {
   if (state != STATE_IDLE)
            {
                String methodName = method.getName();
                if (methodName.equals("commit") ||
                    methodName.equals("rollback") ||
                    methodName.equals("setSavePoint") ||
                    (methodName.equals("setAutoCommit") && ((Boolean)
args[0]).booleanValue()))
                {
   throw new PSQLException(GT.tr("Transaction control methods
setAutoCommit(true), commit, rollback and setSavePoint not allowed
while an XA transaction is active."),
   PSQLState.OBJECT_NOT_IN_STATE);
                }
            }
   return method.invoke(con, args);
        }
    }

Regards,
Yao

Responses

Browse pgsql-jdbc by date

  From Date Subject
Next Message Yaocl 2010-10-14 12:18:36 Re: call XAConnection.commit() when autoCommit=true throw InvocationTargetException not SQLException.
Previous Message Radosław Smogura 2010-10-14 06:59:23 Re: [JDBC] Support for JDBC setQueryTimeout, et al.