You are viewing a plain text version of this content. The canonical link for it is here.
Posted to derby-commits@db.apache.org by tm...@apache.org on 2006/02/12 06:08:59 UTC
svn commit: r377131 - in
/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests:
master/ShutdownDatabase.out suites/derbylang.runall
suites/derbynetmats.runall tests/lang/ShutdownDatabase.java
Author: tmnk
Date: Sat Feb 11 21:08:58 2006
New Revision: 377131
URL: http://svn.apache.org/viewcvs?rev=377131&view=rev
Log:
- DERBY-511 Test of shutting down database when active connections alive - Patch by Tomohito Nakayama (tomonaka@basil.ocn.ne.jp)
Added:
db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/ShutdownDatabase.out
db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/ShutdownDatabase.java
Modified:
db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/derbylang.runall
db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/derbynetmats.runall
Added: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/ShutdownDatabase.out
URL: http://svn.apache.org/viewcvs/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/ShutdownDatabase.out?rev=377131&view=auto
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/ShutdownDatabase.out (added)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/ShutdownDatabase.out Sat Feb 11 21:08:58 2006
@@ -0,0 +1,27 @@
+A connection to testOnlyTransactionWasCommitedDB was opened.
+SQLException of shutting down was found.
+1000
+A connection to testTwiceCommitedDB was opened.
+SQLException of shutting down was found.
+1999
+A connection to testOnceRollbackedAndCommitedDB was opened.
+SQLException of shutting down was found.
+999
+A connection to testOnlyTransactionWasRollbackedDB was opened.
+SQLException of shutting down was found.
+0
+A connection to testOnceCommitedAndRollbackedDB was opened.
+SQLException of shutting down was found.
+1000
+A connection to testTwiceRollbackedDB was opened.
+SQLException of shutting down was found.
+0
+A connection to testOnlyTransactionWasLeftDB was opened.
+SQLException of shutting down was found.
+0
+A connection to testOnceCommitedAndLeftDB was opened.
+SQLException of shutting down was found.
+1000
+A connection to testOnceRollbackedAndLeftDB was opened.
+SQLException of shutting down was found.
+0
Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/derbylang.runall
URL: http://svn.apache.org/viewcvs/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/derbylang.runall?rev=377131&r1=377130&r2=377131&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/derbylang.runall (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/derbylang.runall Sat Feb 11 21:08:58 2006
@@ -145,3 +145,4 @@
lang/valuesclause.sql
lang/views.sql
lang/wisconsin.java
+lang/ShutdownDatabase.java
\ No newline at end of file
Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/derbynetmats.runall
URL: http://svn.apache.org/viewcvs/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/derbynetmats.runall?rev=377131&r1=377130&r2=377131&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/derbynetmats.runall (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/derbynetmats.runall Sat Feb 11 21:08:58 2006
@@ -39,6 +39,7 @@
lang/updatableResultSet.java
lang/wisconsin.java
lang/syscat.sql
+lang/ShutdownDatabase.java
store/holdCursorExternalSortJDBC30.sql
store/holdCursorJDBC30.sql
tools/importExport.java
Added: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/ShutdownDatabase.java
URL: http://svn.apache.org/viewcvs/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/ShutdownDatabase.java?rev=377131&view=auto
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/ShutdownDatabase.java (added)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/ShutdownDatabase.java Sat Feb 11 21:08:58 2006
@@ -0,0 +1,670 @@
+/*
+
+Derby - Class org.apache.derbyTesting.functionTests.tests.lang.ShutdownDatabase
+
+Copyright 1999, 2004 The Apache Software Foundation or its licensors, as applicable.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+*/
+
+package org.apache.derbyTesting.functionTests.tests.lang;
+
+/**
+ This test confirm
+ that no trouble happens when database , of which active connection exists with , was shut down.
+
+
+ Tested combinations for transaction of connection to a database that is shutted down is as next :
+
+ With committed/rollbacked transatction :
+ <ul>
+ <li>
+ <ul>
+ <li> The only transaction was committed.
+ <li> The transaction was committed, and next transaction was committed.
+ <li> The transaction was rollbacked, and next transaction was commited.
+ </ul>
+ </li>
+
+ <li>
+ <ul>
+ <li> The only transaction was rollbacked.
+ <li> The transaction was commited, and next transaction was rollbacked.
+ <li> The transaction was rollbacked, and next transaction was rollbacked.
+ </ul>
+ </li>
+ </ul>
+
+ With not yet committed/rollbacked transaction :
+ <ul>
+ <li>
+ <ul>
+ <li> The only transaction was not committed/rollbacked.
+ <li> The transaction was committed, and next transaction was not committed/rollbacked yet.
+ <li> The transaction was rollbacked, and next transaction was not committed/rollbacked yet.
+ </ul>
+ </li>
+ </ul>
+
+ @author Tomohito Nakayama
+*/
+
+import java.util.Properties;
+import java.sql.Connection;
+import java.sql.Statement;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+
+import java.io.IOException;
+import java.sql.SQLException;
+
+import org.apache.derby.iapi.reference.SQLState;
+import org.apache.derby.impl.tools.ij.util;
+
+import org.apache.derby.iapi.error.StandardException;
+
+
+
+public class ShutdownDatabase{
+
+
+ public static void main(String[] args) {
+ try{
+ util.getPropertyArg(args);
+
+ testShutDownWithCommitedTransaction();
+ testShutDownWithRollbackedTransaction();
+ testShutDownWithLeftTransaction();
+
+ }catch(IOException e){
+ e.printStackTrace();
+
+ }catch(SQLException e){
+ e.printStackTrace();
+
+ }catch(ClassNotFoundException e){
+ e.printStackTrace();
+
+ }catch(InstantiationException e){
+ e.printStackTrace();
+
+ }catch(IllegalAccessException e){
+ e.printStackTrace();
+
+ }catch(Throwable t){
+ t.printStackTrace();
+
+ }
+
+ }
+
+
+ private static void testShutDownWithCommitedTransaction()
+ throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {
+
+ testOnlyTransactionWasCommited();
+ testTwiceCommited();
+ testOnceRollbackedAndCommited();
+
+ }
+
+
+ private static void testShutDownWithRollbackedTransaction()
+ throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {
+
+ testOnlyTransactionWasRollbacked();
+ testOnceCommitedAndRollbacked();
+ testTwiceRollbacked();
+
+ }
+
+
+ private static void testShutDownWithLeftTransaction()
+ throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {
+
+ testOnlyTransactionWasLeft();
+ testOnceCommitedAndLeft();
+ testOnceRollbackedAndLeft();
+
+ }
+
+
+ private static void testOnlyTransactionWasCommited()
+ throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {
+
+ final String dbname = "testOnlyTransactionWasCommitedDB";
+ Connection conn = null;
+
+
+ try{
+ conn = openConnectionToNewDatabase(dbname);
+ createTestTable(conn);
+
+ conn.setAutoCommit(false);
+ insertIntoTestTable(conn,
+ 1,
+ 1000);
+ conn.commit();
+
+ shutdownDatabase(dbname);
+
+ }catch(SQLException e){
+ verifyShutdownError(e);
+ }
+
+
+ conn = null;
+
+ try{
+ conn = reopenConnectionToDatabase(dbname);
+ countRowInTestTable(conn);
+
+ }finally{
+ if(conn != null){
+ conn.close();
+ conn = null;
+ }
+ }
+
+ }
+
+
+ private static void testTwiceCommited()
+ throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {
+
+ final String dbname = "testTwiceCommitedDB";
+ Connection conn = null;
+
+
+ try{
+ conn = openConnectionToNewDatabase(dbname);
+ createTestTable(conn);
+
+ conn.setAutoCommit(false);
+ insertIntoTestTable(conn,
+ 1,
+ 1000);
+ conn.commit();
+ insertIntoTestTable(conn,
+ 1001,
+ 999);
+ conn.commit();
+
+ shutdownDatabase(dbname);
+
+ }catch(SQLException e){
+ verifyShutdownError(e);
+ }
+
+
+ conn = null;
+
+ try{
+ conn = reopenConnectionToDatabase(dbname);
+ countRowInTestTable(conn);
+
+ }finally{
+ if(conn != null){
+ conn.close();
+ conn = null;
+ }
+ }
+
+ }
+
+
+ private static void testOnceRollbackedAndCommited()
+ throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {
+
+ final String dbname = "testOnceRollbackedAndCommitedDB";
+ Connection conn = null;
+
+
+ try{
+ conn = openConnectionToNewDatabase(dbname);
+ createTestTable(conn);
+
+ conn.setAutoCommit(false);
+ insertIntoTestTable(conn,
+ 1,
+ 1000);
+ conn.rollback();
+ insertIntoTestTable(conn,
+ 1001,
+ 999);
+ conn.commit();
+
+ shutdownDatabase(dbname);
+
+ }catch(SQLException e){
+ verifyShutdownError(e);
+ }
+
+
+ conn = null;
+
+ try{
+ conn = reopenConnectionToDatabase(dbname);
+ countRowInTestTable(conn);
+
+ }finally{
+ if(conn != null){
+ conn.close();
+ conn = null;
+ }
+ }
+
+ }
+
+
+ private static void testOnlyTransactionWasRollbacked()
+ throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {
+
+ final String dbname = "testOnlyTransactionWasRollbackedDB";
+ Connection conn = null;
+
+
+ try{
+ conn = openConnectionToNewDatabase(dbname);
+ createTestTable(conn);
+
+ conn.setAutoCommit(false);
+ insertIntoTestTable(conn,
+ 1,
+ 1000);
+ conn.rollback();
+
+ shutdownDatabase(dbname);
+
+ }catch(SQLException e){
+ verifyShutdownError(e);
+ }
+
+
+ conn = null;
+
+ try{
+ conn = reopenConnectionToDatabase(dbname);
+ countRowInTestTable(conn);
+
+ }finally{
+ if(conn != null){
+ conn.close();
+ conn = null;
+ }
+ }
+
+ }
+
+
+ private static void testOnceCommitedAndRollbacked()
+ throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {
+
+ final String dbname = "testOnceCommitedAndRollbackedDB";
+ Connection conn = null;
+
+
+ try{
+ conn = openConnectionToNewDatabase(dbname);
+ createTestTable(conn);
+
+ conn.setAutoCommit(false);
+ insertIntoTestTable(conn,
+ 1,
+ 1000);
+ conn.commit();
+ insertIntoTestTable(conn,
+ 1001,
+ 999);
+ conn.rollback();
+
+ shutdownDatabase(dbname);
+
+ }catch(SQLException e){
+ verifyShutdownError(e);
+ }
+
+
+ conn = null;
+
+ try{
+ conn = reopenConnectionToDatabase(dbname);
+ countRowInTestTable(conn);
+
+ }finally{
+ if(conn != null){
+ conn.close();
+ conn = null;
+ }
+ }
+
+ }
+
+
+ private static void testTwiceRollbacked()
+ throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {
+
+ final String dbname = "testTwiceRollbackedDB";
+ Connection conn = null;
+
+
+ try{
+ conn = openConnectionToNewDatabase(dbname);
+ createTestTable(conn);
+
+ conn.setAutoCommit(false);
+ insertIntoTestTable(conn,
+ 1,
+ 1000);
+ conn.rollback();
+ insertIntoTestTable(conn,
+ 1001,
+ 999);
+ conn.rollback();
+
+ shutdownDatabase(dbname);
+
+ }catch(SQLException e){
+ verifyShutdownError(e);
+ }
+
+
+ conn = null;
+
+ try{
+ conn = reopenConnectionToDatabase(dbname);
+ countRowInTestTable(conn);
+
+ }finally{
+ if(conn != null){
+ conn.close();
+ conn = null;
+ }
+ }
+
+ }
+
+
+ private static void testOnlyTransactionWasLeft()
+ throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {
+
+ final String dbname = "testOnlyTransactionWasLeftDB";
+ Connection conn = null;
+
+
+ try{
+ conn = openConnectionToNewDatabase(dbname);
+ createTestTable(conn);
+
+ conn.setAutoCommit(false);
+ insertIntoTestTable(conn,
+ 1,
+ 1000);
+
+ shutdownDatabase(dbname);
+
+ }catch(SQLException e){
+ verifyShutdownError(e);
+ }
+
+
+ conn = null;
+
+ try{
+ conn = reopenConnectionToDatabase(dbname);
+ countRowInTestTable(conn);
+
+ }finally{
+ if(conn != null){
+ conn.close();
+ conn = null;
+ }
+ }
+
+ }
+
+
+ private static void testOnceCommitedAndLeft()
+ throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {
+
+ final String dbname = "testOnceCommitedAndLeftDB";
+ Connection conn = null;
+
+
+ try{
+ conn = openConnectionToNewDatabase(dbname);
+ createTestTable(conn);
+
+ conn.setAutoCommit(false);
+ insertIntoTestTable(conn,
+ 1,
+ 1000);
+ conn.commit();
+ insertIntoTestTable(conn,
+ 1001,
+ 999);
+
+ shutdownDatabase(dbname);
+
+ }catch(SQLException e){
+ verifyShutdownError(e);
+ }
+
+
+ conn = null;
+
+ try{
+ conn = reopenConnectionToDatabase(dbname);
+ countRowInTestTable(conn);
+
+ }finally{
+ if(conn != null){
+ conn.close();
+ conn = null;
+ }
+ }
+
+ }
+
+
+ private static void testOnceRollbackedAndLeft()
+ throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {
+
+ final String dbname = "testOnceRollbackedAndLeftDB";
+ Connection conn = null;
+
+
+ try{
+ conn = openConnectionToNewDatabase(dbname);
+ createTestTable(conn);
+
+ conn.setAutoCommit(false);
+ insertIntoTestTable(conn,
+ 1,
+ 1000);
+ conn.rollback();
+ insertIntoTestTable(conn,
+ 1001,
+ 999);
+
+ shutdownDatabase(dbname);
+
+ }catch(SQLException e){
+ verifyShutdownError(e);
+ }
+
+
+ conn = null;
+
+ try{
+ conn = reopenConnectionToDatabase(dbname);
+ countRowInTestTable(conn);
+
+ }finally{
+ if(conn != null){
+ conn.close();
+ conn = null;
+ }
+ }
+
+ }
+
+
+ private static Connection openConnectionToNewDatabase(String databaseName)
+ throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {
+
+ System.setProperty("database",
+ databaseName + ";create=true");
+
+ Connection conn = util.startJBMS();
+
+ System.out.println("A connection to " + databaseName + " was opened.");
+
+ return conn;
+
+ }
+
+
+ private static Connection reopenConnectionToDatabase(String databaseName)
+ throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {
+
+ System.setProperty("database",
+ databaseName);
+
+ return util.startJBMS();
+
+ }
+
+
+ private static void shutdownDatabase(String databaseName)
+ throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {
+
+ System.setProperty("database",
+ databaseName + ";shutdown=true");
+
+ util.startJBMS();
+
+ System.out.println(databaseName + " was shutted down.");
+
+ }
+
+
+ private static void createTestTable(Connection conn)
+ throws SQLException{
+
+ Statement st = null;
+
+ try{
+ st = conn.createStatement();
+ st.execute( "create table " +
+ "TEST_TABLE " +
+ "( TEST_COL integer )" );
+
+ }finally{
+ if(st != null){
+ st.close();
+ st = null;
+ }
+ }
+ }
+
+
+ private static void insertIntoTestTable(Connection conn,
+ int val)
+ throws SQLException {
+
+ PreparedStatement st = null;
+
+ try{
+ st = conn.prepareStatement( "insert into " +
+ "TEST_TABLE " +
+ "( TEST_COL ) " +
+ "values( ? )" );
+ st.setInt(1,val);
+ st.execute();
+
+ }finally{
+ if(st != null){
+ st.close();
+ st = null;
+ }
+ }
+ }
+
+
+ private static void insertIntoTestTable(Connection conn,
+ int initialval,
+ int count)
+ throws SQLException {
+
+ for( int i = initialval ;
+ i < initialval + count ;
+ i ++ ){
+
+ insertIntoTestTable(conn, i );
+
+ }
+
+ }
+
+
+ private static void countRowInTestTable(Connection conn)
+ throws SQLException {
+
+ Statement st = null;
+ ResultSet rs = null;
+
+ try{
+ st = conn.createStatement();
+ rs = st.executeQuery( "select " +
+ "count(*) " +
+ "from " +
+ "TEST_TABLE " );
+
+ rs.next();
+ System.out.println(rs.getInt(1));
+
+ }finally{
+
+ if(rs != null){
+ rs.close();
+ rs = null;
+ }
+
+ if(st != null){
+ st.close();
+ st = null;
+ }
+
+ }
+ }
+
+
+ private static void verifyShutdownError(SQLException e)
+ throws SQLException{
+
+ if(!isShutdownError(e))
+ throw e;
+
+ System.err.println("SQLException of shutting down was found.");
+
+ }
+
+
+ private static boolean isShutdownError(SQLException e){
+ return e.getSQLState().equals(StandardException.getSQLStateFromIdentifier(SQLState.SHUTDOWN_DATABASE));
+ }
+
+
+}