Hello, I wrote a simple case in order to reproduce the problem (doesn't do 
any cleanup).

In the test scenario, the OOM will always happen, when H2 is running the 
group by query on a table with 5 million rows.
What would be the cause? Memory options for the JVM in the test scenario, 
during my testing were -XmX1024m.





    void createTablesForGroupByScenario() throws SQLException {
        String dir = "/path/to/some/dir";
        Integer[] sizes = new Integer[] { 1000, 10_000, 100_000, 1_000_000, 
5_000_000 };

        for (Integer size : sizes) {
            System.out.println("Creating table with size: " + size);

            String name = "group_by_" + size;
            String h2Url = "jdbc:h2:file:" + dir + "/" + name
                    + ";DB_CLOSE_ON_EXIT=FALSE"
                    + ";AUTO_RECONNECT=TRUE"
                    + ";FILE_LOCK=NO"
                    + ";TRACE_LEVEL_FILE=0"
                    + ";TRACE_LEVEL_SYSTEM_OUT=0"
                    + ";LOG=0"
                    + ";UNDO_LOG=0"
                    + ";CACHE_SIZE=" + 65000;

            Connection con = DriverManager.getConnection(h2Url);

            String initSql = "create table result(id bigint, name varchar, 
phone int);\n";
            RunScript.execute(con, new StringReader(initSql));
            con.commit();

            PreparedStatement st = con.prepareStatement("insert into result 
values (?, ?, ?)");
            for (int i = 0; i < size; i++) {
                st.setLong(1, i);
                st.setString(2, "name_" + i);
                st.setInt(3, i);
                st.addBatch();
                if (i % 500 == 0) {
                    st.executeBatch();
                    con.commit();
                }
            }
            st.executeBatch();
            con.commit();
            con.close();
        }
    }


    void forEveryDbCreatedRunGroupByQuery() throws SQLException {
        String dir = "/path/to/some/dir";
        Integer[] sizes = new Integer[] { 1000, 10_000, 100_000, 1_000_000, 
5_000_000 };

        for (Integer size : sizes) {
            System.out.println("Running query for table with size: " + size
);

            String name = "group_by_" + size;
            String h2Url = "jdbc:h2:file:" + dir + "/" + name
                    + ";DB_CLOSE_ON_EXIT=FALSE"
                    + ";AUTO_RECONNECT=TRUE"
                    + ";FILE_LOCK=NO"
                    + ";TRACE_LEVEL_FILE=0"
                    + ";TRACE_LEVEL_SYSTEM_OUT=0"
                    + ";LOG=0"
                    + ";UNDO_LOG=0"
                    + ";CACHE_SIZE=" + 65000;

            Connection con = DriverManager.getConnection(h2Url);

            String sql = "select id, sum(phone) from result group by id;\n";

            long start = System.currentTimeMillis();
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery(sql);

            int processed = 0;
            while (rs.next()) {
                //'fake' result-set processing by just counting the results
                processed++;
            }
            con.close();
            long time = System.currentTimeMillis() - start;
            System.out.println(String.format("Processed %s, time %s ms", 
processed, time));
        }
    }






-- 
You received this message because you are subscribed to the Google Groups "H2 
Database" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to h2-database+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/h2-database/07c5cd18-4c99-497b-a30d-7fab2abcfbba%40googlegroups.com.

Reply via email to