[ 
https://issues.apache.org/jira/browse/DERBY-3077?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Kathey Marsden updated DERBY-3077:
----------------------------------

    Attachment: derby-3077_stat.txt
                derby-3077_diff.txt

Attached is a patch for this issue.   Per Knut's suggestion,  it changes 
expected client side errors such as SocketExceptions and IOExceptions to throw 
08006 exceptions instead of 58 class exceptions.
DRDA_CONNECTION_TERMINATED 
SOCKET_EXCEPTION
COMMUNICATION_ERROR
CONNECTION_FAILED_ON_DEFERRED_RESET
NET_INSUFFICIENT_DATA
NET_LOB_DATA_TOO_LARGE_FOR_JVM 

This leaves only protocol exceptions in the 58 class.  

Please review.

Kathey


> Trying to reconnect with derby client after bringing server down throws SQL 
> Exception 58009 rather than 08XXX exception
> -----------------------------------------------------------------------------------------------------------------------
>
>                 Key: DERBY-3077
>                 URL: https://issues.apache.org/jira/browse/DERBY-3077
>             Project: Derby
>          Issue Type: Bug
>          Components: JDBC
>    Affects Versions: 10.2.2.0
>            Reporter: Kathey Marsden
>            Assignee: Kathey Marsden
>         Attachments: derby-3077_diff.txt, derby-3077_stat.txt
>
>
> This issue was discussed in DERBY-401, because the case where the server is 
> brought down and an application tries to reconnect does not throw a 
> SQLNonTransientException.  Discussion is still underway about whether 58XXX 
> exceptions should be SQLNonTransientExceptions, but at least for this case 
> changing the exception to 08006 per Knut's suggestion should correct the 
> problem for this case. See 
> https://issues.apache.org/jira/browse/DERBY-401#action_12527400
> Below is current stack and test case.
> Apache Derby
> got connection now sleep
> now try to use the connection after you killed the nS
> Exception in thread "main" java.sql.SQLException: A communications error has 
> been detected: Software caused connection abort: recv failed.
> at org.apache.derby.client.am.SQLExceptionFactory40.getSQLException(Unknown 
> Source)
> at org.apache.derby.client.am.SqlException.getSQLException(Unknown Source)
> at org.apache.derby.client.am.Connection.prepareStatement(Unknown Source)
> at org.apache.derby.client.am.LogicalConnection.prepareStatement(Unknown 
> Source)
> at DerbyClientNonXA.main(DerbyClientNonXA.java:48)
> Caused by: org.apache.derby.client.am.DisconnectException: A communications 
> error has been detected: Software caused connection abort: recv failed.
> at org.apache.derby.client.net.NetAgent.throwCommunicationsFailure(Unknown 
> Source)
> at org.apache.derby.client.net.Reply.fill(Unknown Source)
> at org.apache.derby.client.net.Reply.ensureALayerDataInBuffer(Unknown Source)
> at org.apache.derby.client.net.Reply.readDssHeader(Unknown Source)
> at org.apache.derby.client.net.Reply.startSameIdChainParse(Unknown Source)
> at 
> org.apache.derby.client.net.NetStatementReply.readPrepareDescribeOutput(Unknown
>  Source)
> at 
> org.apache.derby.client.net.StatementReply.readPrepareDescribeOutput(Unknown 
> Source)
> at 
> org.apache.derby.client.net.NetStatement.readPrepareDescribeOutput_(Unknown 
> Source)
> at org.apache.derby.client.am.Statement.readPrepareDescribeOutput(Unknown 
> Source)
> at 
> org.apache.derby.client.am.PreparedStatement.readPrepareDescribeInputOutput(Unknown
>  Source)
> at 
> org.apache.derby.client.am.PreparedStatement.flowPrepareDescribeInputOutput(Unknown
>  Source)
> at org.apache.derby.client.am.PreparedStatement.prepare(Unknown Source)
> at org.apache.derby.client.am.Connection.prepareStatementX(Unknown Source)
> ... 3 more
> Caused by: java.net.SocketException: Software caused connection abort: recv 
> failed
> at java.net.SocketInputStream.read(SocketInputStream.java:129)
> ... 15 more
> import java.sql.Connection;
> import java.sql.DatabaseMetaData;
> import java.sql.PreparedStatement;
> import java.sql.SQLException;
> import java.sql.Statement;
> import javax.sql.PooledConnection;
> public class DerbyClientNonXA
> {
> public static void main(String args[]) throws Exception
> {
> org.apache.derby.jdbc.ClientConnectionPoolDataSource40 ds = new 
> org.apache.derby.jdbc.ClientConnectionPoolDataSource40();
> Connection conn = null;
> ds.setDatabaseName("e:\\temp\\sampl127;create=true");
> PooledConnection pooledCon = ds.getPooledConnection();
> conn = pooledCon.getConnection();
> DatabaseMetaData md = conn.getMetaData();
> System.out.println(md.getDatabaseProductVersion());
> System.out.println(md.getDatabaseProductName());
> System.out.println("got connection now sleep. Bring down network server.");
> Statement st = null;
> PreparedStatement ps1 = null;
> st = conn.createStatement();
> try
> {
> st.executeUpdate("drop table TAB1");
> }
> catch (SQLException x)
> {
> System.out.println("no table exists");
> }
> Thread.sleep(15000);
> System.out.println("now try to use the connection after you killed the nS");
> ps1 = conn.prepareStatement("CREATE TABLE TAB1(COL1 INT NOT NULL)");
> ps1.executeUpdate();
> conn.commit();
> System.out.println("done");
> }
> }

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to