I have around 100M row in each tables/views and loading from MySQL. I 
cannot use link table as it is too slow(mentioned in earlier thread).
So I am loading myself by simple select and insert using prepared statement 
and batch.

I am committing every 100000,  Here is the part of database load.

while (mySqLRS.next()) {

                for (int j = 1; j <= meta.getColumnCount(); j++) {
                    final int type = meta.getColumnType(j);

                    switch (type) {
                    case Types.TIMESTAMP:
                        Timestamp timestamp = null;
                        try {
                            timestamp = mySqLRS.getTimestamp(j);
                        } catch (final Exception ex) {
                            logger.error("Error from :" + 
currentMySQLSelect, ex);
                        } finally {
                            memDBPrepStmt.setTimestamp(j, timestamp);
                        }
                        break;
                    case Types.DATE:
                        Date date = null;
                        try {
                            date = mySqLRS.getDate(j);
                        } catch (final Exception ex) {
                            logger.error("Error from :" + 
currentMySQLSelect, ex);
                        } finally {
                            memDBPrepStmt.setDate(j, date);
                        }
                        break;
                    case Types.DECIMAL:
                        BigDecimal decimal = mySqLRS.getBigDecimal(j);
                        if(decimal != null)
                            decimal = 
(BigDecimal)objectPool.getObject(decimal);
                        memDBPrepStmt.setBigDecimal(j, decimal);
                        break;
                    case Types.BIGINT:
                        Long ll = mySqLRS.getLong(j);
                        ll = (Long)objectPool.getObject(ll);
                        memDBPrepStmt.setLong(j, ll);
                        break;
                    case Types.INTEGER:
                        if (memMeta.getColumnType(j) == Types.SMALLINT) {
                            Short s = mySqLRS.getShort(j);
                            s = (Short)objectPool.getObject(s);
                            memDBPrepStmt.setShort(j, s);
                        } else {
                            Integer ii = mySqLRS.getInt(j);
                            ii = (Integer)objectPool.getObject(ii);
                            memDBPrepStmt.setInt(j, ii);
                        }
                        break;
                    case Types.SMALLINT:
                        Short s = mySqLRS.getShort(j);
                        s = (Short)objectPool.getObject(s);
                        memDBPrepStmt.setShort(j, s);
                        break;
                    case Types.BIT:
                        final int bit = mySqLRS.getInt(j);
                        memDBPrepStmt.setBoolean(j, bit == 1);
                        break;
                    case Types.TINYINT:
                        break;
                    case java.sql.Types.BOOLEAN:
                        final boolean bool = mySqLRS.getBoolean(j);
                        memDBPrepStmt.setBoolean(j, bool);
                        break;
                    case java.sql.Types.CHAR:
                    case java.sql.Types.VARCHAR:
                    case java.sql.Types.LONGVARCHAR:
                        String value = mySqLRS.getString(j);
                        if(value != null)
                            value = (String)objectPool.getObject(value);

                        memDBPrepStmt.setString(j, value);
                        break;
                    default:
                        value = mySqLRS.getString(j);
                        if(value != null)
                            value = (String)objectPool.getObject(value);
                        memDBPrepStmt.setString(j, value);
                    }
                }

                i++;
                memDBPrepStmt.addBatch();

                if (i % 100000 == 0) {
                    memDBPrepStmt.executeBatch();
                }
            }

            if (i % 10000 != 0) {
                memDBPrepStmt.executeBatch();
                i = 0;
            }
            DbUtils.closeQuietly(memDBPrepStmt);
            memDBStmt = memDBConn.createStatement();
            memDBRS = memDBStmt.executeQuery("select count(0) from " + 
memoryTable.getMemoryTableName());
            if (memDBRS.next()) {
                logger.info(memDBRS.getInt(1) + " row(s) loaded into " + 
memoryTable.getMemoryTableName() + " table.");
            }
            DbUtils.closeQuietly(memDBRS);

        } catch (final Exception e) {
            logger.error("Exception connecting to database:" + 
e.getMessage(), e);
            e.printStackTrace();
        } finally {
            DbUtils.closeQuietly(mySQLStmt);
            DbUtils.closeQuietly(mySQLConn);
            DbUtils.closeQuietly(memDBRS);
            DbUtils.closeQuietly(memDBStmt);
            DbUtils.closeQuietly(memDBPrepStmt);
            DbUtils.closeQuietly(memDBConn);
        }
On Saturday, June 28, 2014 8:34:15 PM UTC-7, Vishwa wrote:
>
> I have been getting this exception on 1.4.178 and 1.4.179.
> Problem still persist on latest release
> No issue with older version 1.3.176.
>
> I am using these options on database url-: 
> DB_CLOSE_DELAY=-1;MULTI_THREADED=1;MODE=MYSQL;CACHE_SIZE=1073741824;PAGE_SIZE=32768;CACHE_TYPE=SOFT_LRU;
>
> I can use older version, but i thought newer version performance will 
> better.
>
> 2014-06-28 19:36:15,701 ERROR [Job Manager 45] 
> b.t.i.d.m.MemoryDatabaseLoader [MemoryDatabaseLoader.java:449] Exception 
> connecting to database:General error: "java.lang.IndexOutOfBoundsException: 
> Index: 1, Size: 1"; SQL statement:
> insert into exr(currencycodefrom,currencycodeto,monthyearvalidfor,rate) 
> values (?,?,?,?) [50000-179]
> org.h2.jdbc.JdbcBatchUpdateException: General error: 
> "java.lang.IndexOutOfBoundsException: Index: 1, Size: 1"; SQL statement:
> insert into exr(currencycodefrom,currencycodeto,monthyearvalidfor,rate) 
> values (?,?,?,?) [50000-179]
>         at 
> org.h2.jdbc.JdbcPreparedStatement.executeBatch(JdbcPreparedStatement.java:1198)
>  
> ~[h2-1.4.179.jar:1.4.179]
>         at 
> com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeBatch(NewProxyPreparedStatement.java:2465)
>  
> ~[c3p0-0.9.5-pre8.jar:0.9.5-pre8]
>         at 
> biz.tradescape.ingestion.database.memory.MemoryDatabaseLoader.loadSingleTable(MemoryDatabaseLoader.java:432)
>  
> [h2server.jar:na]
>         at 
> biz.tradescape.ingestion.database.memory.MemoryDatabaseLoader.access$1(MemoryDatabaseLoader.java:313)
>  
> [h2server.jar:na]
>         at 
> biz.tradescape.ingestion.database.memory.MemoryDatabaseLoader$1.run(MemoryDatabaseLoader.java:80)
>  
> ~[h2server.jar:na]
>         at 
> java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) 
> ~[na:1.7.0_25]
>         at 
> java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334) 
> ~[na:1.7.0_25]
>         at java.util.concurrent.FutureTask.run(FutureTask.java:166) 
> ~[na:1.7.0_25]
>         at 
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
>  
> ~[na:1.7.0_25]
>         at 
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
>  
> ~[na:1.7.0_25]
>         at java.lang.Thread.run(Thread.java:724) ~[na:1.7.0_25]
> org.h2.jdbc.JdbcBatchUpdateException: General error: 
> "java.lang.IndexOutOfBoundsException: Index: 1, Size: 1"; SQL statement:
> insert into exr(currencycodefrom,currencycodeto,monthyearvalidfor,rate) 
> values (?,?,?,?) [50000-179]
>         at 
> org.h2.jdbc.JdbcPreparedStatement.executeBatch(JdbcPreparedStatement.java:1198)
>         at 
> com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeBatch(NewProxyPreparedStatement.java:2465)
>         at 
> biz.tradescape.ingestion.database.memory.MemoryDatabaseLoader.loadSingleTable(MemoryDatabaseLoader.java:432)
>         at 
> biz.tradescape.ingestion.database.memory.MemoryDatabaseLoader.access$1(MemoryDatabaseLoader.java:313)
>         at 
> biz.tradescape.ingestion.database.memory.MemoryDatabaseLoader$1.run(MemoryDatabaseLoader.java:80)
>         at 
> java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
>         at 
> java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
>         at java.util.concurrent.FutureTask.run(FutureTask.java:166)
>         at 
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
>         at 
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
>         at java.lang.Thread.run(Thread.java:724)
> org.h2.jdbc.JdbcSQLException: General error: 
> "java.lang.IndexOutOfBoundsException: Index: 1, Size: 1"; SQL statement:
> insert into exr(currencycodefrom,currencycodeto,monthyearvalidfor,rate) 
> values (?,?,?,?) [50000-179]
>         at 
> org.h2.message.DbException.getJdbcSQLException(DbException.java:345)
>         at org.h2.message.DbException.get(DbException.java:168)
>         at org.h2.message.DbException.convert(DbException.java:295)
>         at org.h2.mvstore.db.MVTable.addRow(MVTable.java:614)
>         at org.h2.command.dml.Insert.insertRows(Insert.java:156)
>         at org.h2.command.dml.Insert.update(Insert.java:114)
>         at org.h2.command.CommandContainer.update(CommandContainer.java:78)
>         at org.h2.command.Command.executeUpdate(Command.java:253)
>         at 
> org.h2.jdbc.JdbcPreparedStatement.executeUpdateInternal(JdbcPreparedStatement.java:157)
>         at 
> org.h2.jdbc.JdbcPreparedStatement.executeBatch(JdbcPreparedStatement.java:1183)
>         at 
> com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeBatch(NewProxyPreparedStatement.java:2465)
>         at 
> biz.tradescape.ingestion.database.memory.MemoryDatabaseLoader.loadSingleTable(MemoryDatabaseLoader.java:432)
>         at 
> biz.tradescape.ingestion.database.memory.MemoryDatabaseLoader.access$1(MemoryDatabaseLoader.java:313)
>         at 
> biz.tradescape.ingestion.database.memory.MemoryDatabaseLoader$1.run(MemoryDatabaseLoader.java:80)
>         at 
> java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
>         at 
> java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
>         at java.util.concurrent.FutureTask.run(FutureTask.java:166)
>         at 
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
>         at 
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
>         at java.lang.Thread.run(Thread.java:724)
> Caused by: java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
>         at java.util.ArrayList.rangeCheck(ArrayList.java:604)
>         at java.util.ArrayList.get(ArrayList.java:382)
>         at org.h2.mvstore.MVMap.openVersion(MVMap.java:1166)
>         at org.h2.mvstore.MVStore.storeNow(MVStore.java:972)
>         at org.h2.mvstore.MVStore.commitAndSave(MVStore.java:907)
>         at org.h2.mvstore.MVStore.beforeWrite(MVStore.java:2102)
>         at org.h2.mvstore.MVMap.beforeWrite(MVMap.java:1040)
>         at org.h2.mvstore.MVMapConcurrent.put(MVMapConcurrent.java:43)
>         at org.h2.mvstore.MVMap.putIfAbsent(MVMap.java:574)
>         at 
> org.h2.mvstore.db.TransactionStore$TransactionMap.trySet(TransactionStore.java:1089)
>         at 
> org.h2.mvstore.db.TransactionStore$TransactionMap.set(TransactionStore.java:1011)
>         at 
> org.h2.mvstore.db.TransactionStore$TransactionMap.put(TransactionStore.java:989)
>         at 
> org.h2.mvstore.db.MVSecondaryIndex.add(MVSecondaryIndex.java:209)
>         at org.h2.mvstore.db.MVTable.addRow(MVTable.java:610)
>         ... 16 more
>
>

-- 
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 [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/h2-database.
For more options, visit https://groups.google.com/d/optout.

Reply via email to