Return-Path: X-Original-To: apmail-db-derby-dev-archive@www.apache.org Delivered-To: apmail-db-derby-dev-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id A4B7AEA9B for ; Fri, 1 Feb 2013 22:52:13 +0000 (UTC) Received: (qmail 64250 invoked by uid 500); 1 Feb 2013 22:52:13 -0000 Delivered-To: apmail-db-derby-dev-archive@db.apache.org Received: (qmail 64194 invoked by uid 500); 1 Feb 2013 22:52:13 -0000 Mailing-List: contact derby-dev-help@db.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: Delivered-To: mailing list derby-dev@db.apache.org Received: (qmail 64102 invoked by uid 99); 1 Feb 2013 22:52:13 -0000 Received: from arcas.apache.org (HELO arcas.apache.org) (140.211.11.28) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 01 Feb 2013 22:52:13 +0000 Date: Fri, 1 Feb 2013 22:52:13 +0000 (UTC) From: "Mamta A. Satoor (JIRA)" To: derby-dev@db.apache.org Message-ID: In-Reply-To: References: Subject: [jira] [Updated] (DERBY-6053) Client should use a prepared statement rather than regular statement for Connection.setTransactionIsolation MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-JIRA-FingerPrint: 30527f35849b9dde25b450d4833f0394 [ https://issues.apache.org/jira/browse/DERBY-6053?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ] Mamta A. Satoor updated DERBY-6053: ----------------------------------- Attachment: DERBY6053_patch1_diff.txt Here is the correct attachement > Client should use a prepared statement rather than regular statement for Connection.setTransactionIsolation > ----------------------------------------------------------------------------------------------------------- > > Key: DERBY-6053 > URL: https://issues.apache.org/jira/browse/DERBY-6053 > Project: Derby > Issue Type: Improvement > Components: Network Client > Reporter: Kathey Marsden > Attachments: DERBY6053_patch1_diff.txt > > > o.a.d.client.am.Connection setTransactionIsolation() uses a Statement which it builds up each time for setTransactionIsolation() is called. > private Statement setTransactionIsolationStmt = null; > ... > setTransactionIsolationStmt = > createStatementX(java.sql.ResultSet.TYPE_FORWARD_ONLY, > java.sql.ResultSet.CONCUR_READ_ONLY, > holdability()); > .... > private void setTransactionIsolationX(int level) > ... > setTransactionIsolationStmt.executeUpdate( > "SET CURRENT ISOLATION = " + levelString); > It would be better for performance and also for avoid possible garbage collection issues, to have a single prepared statement with a parameter marker. > The program below shows repeated calls to setTransactionIsolation. > import java.sql.*; > import java.net.*; > import java.io.*; > import org.apache.derby.drda.NetworkServerControl; > /** > * Client template starts its own NetworkServer and runs some SQL against it. > * The SQL or JDBC API calls can be modified to reproduce issues > * > */public class SetTransactionIsolation { > public static Statement s; > > 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 > 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++) { > conn.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ); > conn.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE); > } > > // rs.close(); > // ps.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()); > } > > } -- 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