Hi again,

I have created a simple test case (JUnit 4 and H2 must be on the
classpath):

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import org.h2.jdbcx.JdbcConnectionPool;
import org.h2.jdbcx.JdbcDataSource;
import org.junit.BeforeClass;
import org.junit.Test;

public class DatabaseH2PoolTest {

        private static JdbcDataSource ds;
        private static JdbcConnectionPool connectionPool;

        @BeforeClass
        public static void createDatabaseInTemp() {
                ds = new JdbcDataSource();
                
ds.setURL("jdbc:h2:c:/temp/testdatah2;TRACE_LEVEL_SYSTEM_OUT=3");
                ds.setUser("");
                ds.setPassword("");
                connectionPool = JdbcConnectionPool.create(ds);
                connectionPool.setMaxConnections(1);

                createTable();
        }

        private static void createTable() {
                Connection connection = null;
                Statement stat = null;
                try {
                        connection = connectionPool.getConnection();
                        stat = connection.createStatement();
                        // clear
                        stat.execute("DROP INDEX IF EXISTS IX_NODE_PARENT");
                        stat.execute("DROP TABLE IF EXISTS NODE");
                        // new tables
                        stat
                                        .execute("CREATE TABLE IF NOT EXISTS 
NODE(ID INTEGER NOT NULL
AUTO_INCREMENT(2) PRIMARY KEY, ID_PARENT INTEGER NOT NULL, KEY
VARCHAR, VALUE OTHER)");
                        stat.execute("CREATE INDEX IF NOT EXISTS IX_NODE_PARENT 
ON
NODE(ID_PARENT)");
                } catch (Exception e) {
                        throw new RuntimeException("Cannot create tables with 
DDL script",
e);
                } finally {
                        if (stat != null)
                                try {
                                        stat.close();
                                } catch (SQLException e) {
                                        throw new RuntimeException("Cannot 
close statement", e);
                                }
                        if (connection != null) {
                                try {
                                        connection.close();
                                } catch (SQLException e) {
                                        throw new RuntimeException("Cannot 
close connection", e);
                                }
                        }
                }
        }

        @Test
        public void someSelectsOneThreadWith() {
                long time0 = System.nanoTime();
                for (int i = 0; i < 10000; i++) {
                        findNode(i, true);
                }
                long time = System.nanoTime() - time0;
                System.out.println("With pool (ms): " + (time / 1000000));
        }

        @Test
        public void someSelectsOneThreadWithout() {
                long time0 = System.nanoTime();
                for (int i = 0; i < 10000; i++) {
                        findNode(i, false);
                }
                long time = System.nanoTime() - time0;
                System.out.println("Without pool (ms): " + (time / 1000000));
        }

        // dummy method - no result is returned :-)
        public void findNode(int id, boolean usePool) {
                Connection connection = null;
                PreparedStatement stat = null;
                try {
                        if (usePool)
                                connection = connectionPool.getConnection();
                        else
                                connection = ds.getConnection();

                        stat = connection.prepareStatement("SELECT * FROM NODE 
WHERE ID
= ?");
                        stat.setInt(1, id);
                        ResultSet rs = stat.executeQuery();
                        if (rs.next()) {
                                rs.getInt("ID"); // dummy call
                        }
                } catch (Exception e) {
                        throw new RuntimeException("Cannot execute SQL", e);
                } finally {
                        if (stat != null)
                                try {
                                        stat.close();
                                } catch (SQLException e) {
                                        throw new RuntimeException("Cannot 
close statement", e);
                                }
                        if (connection != null) {
                                try {
                                        connection.close();
                                } catch (SQLException e) {
                                        throw new RuntimeException("Cannot 
close connection", e);
                                }
                        }
                }
        }


}

Here is the log for the someSelectsOneThreadWith test (only 2 loops).
Even when the pool is used I can see disconnected/connected messages
in the trace output:

10-20 10:49:33 database: opening C:\TEMP\testdatah2 (build 100)
10-20 10:49:33 fileLock: save {method=file,
id=11d1971e3a38e830b7397db585033cc2c8fd940ea37}
10-20 10:49:33 fileLock: load {method=file,
id=11d1971e3a38e830b7397db585033cc2c8fd940ea37}
10-20 10:49:33 index: open existing SYS rows: 12
10-20 10:49:33 index: open existing NODE rows: 0
10-20 10:49:33 lock: 1 exclusive write lock added for NODE
10-20 10:49:33 lock: 1 exclusive write lock added for SYS
10-20 10:49:33 lock: 1 exclusive write lock unlock NODE
10-20 10:49:33 lock: 1 exclusive write lock unlock SYS
10-20 10:49:33 lock: 1 exclusive write lock added for NODE
10-20 10:49:33 lock: 1 exclusive write lock added for SYS
10-20 10:49:33 lock: 1 exclusive write lock unlock NODE
10-20 10:49:33 lock: 1 exclusive write lock unlock SYS
10-20 10:49:33 lock: 1 exclusive write lock added for NODE
10-20 10:49:33 lock: 1 exclusive write lock unlock NODE
10-20 10:49:33 database: opened C:\TEMP\testdatah2
10-20 10:49:33 session: connecting #2 to C:\TEMP\testdatah2
10-20 10:49:33 jdbc[2]:
/*SQL */SET TRACE_LEVEL_SYSTEM_OUT 3;
10-20 10:49:33 session: connected #2
10-20 10:49:33 jdbc[2]:
/**/Connection conn0 = DriverManager.getConnection("jdbc:h2:c:/temp/
testdatah2;TRACE_LEVEL_SYSTEM_OUT=3", "", "")
10-20 10:49:33 session: connecting #3 to C:\TEMP\testdatah2
10-20 10:49:33 jdbc[3]:
/*SQL */SET TRACE_LEVEL_SYSTEM_OUT 3;
10-20 10:49:33 session: connected #3
10-20 10:49:33 jdbc[3]:
/**/Connection conn1 = DriverManager.getConnection("jdbc:h2:c:/temp/
testdatah2;TRACE_LEVEL_SYSTEM_OUT=3", "", "")
10-20 10:49:33 jdbc[3]:
/**/conn1.close();
10-20 10:49:33 jdbc[3]:
/*SQL */ROLLBACK;
10-20 10:49:33 session: disconnecting #3
10-20 10:49:33 session: disconnected #3
10-20 10:49:33 session: connecting #4 to C:\TEMP\testdatah2
10-20 10:49:33 jdbc[4]:
/*SQL */SET TRACE_LEVEL_SYSTEM_OUT 3;
10-20 10:49:33 session: connected #4
10-20 10:49:33 jdbc[4]:
/**/Connection conn2 = DriverManager.getConnection("jdbc:h2:c:/temp/
testdatah2;TRACE_LEVEL_SYSTEM_OUT=3", "", "")
10-20 10:49:33 jdbc[4]:
/**/Statement stat0 = conn2.createStatement();
10-20 10:49:33 jdbc[4]:
/**/stat0.execute("DROP INDEX IF EXISTS IX_NODE_PARENT");
10-20 10:49:33 lock: 4 exclusive write lock added for SYS
10-20 10:49:33 jdbc[4]:
/*SQL */DROP INDEX IF EXISTS IX_NODE_PARENT;
10-20 10:49:33 lock: 4 exclusive write lock unlock SYS
10-20 10:49:33 jdbc[4]:
/**/stat0.execute("DROP TABLE IF EXISTS NODE");
10-20 10:49:33 lock: 4 exclusive write lock added for NODE
10-20 10:49:33 lock: 4 exclusive write lock added for SYS
10-20 10:49:33 jdbc[4]:
/*SQL */DROP TABLE IF EXISTS NODE;
10-20 10:49:33 lock: 4 exclusive write lock unlock SYS
10-20 10:49:33 jdbc[4]:
/**/stat0.execute("CREATE TABLE IF NOT EXISTS NODE(ID INTEGER NOT NULL
AUTO_INCREMENT(2) PRIMARY KEY, ID_PARENT INTEGER NOT NULL, KEY
VARCHAR, VALUE OTHER)");
10-20 10:49:33 lock: 4 exclusive write lock added for SYS
10-20 10:49:33 index: open existing NODE rows: 0
10-20 10:49:33 lock: 4 exclusive write lock unlock SYS
10-20 10:49:33 lock: 4 exclusive write lock added for NODE
10-20 10:49:33 index: Index PUBLIC.PRIMARY_KEY_2 head consistent=false
10-20 10:49:33 lock: 4 exclusive write lock added for SYS
10-20 10:49:33 jdbc[4]:
/*SQL */CREATE TABLE IF NOT EXISTS NODE(ID INTEGER NOT NULL
AUTO_INCREMENT(2) PRIMARY KEY, ID_PARENT INTEGER NOT NULL, KEY
VARCHAR, VALUE OTHER);
10-20 10:49:33 lock: 4 exclusive write lock unlock NODE
10-20 10:49:33 lock: 4 exclusive write lock unlock SYS
10-20 10:49:33 jdbc[4]:
/**/stat0.execute("CREATE INDEX IF NOT EXISTS IX_NODE_PARENT ON
NODE(ID_PARENT)");
10-20 10:49:33 lock: 4 exclusive write lock added for NODE
10-20 10:49:33 index: Index PUBLIC.IX_NODE_PARENT head
consistent=false
10-20 10:49:33 lock: 4 exclusive write lock added for SYS
10-20 10:49:33 jdbc[4]:
/*SQL */CREATE INDEX IF NOT EXISTS IX_NODE_PARENT ON NODE(ID_PARENT);
10-20 10:49:33 lock: 4 exclusive write lock unlock NODE
10-20 10:49:33 lock: 4 exclusive write lock unlock SYS
10-20 10:49:33 jdbc[4]:
/**/stat0.close();
10-20 10:49:33 jdbc[4]:
/**/conn2.close();
10-20 10:49:33 jdbc[4]:
/*SQL */ROLLBACK;
10-20 10:49:33 session: disconnecting #4
10-20 10:49:33 session: disconnected #4
10-20 10:49:33 session: connecting #5 to C:\TEMP\testdatah2
10-20 10:49:33 jdbc[5]:
/*SQL */SET TRACE_LEVEL_SYSTEM_OUT 3;
10-20 10:49:33 session: connected #5
10-20 10:49:33 jdbc[5]:
/**/Connection conn3 = DriverManager.getConnection("jdbc:h2:c:/temp/
testdatah2;TRACE_LEVEL_SYSTEM_OUT=3", "", "")
10-20 10:49:33 jdbc[5]:
/**/PreparedStatement prep0 = conn3.prepareStatement("SELECT * FROM
NODE WHERE ID = ?");
10-20 10:49:33 jdbc[5]:
/**/prep0.setInt(1, 0);
10-20 10:49:33 jdbc[5]:
/**/ResultSet rs4 = prep0.executeQuery();
10-20 10:49:33 jdbc[5]:
/*SQL l:31*/SELECT * FROM NODE WHERE ID = ? {1: 0};
10-20 10:49:33 jdbc[5]:
/**/rs4.next();
10-20 10:49:33 jdbc[5]:
/**/prep0.close();
10-20 10:49:33 jdbc[5]:
/**/conn3.close();
10-20 10:49:33 jdbc[5]:
/*SQL */ROLLBACK;
10-20 10:49:33 session: disconnecting #5
10-20 10:49:33 session: disconnected #5
10-20 10:49:33 session: connecting #6 to C:\TEMP\testdatah2
10-20 10:49:33 jdbc[6]:
/*SQL */SET TRACE_LEVEL_SYSTEM_OUT 3;
10-20 10:49:33 session: connected #6
10-20 10:49:33 jdbc[6]:
/**/Connection conn4 = DriverManager.getConnection("jdbc:h2:c:/temp/
testdatah2;TRACE_LEVEL_SYSTEM_OUT=3", "", "")
10-20 10:49:33 jdbc[6]:
/**/PreparedStatement prep1 = conn4.prepareStatement("SELECT * FROM
NODE WHERE ID = ?");
10-20 10:49:33 jdbc[6]:
/**/prep1.setInt(1, 1);
10-20 10:49:33 jdbc[6]:
/**/ResultSet rs5 = prep1.executeQuery();
10-20 10:49:33 jdbc[6]:
/*SQL l:31*/SELECT * FROM NODE WHERE ID = ? {1: 1};
10-20 10:49:33 jdbc[6]:
/**/rs5.next();
10-20 10:49:33 jdbc[6]:
/**/prep1.close();
With pool (ms): 34
10-20 10:49:33 database: closing C:\TEMP\testdatah2 from shutdown hook
10-20 10:49:33 session: disconnecting #2
10-20 10:49:33 session: disconnected #2
10-20 10:49:33 session: disconnecting #6
10-20 10:49:33 database: closing C:\TEMP\testdatah2
10-20 10:49:33 index: Index PUBLIC.PRIMARY_KEY_2 head consistent=true
10-20 10:49:33 index: Index PUBLIC.IX_NODE_PARENT head consistent=true
10-20 10:49:33 lock: 1 exclusive write lock added for SYS
10-20 10:49:33 lock: 1 exclusive write lock unlock SYS
10-20 10:49:33 fileLock: load {method=file,
id=11d1971e3a38e830b7397db585033cc2c8fd940ea37}
10-20 10:49:33 database: closed
10-20 10:49:33 session: disconnected #6
10-20 10:49:33 database: closing C:\TEMP\testdatah2
10-20 10:49:33 database: closed

The second interesting thing is the overhead of the connection pool
which is about 30 %:

With pool (ms): 1096
Without pool (ms): 773

This is the output of the test case (tracing was disabled). A
connection is made, simple select with no results is executed and the
connection is closed (is returned to the pool of 1 connection). Then
again .... 10 thousands times.

ps - I can send Eclipse project as an attachement if needed

LZ
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "H2 
Database" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/h2-database?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to