001: /*
002:
003: Derby - Class org.apache.derbyTesting.functionTests.tests.lang.bug5052rts
004:
005: Licensed to the Apache Software Foundation (ASF) under one or more
006: contributor license agreements. See the NOTICE file distributed with
007: this work for additional information regarding copyright ownership.
008: The ASF licenses this file to You under the Apache License, Version 2.0
009: (the "License"); you may not use this file except in compliance with
010: the License. You may obtain a copy of the License at
011:
012: http://www.apache.org/licenses/LICENSE-2.0
013:
014: Unless required by applicable law or agreed to in writing, software
015: distributed under the License is distributed on an "AS IS" BASIS,
016: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
017: See the License for the specific language governing permissions and
018: limitations under the License.
019:
020: */
021:
022: package org.apache.derbyTesting.functionTests.tests.lang;
023:
024: import java.sql.Connection;
025: import java.sql.DriverManager;
026: import java.sql.ResultSetMetaData;
027: import java.sql.ResultSet;
028: import java.sql.Statement;
029: import java.sql.SQLException;
030: import java.sql.Types;
031: import java.sql.*;
032:
033: import org.apache.derby.tools.ij;
034: import org.apache.derby.tools.JDBCDisplayUtil;
035:
036: /**
037: * testing gathering of runtime statistics for
038: * for the resultsets/statements not closed by the usee,
039: * but get closed when garbage collector collects such
040: * objects and closes them by calling the finalize.
041: * See bug : 5052 for details.
042: *
043: */
044:
045: public class bug5052rts {
046:
047: public static void main(String[] args) {
048: Connection conn;
049: Statement stmt;
050: PreparedStatement pstmt;
051:
052: System.out.println("Test RunTime Statistics starting");
053: try {
054: // use the ij utility to read the property file and
055: // make the initial connection.
056: ij.getPropertyArg(args);
057: conn = ij.startJBMS();
058: stmt = conn.createStatement();
059: try {
060: stmt.execute("drop table tab1");
061: } catch (Throwable e) {
062: }
063:
064: //create a table, insert a row, do a select from the table,
065: stmt
066: .execute("create table tab1 (COL1 int, COL2 smallint, COL3 real)");
067: stmt.executeUpdate("insert into tab1 values(1, 2, 3.1)");
068: stmt.executeUpdate("insert into tab1 values(2, 2, 3.1)");
069: conn.setAutoCommit(false);
070:
071: //case1: Setting runtime statistics on just before result set close.
072: if (true) {
073: Statement stmt0 = conn.createStatement();
074: ResultSet rs = stmt0.executeQuery("select * from tab1"); // opens the result set
075:
076: while (rs.next()) {
077: System.out.println(rs.getString(1));
078: }
079: //set the runtime statistics on now.
080: CallableStatement cs = conn
081: .prepareCall("CALL SYSCS_UTIL.SYSCS_SET_RUNTIMESTATISTICS(?)");
082: cs.setInt(1, 1);
083: cs.execute();
084: cs.close();
085:
086: rs.close();
087: stmt0.close();
088: }
089:
090: CallableStatement cs = conn
091: .prepareCall("CALL SYSCS_UTIL.SYSCS_SET_RUNTIMESTATISTICS(?)");
092: cs.setInt(1, 0);
093: cs.execute();
094: cs.close();
095:
096: //case2: Stament/Resutset getting closed by the Garbage collector.
097: if (true) {
098: Statement stmt1 = conn.createStatement();
099: ResultSet rs = stmt1.executeQuery("select * from tab1"); // opens the result set
100:
101: while (rs.next()) {
102: System.out.println(rs.getString(1));
103: }
104: //set the runtime statistics on now.
105: cs = conn
106: .prepareCall("CALL SYSCS_UTIL.SYSCS_SET_RUNTIMESTATISTICS(?)");
107: cs.setInt(1, 1);
108: cs.execute();
109: cs.close();
110: }
111:
112: if (true) {
113: Statement stmt2 = conn.createStatement();
114: ResultSet rs1 = stmt2
115: .executeQuery("select count(*) from tab1"); // opens the result set
116:
117: while (rs1.next()) {
118: System.out.println(rs1.getString(1));
119: }
120: }
121:
122: for (int i = 0; i < 3; i++) {
123: System.gc();
124: System.runFinalization();
125: //sleep for sometime to make sure garbage collector kicked in
126: //and collected the result set object.
127: Thread.sleep(3000);
128: }
129:
130: conn.commit(); //This should have failed before we fix 5052
131: conn.close();
132: }
133:
134: catch (SQLException e) {
135: dumpSQLExceptions(e);
136: e.printStackTrace();
137: } catch (Throwable e) {
138: System.out.println("FAIL -- unexpected exception: " + e);
139: e.printStackTrace();
140: }
141: System.out
142: .println("Test RunTimeStatistics finished successfully");
143: }
144:
145: static private void dumpSQLExceptions(SQLException se) {
146: System.out.println("FAIL -- unexpected exception");
147: while (se != null) {
148: System.out.println("SQLSTATE(" + se.getSQLState() + "): "
149: + se);
150: se = se.getNextException();
151: }
152: }
153:
154: }
|