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