StressTest.java revision 79870d81001ab3dc70b3bce7dfcca70153a3a14f
1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* 2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * you may not use this file except in compliance with the License. 6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * You may obtain a copy of the License at 7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See the License for the specific language governing permissions and 14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * limitations under the License. 15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage tests.java.sql; 18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport dalvik.annotation.TestTargetClass; 20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport dalvik.annotation.TestTargets; 21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport dalvik.annotation.TestLevel; 22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport dalvik.annotation.TestTargetNew; 23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.sql.Connection; 25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.sql.DatabaseMetaData; 26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.sql.Driver; 27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.sql.PreparedStatement; 28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.sql.ResultSet; 29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.sql.SQLException; 30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.sql.Statement; 31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Properties; 32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Vector; 33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.logging.Level; 34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.logging.Logger; 35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport tests.support.DatabaseCreator; 37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport tests.support.Support_SQL; 38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport tests.support.ThreadPool; 39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport junit.framework.TestCase; 40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project@TestTargetClass(Statement.class) 42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class StressTest extends TestCase { 43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Vector<Connection> vc = new Vector<Connection>(); 44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static Connection conn; 46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static Statement statement; 48c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann 49c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann public void setUp() throws Exception { 5079870d81001ab3dc70b3bce7dfcca70153a3a14fUrs Grob super.setUp(); 51c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann Support_SQL.loadDriver(); 52c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann conn = Support_SQL.getConnection(); 53c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann statement = conn.createStatement(); 54c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann createTestTables(); 55c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann vc.clear(); 56c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann } 57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 58c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann protected void tearDown() throws Exception { 59c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann closeConnections(); 60c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann statement.close(); 61c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann conn.close(); 62c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann super.tearDown(); 63c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann } 64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 65c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann private void createTestTables() { 66c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann try { 67c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann DatabaseMetaData meta = conn.getMetaData(); 68c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann ResultSet userTab = meta.getTables(null, null, null, null); 69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 70c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann while (userTab.next()) { 71c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann String tableName = userTab.getString("TABLE_NAME"); 72c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann if (tableName.equals(DatabaseCreator.TEST_TABLE2)) { 73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project statement.execute(DatabaseCreator.DROP_TABLE2); 74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 76c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann statement.execute(DatabaseCreator.CREATE_TABLE2); 77c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann } catch (SQLException sql) { 78c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann fail("Unexpected SQLException " + sql.toString()); 79c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann } 80c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann return; 81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 83c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann private void dropTestTables() { 84c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann try { 85c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann statement.execute(DatabaseCreator.DROP_TABLE2); 86c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann } catch (SQLException sql) { 87c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann fail("Unexpected SQLException " + sql.toString()); 88c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann } 89c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann return; 90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 91c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann 92c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann// /** 93c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann// * @see junit.framework.TestCase#setUp() 94c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann// */ 95c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann// @Override 96c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann// protected void setUp() throws Exception { 97c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann// super.setUp(); 98c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann// vc.clear(); 99c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann// } 100c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann// 101c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann// /** 102c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann// * @see junit.framework.TestCase#tearDown() 103c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann// */ 104c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann// @Override 105c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann// protected void tearDown() throws Exception { 106c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann// closeConnections(); 107c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann// statement.execute("DELETE FROM " + DatabaseCreator.TEST_TABLE2); 108c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann// super.tearDown(); 109c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann// } 110c02ce7cca7338064f937c86fae7b019728911525Jorg Pleumann 111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @tests StressTest#testManyConnectionsUsingOneThread(). Create many 113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * connections to the DataBase using one thread. 114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @TestTargetNew( 116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project level = TestLevel.PARTIAL_COMPLETE, 117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project method = "connect", 118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project clazz = Driver.class, 119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project args = {String.class, Properties.class} 120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ) 121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void testManyConnectionsUsingOneThread() { 122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int maxConnections = getConnectionNum(); 124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project openConnections(maxConnections); 125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertEquals("Incorrect number of created connections", 126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project maxConnections, vc.size()); 127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (Exception e) { 128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Unexpected Exception " + e.toString()); 129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @tests StressTest#testManyConnectionsUsingManyThreads(). Create many 134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * connections to the DataBase using some threads. 135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @TestTargetNew( 137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project level = TestLevel.PARTIAL_COMPLETE, 138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project notes = "Stress test: Create many connections to the DataBase using some threads", 139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project method = "connect", 140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project clazz = Driver.class, 141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project args = {String.class, Properties.class} 142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ) 143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void testManyConnectionsUsingManyThreads() { 144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int numTasks = getConnectionNum(); 145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ThreadPool threadPool = new ThreadPool(numTasks); 147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // run example tasks 149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (int i = 0; i < numTasks; i++) { 150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project threadPool.runTask(createTask(i)); 151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // close the pool and wait for all tasks to finish. 153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project threadPool.join(); 154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertEquals("Unable to create a connection", numTasks, vc.size()); 155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (numTasks != Support_SQL.sqlMaxConnections) { 156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // try to create connection n + 1 158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Connection c = Support_SQL.getConnection(); 159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project c.close(); 160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("It is possible to create more than " + numTasks 161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project + "connections"); 162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (SQLException sql) { 163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // expected 164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @tests StressTest#testInsertOfManyRowsUsingOneThread(). Insert a lot of 170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * records to the Database using a maximum number of connections. 171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @TestTargetNew( 173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project level = TestLevel.PARTIAL_COMPLETE, 174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project method = "connect", 175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project clazz = Driver.class, 176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project args = {String.class, Properties.class} 177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ) 178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void testInsertOfManyRowsUsingOneThread() { 179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Logger.global 181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project .info("java.sql stress test: single thread and many operations."); 182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int maxConnections = getConnectionNum(); 183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Logger.global.info("Opening " + maxConnections + " to database " 184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project + Support_SQL.getFilename()); 185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project openConnections(maxConnections); 186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int tasksPerConnection = Support_SQL.sqlMaxTasks / maxConnections; 188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Logger.global.info("TasksPerConnection = " + Support_SQL.sqlMaxTasks 189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project + " by (maxConnections) " + maxConnections + " = " 190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project + tasksPerConnection); 191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int pk = 1; 192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (int i = 0; i < vc.size(); ++i) { 193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Logger.global.info(" creating " + tasksPerConnection 194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project + "tasks for Connection " + i); 195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Connection c = vc.elementAt(i); 196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (int j = 0; j < tasksPerConnection; ++j) { 197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project insertNewRecord(c, pk++); 198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ResultSet rs = statement 202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project .executeQuery("SELECT COUNT(*) as counter FROM " 203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project + DatabaseCreator.TEST_TABLE2); 204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertTrue("RecordSet is empty", rs.next()); 205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertEquals("Incorrect number of records", tasksPerConnection 206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * maxConnections, rs.getInt("counter")); 207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project rs.close(); 208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (SQLException sql) { 209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Unexpected SQLException " + sql.toString()); 210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @tests 216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @TestTargetNew( 218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project level = TestLevel.PARTIAL_COMPLETE, 219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project method = "connect", 220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project clazz = Driver.class, 221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project args = {String.class, Properties.class} 222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ) 223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void testInsertOfManyRowsUsingManyThreads() { 224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Logger.global.info("java.sql stress test: multiple threads and many operations."); 225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int numConnections = getConnectionNum(); 227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int tasksPerConnection = Support_SQL.sqlMaxTasks / numConnections; 228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Logger.global.info("Opening "+numConnections+" to database "+Support_SQL.getFilename()); 230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ThreadPool threadPool = new ThreadPool(numConnections); 232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (int i = 0; i < numConnections; ++i) { 234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Logger.global.info(" creating "+tasksPerConnection+ " tasks for Connection "+i); 235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project threadPool.runTask(insertTask(numConnections, i)); 236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // close the pool and wait for all tasks to finish. 238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project threadPool.join(); 239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertEquals("Unable to create a connection", numConnections, vc.size()); 240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ResultSet rs = statement 243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project .executeQuery("SELECT COUNT(*) as counter FROM " 244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project + DatabaseCreator.TEST_TABLE2); 245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertTrue("RecordSet is empty", rs.next()); 246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertEquals("Incorrect number of records", tasksPerConnection 249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * numConnections, rs.getInt("counter")); 250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project rs.close(); 251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (SQLException sql) { 252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Unexpected SQLException " + sql.toString()); 253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private int getConnectionNum() { 259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int num = Support_SQL.sqlMaxConnections; 260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int mc = conn.getMetaData().getMaxConnections(); 262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (mc != 0) { 263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (num != mc) { 264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project System.err.println("Will be used no more than " + mc 265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project + " connections to the DataBase"); 266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project num = mc; 268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (SQLException sql) { 270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Unexpected SQLException " + sql.toString()); 271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return num; 273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private void openConnections(int maxConnections) { 276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int i = 0; 277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (; i < maxConnections; ++i) { 279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Connection c = Support_SQL.getConnection(); 280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (c == null) { 281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertEquals("Unable to create a connection", 282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project maxConnections, i); 283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project vc.add(c); 285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (SQLException sql) { 287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertEquals("Unable to create a connection", maxConnections, i); 288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return; 290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private void closeConnections() { 293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int i = 0; 294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (; i < vc.size(); ++i) { 296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project vc.elementAt(i).close(); 297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (SQLException sql) { 299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertEquals("Unable to close a connection", vc.size(), i); 300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return; 302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private Runnable createTask(final int taskID) { 305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new Runnable() { 306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void run() { 307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Connection c = Support_SQL.getConnection(); 309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (c == null) { 310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return; 311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (this) { 313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project vc.add(c); 314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (SQLException sql) { 316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // nothing to do 317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project }; 320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private Runnable insertTask(final int numConnections, final int taskID) { 323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new Runnable() { 324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void run() { 325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Connection c = Support_SQL.getConnection(); 327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (c == null) { 328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return; 329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (this) { 331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project vc.add(c); 332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int tasksPerConnection = Support_SQL.sqlMaxTasks 334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project / numConnections; 335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (int i = 0; i < tasksPerConnection; ++i) { 336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project insertNewRecord(c, (i + 1) + tasksPerConnection 337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * taskID); 338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (SQLException sql) { 340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // do nothing 341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project }; 344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private void insertNewRecord(Connection c, int pk) { 347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String query = "INSERT INTO " + DatabaseCreator.TEST_TABLE2 348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project + "(finteger, ftext, fcharacter, fdecimal, fnumeric," 349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project + " fsmallint, ffloat, freal, fdouble, fdate, ftime)" 350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project + " VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; 351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project PreparedStatement ps = c.prepareStatement(query); 353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ps.setInt(1, pk); 354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ps.setString(2, "text"); 355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ps.setString(3, "chr"); 356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ps.setFloat(4, 0.1f); 357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ps.setFloat(5, 0.2f); 358adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ps.setShort(6, (short) 3); 359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ps.setFloat(7, 0.4f); 360adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ps.setDouble(8, 0.5); 361adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ps.setDouble(9, 0.6); 362adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ps.setDate(10, new java.sql.Date(System.currentTimeMillis())); 363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ps.setTime(11, new java.sql.Time(System.currentTimeMillis())); 364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ps.execute(); 365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ps.close(); 366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (SQLException sql) { 367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("Unexpected SQLException " + sql.toString()); 368adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 369adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return; 370adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 371adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 372