Обсуждение: call XAConnection.commit() when autoCommit=true throw InvocationTargetException not SQLException.
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
Hi This is a quick patch to current head. Regards, Yao On Thu, Oct 14, 2010 at 6:24 PM, Yaocl <chunlinyao@gmail.com> wrote: > 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 >
Вложения
Thanks, I've applied this patch to CVS. Kris Jurka On Thu, 14 Oct 2010, Yaocl wrote: > Hi > > This is a quick patch to current head. > > Regards, > Yao > > On Thu, Oct 14, 2010 at 6:24 PM, Yaocl <chunlinyao@gmail.com> wrote: >> 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 >> >