Wang Peihan
unread,Jul 18, 2011, 2:15:21 AM7/18/11Sign in to reply to author
Sign in to forward
You do not have permission to delete messages in this group
Either email addresses are anonymous for this group or you need the view member email addresses permission to view the original message
to H2 Database
Hi,
I'm developing an Java application using H2, and have encounter a JDBC
exception below:
110718135417.873|WARN,DUMPER|DBAgt.java,BakMibRawAlm,767|0|bak
MIB_RAW_ALM [4000000000008,4000000002108] exception
org.h2.jdbc.JdbcSQLException: General error:
"java.lang.IllegalArgumentException: nanos > 999999999 or < 0"; SQL
statement:
INSERT INTO MIB_RAW_ALM_HIS (SELECT * FROM MIB_RAW_ALM WHERE EVENT_ID
BETWEEN ? AND ?) [50000-157]
at
org.h2.message.DbException.getJdbcSQLException(DbException.java:327)
~[h2-1.3.157.jar:1.3.157]
at org.h2.message.DbException.get(DbException.java:156)
~[h2-1.3.157.jar:1.3.157]
at org.h2.message.DbException.convert(DbException.java:279)
~[h2-1.3.157.jar:1.3.157]
at org.h2.table.RegularTable.addRow(RegularTable.java:148)
~[h2-1.3.157.jar:1.3.157]
at org.h2.command.dml.Insert.addRow(Insert.java:162)
~[h2-1.3.157.jar:1.3.157]
at org.h2.command.dml.Insert.insertRows(Insert.java:137)
~[h2-1.3.157.jar:1.3.157]
at org.h2.command.dml.Insert.update(Insert.java:84)
~[h2-1.3.157.jar:1.3.157]
at
org.h2.command.CommandContainer.update(CommandContainer.java:71)
~[h2-1.3.157.jar:1.3.157]
at org.h2.command.Command.executeUpdate(Command.java:212)
~[h2-1.3.157.jar:1.3.157]
at
org.h2.jdbc.JdbcPreparedStatement.executeUpdateInternal(JdbcPreparedStatement.java:
143) ~[h2-1.3.157.jar:1.3.157]
at
org.h2.jdbc.JdbcPreparedStatement.executeUpdate(JdbcPreparedStatement.java:
129) ~[h2-1.3.157.jar:1.3.157]
at com.hp.snmpagt.edb.DBAgt.BakMibRawAlm(DBAgt.java:758)
~[snmpAgt.jar:na]
at
com.hp.snmpagt.main.MibRawAlmDumper._exec(MibRawAlmDumper.java:125)
[snmpAgt.jar:na]
at
com.hp.snmpagt.main.MibRawAlmDumper.run(MibRawAlmDumper.java:67)
[snmpAgt.jar:na]
at java.lang.Thread.run(Thread.java:619) [na:1.6.0.08]
Caused by: java.lang.IllegalArgumentException: nanos > 999999999 or <
0
at java.sql.Timestamp.setNanos(Timestamp.java:383) ~[na:
1.6.0.08]
at org.h2.store.Data.readValue(Data.java:702) ~[h2-1.3.157.jar:
1.3.157]
at org.h2.index.PageBtreeIndex.readRow(PageBtreeIndex.java:
336) ~[h2-1.3.157.jar:1.3.157]
at org.h2.index.PageBtree.getRow(PageBtree.java:174)
~[h2-1.3.157.jar:1.3.157]
at org.h2.index.PageBtree.find(PageBtree.java:116)
~[h2-1.3.157.jar:1.3.157]
at org.h2.index.PageBtreeLeaf.addRow(PageBtreeLeaf.java:146)
~[h2-1.3.157.jar:1.3.157]
at org.h2.index.PageBtreeLeaf.addRowTry(PageBtreeLeaf.java:
100) ~[h2-1.3.157.jar:1.3.157]
at org.h2.index.PageBtreeNode.addRowTry(PageBtreeNode.java:
200) ~[h2-1.3.157.jar:1.3.157]
at org.h2.index.PageBtreeIndex.addRow(PageBtreeIndex.java:93)
~[h2-1.3.157.jar:1.3.157]
at org.h2.index.PageBtreeIndex.add(PageBtreeIndex.java:84)
~[h2-1.3.157.jar:1.3.157]
at org.h2.table.RegularTable.addRow(RegularTable.java:130)
~[h2-1.3.157.jar:1.3.157]
... 11 common frames omitted
Is it an H2 bug? Is there any workaround?
Table MIB_RAW_ALM's definition:
private static final String _C_TBL_MIB_RAW_ALM = "CREATE TABLE IF NOT
EXISTS MIB_RAW_ALM ("
+ "EVENT_ID LONG NOT NULL, "
+ "COL_TS TIMESTAMP NOT NULL, "
+ "EVENT_TS TIMESTAMP NOT NULL, "
+ "PID VARCHAR(30) NOT NULL, "
+ "TID VARCHAR(50) NOT NULL, "
+ "MODULE VARCHAR(30) NOT NULL, "
+ "INST_NM VARCHAR(30) NOT NULL, "
+ "APP_CD VARCHAR(10) NOT NULL, "
+ "BUSI VARCHAR(10) NOT NULL, "
+ "KPI_FLAG VARCHAR(10) NOT NULL, "
+ "ALM_CODE INTEGER NOT NULL, "
+ "ALM_NM VARCHAR(255) NOT NULL, "
+ "ALM_GRADE INTEGER NOT NULL, "
+ "ALM_TYPE INTEGER NOT NULL, "
+ "ALM_IND VARCHAR(10), "
+ "ALM_CONTENT VARCHAR(2000), "
+ "EXP_ADV VARCHAR(2000), "
+ "PROC_FLAG INTEGER NOT NULL, " + "PROC_INFO VARCHAR(2000))";
private static final String _C_UK1_MIB_RAW_ALM = "CREATE UNIQUE INDEX
IF NOT EXISTS "
+ "UK1_MIB_RAW_ALM ON MIB_RAW_ALM(EVENT_ID)";
private static final String _C_IX1_MIB_RAW_ALM = "CREATE INDEX IF NOT
EXISTS "
+ "IX1_MIB_RAW_ALM ON MIB_RAW_ALM(PROC_FLAG)";
private static final String _C_SEQ_MIB_RAW_ALM = "CREATE SEQUENCE IF
NOT EXISTS SEQ_MIB_RAW_ALM "
+ "START WITH 4000000000000 CACHE 1";
Table MIB_RAW_ALM_HIS for history data backup, almost same schema:
private static final String _C_TBL_MIB_RAW_ALM_HIS = "CREATE TABLE IF
NOT EXISTS MIB_RAW_ALM_HIS ("
+ "EVENT_ID LONG NOT NULL, "
+ "COL_TS TIMESTAMP NOT NULL, "
+ "EVENT_TS TIMESTAMP NOT NULL, "
+ "PID VARCHAR(30) NOT NULL, "
+ "TID VARCHAR(50) NOT NULL, "
+ "MODULE VARCHAR(30) NOT NULL, "
+ "INST_NM VARCHAR(30) NOT NULL, "
+ "APP_CD VARCHAR(10) NOT NULL, "
+ "BUSI VARCHAR(10) NOT NULL, "
+ "KPI_FLAG VARCHAR(10) NOT NULL, "
+ "ALM_CODE INTEGER NOT NULL, "
+ "ALM_NM VARCHAR(255) NOT NULL, "
+ "ALM_GRADE INTEGER NOT NULL, "
+ "ALM_TYPE INTEGER NOT NULL, "
+ "ALM_IND VARCHAR(10), "
+ "ALM_CONTENT VARCHAR(2000), "
+ "EXP_ADV VARCHAR(2000), "
+ "PROC_FLAG INTEGER NOT NULL, " + "PROC_INFO VARCHAR(2000))";
private static final String _C_IX1_MIB_RAW_ALM_HIS = "CREATE INDEX IF
NOT EXISTS "
+ "IX1_MIB_RAW_ALM_HIS ON MIB_RAW_ALM_HIS(EVENT_ID)";
private static final String _C_IX2_MIB_RAW_ALM_HIS = "CREATE INDEX IF
NOT EXISTS "
+ "IX2_MIB_RAW_ALM_HIS ON MIB_RAW_ALM_HIS(EVENT_TS)";
Related Java code:
final private static String _B_MIB_RAW_ALM = "INSERT INTO
MIB_RAW_ALM_HIS ("
+ "SELECT * FROM MIB_RAW_ALM WHERE EVENT_ID BETWEEN ? AND ?)";
final private static String _D_MIB_RAW_ALM = "DELETE FROM MIB_RAW_ALM
"
+ "WHERE EVENT_ID BETWEEN ? AND ?";
public static boolean BakMibRawAlm(long min_alm_id, long max_alm_id)
{
boolean rc_ = true;
Connection conn_ = null;
PreparedStatement stmt_ = null;
try {
conn_ = EDB.GetInstance()._cp.getConnection(); // obtain a
connection from pool
stmt_ = conn_.prepareStatement(_B_MIB_RAW_ALM);
stmt_.setLong(1, min_alm_id);
stmt_.setLong(2, max_alm_id);
stmt_.executeUpdate();
stmt_.close();
stmt_ = conn_.prepareStatement(_D_MIB_RAW_ALM);
stmt_.setLong(1, min_alm_id);
stmt_.setLong(2, max_alm_id);
stmt_.executeUpdate();
conn_.commit();
} catch (Exception e) {
Warn(0, e, "bak MIB_RAW_ALM [%d,%d] exception", min_alm_id,
max_alm_id);
rc_ = false;
} finally {
EDB.CloseHandle(conn_, stmt_, null);
}
return rc_;
}
The above code is OK when backup only several records from MIB_RAW_ALM
to MIB_RAW_ALM_HIS,
but when there are 2000 records, it throws the exception. Any
suggestions?