[jboss-jira] [JBoss JIRA] Commented: (JBAS-3258) JDBC artificats should throw SQLException when already closed

Ravi K (JIRA) jira-events at jboss.com
Wed Aug 16 13:18:33 EDT 2006


    [ http://jira.jboss.com/jira/browse/JBAS-3258?page=comments#action_12341344 ] 
            
Ravi K commented on JBAS-3258:
------------------------------

Temporary Fix while we wait for 404SP1

If you are comfortable with enabling aspects here's a touch-free solution to the "Already closed" exceptions in 4.0.4. This works with JDK 5.0.

Put this class anywhere you like in your source:

---------------------------------------
package mypackage;

import java.sql.SQLException;

import org.jboss.aop.Bind;
import org.jboss.aop.InterceptorDef;
import org.jboss.aop.advice.Interceptor;
import org.jboss.aop.joinpoint.Invocation;
/**
 * Temporary fix to JBoss's connection pool which throws an exception
 * every time a JDBC resource is closed twice. This violates the 
 * JDBC API contract.
 * 
 * In this aspect the close call is being wrapped and the false 
 * exception is being ignored. 
 * 
 * @author ravi
 */
@InterceptorDef
@Bind (pointcut="execution(* org.jboss.resource.adapter.jdbc.WrappedStatement->close())")
@Bind (pointcut="execution(* org.jboss.resource.adapter.jdbc.WrappedResultSet->close())")
public class JBossConnectionAspect implements Interceptor
{
	public String getName()
	{
		return "JBossConnectionAspect";
	}

	public Object invoke(Invocation invocation) throws Throwable
	{
		try
		{
			return invocation.invokeNext();
		}
		catch(SQLException sqle)
		{
			/* Ignore false exceptions throw due to a JBoss bug */
			if(sqle.getMessage().equals("Already closed"))
			{
				System.out.println("Aspectized wrapper: JBoss said resource already closed.");
				return null;
			}
			else
			{
				throw sqle;
			}
		}
	}
}
---------------------------------------
You might want to turn off the System.out if it gets too verbose.

Assuming you followed the standard instructions and JBoss is running the jboss-aof-jdk50.deployer just change base-aop.xml under ..\server\<servername>\deploy\jboss-aop-jdk50.deployer\

<aop>
	<aspect class="mypackage.JBossConnectionAspect"/>
	<bind pointcut="execution(public void org.jboss.resource.adapter.jdbc.WrappedStatement->close(..))">
		<interceptor class="mypackage.JBossConnectionAspect"/>
	</bind>
</aop>

ravi at pobox.com

> JDBC artificats should throw SQLException when already closed
> -------------------------------------------------------------
>
>                 Key: JBAS-3258
>                 URL: http://jira.jboss.com/jira/browse/JBAS-3258
>             Project: JBoss Application Server
>          Issue Type: Bug
>      Security Level: Public(Everyone can see) 
>          Components: JCA service
>    Affects Versions: JBossAS-4.0.4.GA
>            Reporter: Adrian Brock
>         Assigned To: Weston Price
>             Fix For: JBossAS-4.0.4.SP1
>
>
> In the change to fix JBAS-2741 I mistakenly made the JDBC wrappers throw an SQL
> exception if the artifact is already closed. They should just return with an exception.
> From the Javadoc:
> "Calling the method close on a Statement  object that is already closed has no effect."
> e.g. In WrappedStatement
>    public void close() throws SQLException
>    {
>       synchronized (lock)
>       {
>          if (closed)
>             throw new SQLException("Already closed");
>          closed = true;
>       }
>       lc.unregisterStatement(this);
>       internalClose();
>    }
> this should be:
>    public void close() throws SQLException
>    {
>       synchronized (lock)
>       {
>          if (closed)
>             return;
>          closed = true;
>       }
>       lc.unregisterStatement(this);
>       internalClose();
>    }

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://jira.jboss.com/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        



More information about the jboss-jira mailing list