new Error().printStackTrace();
org.h2.command.dml.Insert.update()
=> org.h2.command.dml.Insert.insertRows()
org.h2.command.dml.Insert.addRow(Expression[])
org.h2.command.dml.Insert.prepare()
org.h2.command.dml.Insert.update()
org.h2.command.dml.Insert.insertRows()
=> org.h2.table.RegularTable.addRow(Session, Row)
假设:
CREATE TABLE TEST(ID INT PRIMARY KEY, NAME VARCHAR(255))
对于insert sql
INSERT INTO TEST(ID, NAME) VALUES(3000, 'aaa')
第1步
//解析insert sql,得到列名,如:[ID, NAME]
org.h2.command.dml.Insert.setColumns(Column[])
java.lang.Error
at org.h2.command.dml.Insert.setColumns(Insert.java:62)
at org.h2.command.Parser.parseInsert(Parser.java:968)
at org.h2.command.Parser.parsePrepared(Parser.java:375)
at org.h2.command.Parser.parse(Parser.java:279)
at org.h2.command.Parser.parse(Parser.java:251)
at org.h2.command.Parser.prepareCommand(Parser.java:217)
at org.h2.engine.Session.prepareLocal(Session.java:415)
at org.h2.server.TcpServerThread.process(TcpServerThread.java:253)
at org.h2.server.TcpServerThread.run(TcpServerThread.java:149)
at java.lang.Thread.run(Unknown Source)
第2步
//解析insert sql,得到列值,如:[3000, 'aaa']
org.h2.command.dml.Insert.addRow(Expression[])
java.lang.Error
at org.h2.command.dml.Insert.addRow(Insert.java:75)
at org.h2.command.Parser.parseInsert(Parser.java:993)
at org.h2.command.Parser.parsePrepared(Parser.java:375)
at org.h2.command.Parser.parse(Parser.java:279)
at org.h2.command.Parser.parse(Parser.java:251)
at org.h2.command.Parser.prepareCommand(Parser.java:217)
at org.h2.engine.Session.prepareLocal(Session.java:415)
at org.h2.server.TcpServerThread.process(TcpServerThread.java:253)
at org.h2.server.TcpServerThread.run(TcpServerThread.java:149)
at java.lang.Thread.run(Unknown Source)
第3步
org.h2.command.dml.Insert.prepare()
java.lang.Error
at org.h2.command.dml.Insert.prepare(Insert.java:215)
at org.h2.command.Parser.prepareCommand(Parser.java:218)
at org.h2.engine.Session.prepareLocal(Session.java:415)
at org.h2.server.TcpServerThread.process(TcpServerThread.java:253)
at org.h2.server.TcpServerThread.run(TcpServerThread.java:149)
at java.lang.Thread.run(Unknown Source)
第4步
org.h2.command.dml.Insert.update()
java.lang.Error
at org.h2.command.dml.Insert.update(Insert.java:79)
at org.h2.command.CommandContainer.update(CommandContainer.java:75)
at org.h2.command.Command.executeUpdate(Command.java:230)
at org.h2.server.TcpServerThread.process(TcpServerThread.java:328)
at org.h2.server.TcpServerThread.run(TcpServerThread.java:149)
at java.lang.Thread.run(Unknown Source)
org.h2.table.RegularTable.addRow(Session, Row)
org.h2.index.PageDataIndex.add(Session, Row)
org.h2.index.PageDataIndex.addTry(Session, Row)
org.h2.index.PageDataLeaf.addRowTry(Row)
在PageDataLeaf中的org.h2.index.PageData.keys 存放key
在org.h2.index.PageDataLeaf.rows中存放多行数据
每个PageDataLeaf被放入org.h2.store.PageStore.cache中
在org.h2.store.PageStore.writeBack()中把每个PageDataLeaf的内容写回硬盘。
java.lang.Error
at org.h2.util.CacheLRU.addToFront(CacheLRU.java:225)
at org.h2.util.CacheLRU.update(CacheLRU.java:127)
at org.h2.store.PageStore.update(PageStore.java:1059)
at org.h2.index.PageDataLeaf.addRowTry(PageDataLeaf.java:206)
at org.h2.index.PageDataIndex.addTry(PageDataIndex.java:167)
at org.h2.index.PageDataIndex.add(PageDataIndex.java:130)
at org.h2.table.RegularTable.addRow(RegularTable.java:121)
at org.h2.command.dml.Insert.insertRows(Insert.java:124)
at org.h2.command.dml.Insert.update(Insert.java:84)
at org.h2.command.CommandContainer.update(CommandContainer.java:75)
at org.h2.command.Command.executeUpdate(Command.java:230)
at org.h2.server.TcpServerThread.process(TcpServerThread.java:328)
at org.h2.server.TcpServerThread.run(TcpServerThread.java:149)
at java.lang.Thread.run(Unknown Source)
java.lang.Exception
at org.h2.index.PageDataNode.create(PageDataNode.java:66)
at org.h2.index.PageDataIndex.addTry(PageDataIndex.java:181)
at org.h2.index.PageDataIndex.add(PageDataIndex.java:130)
at org.h2.table.RegularTable.addRow(RegularTable.java:121)
at org.h2.command.dml.Insert.insertRows(Insert.java:124)
at org.h2.command.dml.Insert.update(Insert.java:84)
at org.h2.command.CommandContainer.update(CommandContainer.java:75)
at org.h2.command.Command.executeUpdate(Command.java:230)
at org.h2.server.TcpServerThread.process(TcpServerThread.java:328)
at org.h2.server.TcpServerThread.run(TcpServerThread.java:149)
at java.lang.Thread.run(Unknown Source)
java.lang.Error
at org.h2.index.PageDataLeaf.write(PageDataLeaf.java:456)
at org.h2.store.PageStore.writeBack(PageStore.java:1009)
at org.h2.store.PageStore.writeBack(PageStore.java:412)
at org.h2.store.PageStore.checkpoint(PageStore.java:430)
at org.h2.engine.Database.closeOpenFilesAndUnlock(Database.java:1196)
at org.h2.engine.Database.close(Database.java:1149)
at org.h2.engine.Database.removeSession(Database.java:1028)
at org.h2.engine.Session.close(Session.java:563)
at org.h2.server.TcpServerThread.closeSession(TcpServerThread.java:175)
at org.h2.server.TcpServerThread.process(TcpServerThread.java:270)
at org.h2.server.TcpServerThread.run(TcpServerThread.java:149)
at java.lang.Thread.run(Unknown Source)
第一次建完表后会首选创建一个root PageDataLeaf
见org.h2.index.PageDataIndex.PageDataIndex(RegularTable, int, IndexColumn[], IndexType, boolean, Session)
if (create) {
rootPageId = store.allocatePage();
store.addMeta(this, session);
PageDataLeaf root = PageDataLeaf.create(this, rootPageId, PageData.ROOT);
store.update(root);
建立PageDataLeaf时会先写头,此时checksum还没有,还是0
PageDataLeaf放入org.h2.store.PageStore.cache