You are viewing a plain text version of this content. The canonical link for it is here.
Posted to derby-dev@db.apache.org by "Mamta A. Satoor (JIRA)" <ji...@apache.org> on 2013/02/28 00:07:13 UTC
[jira] [Reopened] (DERBY-6053) Client should use a prepared
statement rather than regular statement for
Connection.setTransactionIsolation
[ https://issues.apache.org/jira/browse/DERBY-6053?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Mamta A. Satoor reopened DERBY-6053:
------------------------------------
reopening the issue for backporting
> 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
> Assignee: Mamta A. Satoor
> Fix For: 10.10.0.0
>
> Attachments: derby-6053-01-aa-lintCheck.diff, 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