Hi Thomas,
It wasn't easy, but I've got some code that seems to reliably
reproduce the problem. This will typically crash either around 35,000
inserts or 85,000 inserts. There are a couple of different exceptions
I see, but most recently it was this:
i = 36927
Exception in thread "main" org.h2.jdbc.JdbcSQLException: General
error: java.lang.NullPointerException; SQL statement:
insert into gameplayersummary (gameid, playerid, playername,
seatnumber, stakelevelid, positionid, tournamentid, gametypeid,
tableid, tablename, dayid, isplaymoney, istournament, isHero,
startTime, tableSize, takeInCents, takeInBigBlinds, downcard1,
downcard2, handType, numPlayersSittingIn, timesseen, flopseen, vpip,
preflopraised, postflopbet, postflopcalled, postflopfolded,
postflopraised, postflopBetOrRaised,
postFlopCallFoldBetOrRaise,blindStealAttempt,
blindStealAttemptOpportunity, checkRaised, wentToShowdown,
wonAtShowdown, wonWithoutShowdown, threeBetPreflop,
threeBetPreflopOpportunity,blindStealDefenseOpportunityOnBigBlind,
calledPreflopRaise,
calledPreflopRaiseOpportunity,continuationBetPreflop,
continuationBetPreflopOpportunity,foldedToBlindStealOnBigBlind,
foldedToContinuationBet, foldedToContinuationBetOpportunity,
foldedToPreflopThreeBet, foldedToPreflopThreeBetOpportunity) values
(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,
?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
[50000-116]
at org.h2.message.Message.getSQLException(Message.java:105)
at org.h2.message.Message.convert(Message.java:274)
at org.h2.table.TableData.addRow(TableData.java:140)
at org.h2.command.dml.Insert.update(Insert.java:101)
at org.h2.command.CommandContainer.update(CommandContainer.java:72)
at org.h2.command.Command.executeUpdate(Command.java:208)
at org.h2.jdbc.JdbcPreparedStatement.executeUpdateInternal
(JdbcPreparedStatement.java:140)
at org.h2.jdbc.JdbcPreparedStatement.executeUpdate
(JdbcPreparedStatement.java:129)
at Test.insert(Test.java:159)
at Test.main(Test.java:72)
Caused by: java.lang.NullPointerException
at org.h2.index.PageBtreeIndex.getRowSize(PageBtreeIndex.java:385)
at org.h2.index.PageBtreeNode.addChild(PageBtreeNode.java:91)
at org.h2.index.PageBtreeNode.split(PageBtreeNode.java:176)
at org.h2.index.PageBtreeNode.addRowTry(PageBtreeNode.java:150)
at org.h2.index.PageBtreeNode.addRowTry(PageBtreeNode.java:141)
at org.h2.index.PageBtreeIndex.add(PageBtreeIndex.java:101)
at org.h2.table.TableData.addRow(TableData.java:122)
... 7 more
This is with h2-1.1.116.jar.
Rgds
Steve
---
import java.sql.*;
import java.util.Date;
import java.util.UUID;
public class Test {
private static final int MAX = 1000000;
public static void main(String[] a)
throws Exception {
Class.forName("org.h2.Driver");
Connection conn = DriverManager.
getConnection("jdbc:h2:~/test;PAGE_STORE=true", "sa",
"");
conn.createStatement().execute("DROP ALL OBJECTS;");
conn.createStatement().execute("CREATE TABLE GamePlayerSummary
(\n" +
" gameid INTEGER NOT NULL , " +
" playerid INTEGER NOT NULL, " +
" playerName varchar(50) NOT NULL, " +
" seatnumber INTEGER NOT NULL, " +
" stakelevelid INTEGER NOT NULL, " +
" positionid INTEGER NOT NULL, " +
" tournamentid INTEGER, " +
" gametypeid INTEGER NOT NULL, " +
" tableid INTEGER NOT NULL, " +
" tablename varchar(50) NOT NULL, " +
" dayid INTEGER NOT NULL, " +
" istournament BOOLEAN, " +
" isplaymoney BOOLEAN, " +
" isHero BOOLEAN, " +
" startTime DATETIME NOT NULL, " +
" tableSize INTEGER, " +
" takeInCents INTEGER, " +
" takeInBigBlinds DOUBLE, " +
" downCard1 INTEGER, " +
" downCard2 INTEGER, " +
" handtype VARCHAR(3), " +
" numPlayersSittingIn INTEGER, " +
" timesseen INTEGER, " +
" flopseen INTEGER, " +
" vpip INTEGER, " +
" preflopraised INTEGER, " +
" postflopbet INTEGER, " +
" postflopraised INTEGER, " +
" postflopcalled INTEGER, " +
" postflopfolded INTEGER, " +
" postflopbetorraised INTEGER, " +
" postFlopCallFoldBetOrRaise INTEGER, " +
" blindStealAttempt INTEGER, " +
" blindStealAttemptOpportunity INTEGER, " +
" checkRaised INTEGER, " +
" wentToShowdown INTEGER, " +
" wonAtShowdown INTEGER, " +
" wonWithoutShowdown INTEGER, " +
" threeBetPreflop INTEGER, " +
" threeBetPreflopOpportunity INTEGER, " +
" blindStealDefenseOpportunityOnBigBlind INTEGER, " +
" calledPreflopRaise INTEGER, " +
" calledPreflopRaiseOpportunity INTEGER, " +
" continuationBetPreflop INTEGER, " +
" continuationBetPreflopOpportunity INTEGER, " +
" foldedToBlindStealOnBigBlind INTEGER, " +
" foldedToContinuationBet INTEGER, " +
" foldedToContinuationBetOpportunity INTEGER, " +
" foldedToPreflopThreeBet INTEGER, " +
" foldedToPreflopThreeBetOpportunity INTEGER, " +
" PRIMARY KEY(gameid, playerid) " +
");");
conn.createStatement().execute(
"create index gameplayersummary_full_idx on
gameplayersummary (playername); ");
for (int i = 0; i < MAX; i++) {
try {
insert(conn, i);
} catch (SQLException e) {
System.err.println("i = " + i);
throw e;
}
}
conn.close();
}
private static void insert(Connection conn, int i) throws
SQLException {
if (i % 1000 == 0) {
System.out.println("i = " + i);
}
final PreparedStatement statement = conn.prepareStatement(
"insert into gameplayersummary " +
"(gameid, playerid, playername, seatnumber,
stakelevelid, " +
"positionid, tournamentid, gametypeid,
tableid, tablename, " +
"dayid, isplaymoney, istournament, isHero,
startTime, " +
"tableSize, takeInCents, takeInBigBlinds,
downcard1, downcard2, " +
"handType, numPlayersSittingIn, timesseen,
flopseen, vpip, " +
"preflopraised, postflopbet, postflopcalled,
postflopfolded, postflopraised, " +
"postflopBetOrRaised,
postFlopCallFoldBetOrRaise,blindStealAttempt,
blindStealAttemptOpportunity, checkRaised, " +
"wentToShowdown, wonAtShowdown,
wonWithoutShowdown, threeBetPreflop, threeBetPreflopOpportunity," +
"blindStealDefenseOpportunityOnBigBlind,
calledPreflopRaise,
calledPreflopRaiseOpportunity,continuationBetPreflop,
continuationBetPreflopOpportunity," +
"foldedToBlindStealOnBigBlind,
foldedToContinuationBet, foldedToContinuationBetOpportunity,
foldedToPreflopThreeBet, foldedToPreflopThreeBetOpportunity)" +
" values
(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,
?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
statement.setInt(1, i);
statement.setInt(2, i);
statement.setString(3, UUID.randomUUID().toString());
statement.setInt(4, i);
statement.setInt(5, i);
statement.setInt(6, i);
statement.setInt(7, i);
statement.setInt(8, i);
statement.setInt(9, i);
statement.setString(10, UUID.randomUUID().toString());
statement.setInt(11, i);
statement.setBoolean(12, true);
statement.setBoolean(13, true);
statement.setBoolean(14, false);
statement.setTimestamp(15, new Timestamp(new Date().getTime
()));
statement.setInt(16, i);
statement.setInt(17, i);
statement.setInt(18, i);
statement.setInt(19, i);
statement.setInt(20, i);
statement.setString(21, "??");
statement.setInt(22, i);
statement.setInt(23, i);
statement.setInt(24, i);
statement.setInt(25, i);
statement.setInt(26, i);
statement.setInt(27, i);
statement.setInt(28, i);
statement.setInt(29, i);
statement.setInt(30, i);
statement.setInt(31, i);
statement.setInt(32, i);
statement.setInt(33, i);
statement.setInt(34, i);
statement.setInt(35, i);
statement.setInt(36, i);
statement.setInt(37, i);
statement.setInt(38, i);
statement.setInt(39, i);
statement.setInt(40, i);
statement.setInt(41, i);
statement.setInt(42, i);
statement.setInt(43, i);
statement.setInt(44, i);
statement.setInt(45, i);
statement.setInt(46, i);
statement.setInt(47, i);
statement.setInt(48, i);
statement.setInt(49, i);
statement.setInt(50, i);
statement.executeUpdate();
statement.close();
}
}
On Jul 23, 9:39 am, Thomas Mueller <[email protected]>
wrote:
> Hi,
>
> > I've been trying the new page store option, on an application that
> > performs around 15 million inserts and updates. Each time I've tried
> > (5 or 6 times) to run the app I get this exception
>
> Could you post a simple, standalone test case that reproduces the
> problem? It would be great if the test case does not have any
> dependencies except the H2 jar file (that is, a simple SQL script that
> can be run in the H2 Console, or a Java class uses the JDBC API and is
> run using a static main method). Please include any initialization
> code (CREATE TABLE, INSERT and so on) in the Java class or in a .sql
> script file.
>
> Regards,
> Thomas
--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---