Kathey Marsden created DERBY-6055:
-------------------------------------

             Summary: Drained metadata result sets  can cause  build up of open 
statements open on client/server until gc kicks in
                 Key: DERBY-6055
                 URL: https://issues.apache.org/jira/browse/DERBY-6055
             Project: Derby
          Issue Type: Bug
          Components: Network Client
            Reporter: Kathey Marsden
            Assignee: Kathey Marsden
            Priority: Minor


With client/server, depending on when garbage collection kicks in metadata 
related statements can build up until garbage collection. This is only 
potentially an issue I think with client where there is a limit of 32K 
statements and only if there is some sort of extremely deferred garbage 
collection.

The program below shows the issue which is easy enough to work around by 
closing the statement associated with the metadata result set,  uncommenting 
the line.

          //rs.getStatement().close();



import java.sql.*;
import java.net.*;
import java.io.*;
import org.apache.derby.drda.NetworkServerControl;

/**
 * Show client/server Metadata statements can build up even when 
 * Metadata result sets have been closed.
 */
public class MetaDataStatements {
    
    public static void main(String[] args) throws Exception {
        try {
            // Load the driver. Not needed for network server.
            
            Class.forName("org.apache.derby.jdbc.ClientDriver");
            // Start Network Server
            startNetworkServer();
            // If connecting to a customer database. Change the URL
            Connection conn = DriverManager
                    
.getConnection("jdbc:derby://localhost:1527/wombat;create=true");
            // clean up from a previous run
            Statement s = conn.createStatement();
            try {
                s.executeUpdate("DROP TABLE T");
            } catch (SQLException se) {
                if (!se.getSQLState().equals("42Y55"))
                    throw se;
            }
          
            for (int i = 0; i < 50000; i++) {
                ResultSet rs = conn.getMetaData().getSchemas();
                while (rs.next()) {
                    //System.out.println("SCHEM NAME  = " + rs.getString(1));
                }
                //rs.getStatement().close();
            }
            
            // rs.close();
            // ps.close();
            // s.close();
            runtimeInfo();
            conn.close();
            // Shutdown the server
            shutdownServer();
        } catch (SQLException se) {
            while (se != null) {
                System.out.println("SQLState=" + se.getSQLState()
                        + se.getMessage());
                se.printStackTrace();
                se = se.getNextException();
            }
        }
    }
    
    /**
     * starts the Network server
     * 
     */
    public static void startNetworkServer() throws SQLException {
        Exception failException = null;
        try {
            
            NetworkServerControl networkServer = new NetworkServerControl(
                    InetAddress.getByName("localhost"), 1527);
            
            networkServer.start(new PrintWriter(System.out));
            
            // Wait for the network server to start
            boolean started = false;
            int retries = 10; // Max retries = max seconds to wait
            
            while (!started && retries > 0) {
                try {
                    // Sleep 1 second and then ping the network server
                    Thread.sleep(1000);
                    networkServer.ping();
                    
                    // If ping does not throw an exception the server has
                    // started
                    started = true;
                } catch (Exception e) {
                    retries--;
                    failException = e;
                }
                
            }
            
            // Check if we got a reply on ping
            if (!started) {
                throw failException;
            }
        } catch (Exception e) {
            SQLException se = new SQLException("Error starting network  
server");
            se.initCause(failException);
            throw se;
        }
    }
    
    public static void shutdownServer() throws Exception {
        NetworkServerControl networkServer = new NetworkServerControl(
                InetAddress.getByName("localhost"), 1527);
        networkServer.shutdown();
    }
    
    public static void runtimeInfo() throws Exception {
        NetworkServerControl networkServer = new NetworkServerControl(
                InetAddress.getByName("localhost"), 1527);
        System.out.println(networkServer.getRuntimeInfo());
    }
    
}








---------- Session Information ---------------
Session # :2
Database :wombat;create=true
User :APP
# Statements:59
Prepared Statement Information:
        Stmt ID         SQLText
        -------------   -----------
        SYSLH00032      CALL SYSIBM.SQLTABLES('', '', '', '', 'GETSCHEMAS=1')
        SYSLH00033      CALL SYSIBM.SQLTABLES('', '', '', '', 'GETSCHEMAS=1')
        SYSLH00060      CALL SYSIBM.SQLTABLES('', '', '', '', 'GETSCHEMAS=1')
        SYSLH00058      CALL SYSIBM.SQLTABLES('', '', '', '', 'GETSCHEMAS=1')
        SYSLH00059      CALL SYSIBM.SQLTABLES('', '', '', '', 'GETSCHEMAS=1')
        SYSLH00056      CALL SYSIBM.SQLTABLES('', '', '', '', 'GETSCHEMAS=1')
        SYSLH00057      CALL SYSIBM.SQLTABLES('', '', '', '', 'GETSCHEMAS=1')
        SYSLH00054      CALL SYSIBM.SQLTABLES('', '', '', '', 'GETSCHEMAS=1')
        SYSLH00055      CALL SYSIBM.SQLTABLES('', '', '', '', 'GETSCHEMAS=1')


--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to