Iakttaganden Från Hsqldb (in Swedish)

  • Uploaded by: Frode Randers
  • 0
  • 0
  • May 2020
  • PDF

This document was uploaded by user and they confirmed that they have the permission to share it. If you are author or own the copyright of this book, please report to us by using this DMCA report form. Report DMCA


Overview

Download & View Iakttaganden Från Hsqldb (in Swedish) as PDF for free.

More details

  • Words: 3,567
  • Pages: 20
Några iakttaganden från HSQLDB 1.8.0 och 1.7.1 Syftet med arbetet är att få ett underlag för beslut kring förväntade problem vid uppgradering av en befintlig HSQLDB-databas. Det är nödvändigt att klarlägga hur HSQLDB beter sig mot disk, vilka filer som nyttas och hur de nyttas. Därmed kan detta ha ett allmänt intresse för den som önskar förstå HSQLDB ur ett black box-perspektiv. Jag har tittat på HSQLDB version 1.8.0 och 1.7.1.

HSQLDB version 1.8.0 Primärminnesdatabas Första försöket är att skapa en ren primärminnesdatabas, dvs utan några filer överhuvudtaget. Jag nyttjar följande JDBC-parametrar: driver=org.hsqldb.jdbcDriver url=jdbc:hsqldb:mem:testdb usr=sa pwd=

Jag kör Jquery och ger följande kommandon: D:\Program Files\jquery>jquery -c hsql-memory.ini JQuery 1.1 Copyright (c) 2004 Lennart Johansson Welcome to JQuery JQuery> CREATE TABLE test_uncached ( JQuery> id INTEGER IDENTITY NOT NULL, JQuery> val VARCHAR(255) NULL, JQuery> PRIMARY KEY(id) JQuery> ); JQuery> go No rows affected or statement was DDL command JQuery> INSERT INTO test_uncached (val) VALUES ('ett'); JQuery> go Rows affected: 1 JQuery> INSERT INTO test_uncached (val) VALUES ('två'); JQuery> go Rows affected: 1 JQuery> SELECT * FROM test_uncached; JQuery> go ID VAL 0 ett 1 två Number of rows: 2

Ännu så länge så har inga filer skapats på disk någonstans. Vi går vidare och begär en checkpoint: JQuery> CHECKPOINT JQuery> go No rows affected or statement was DDL command

Inga filer finns ännu på disk. Vi går vidare och skapar en cachad tabell: JQuery> JQuery> JQuery> JQuery> JQuery> JQuery> No rows

CREATE CACHED TABLE test_cached ( id INTEGER IDENTITY, val VARCHAR(255) NULL, PRIMARY KEY(id) ); go affected or statement was DDL command

Inga filer finns ännu på disk. Vi går vidare och begär en checkpoint: JQuery> CHECKPOINT JQuery> go No rows affected or statement was DDL command

Inga filer finns ännu på disk. Vi går vidare och begär en nerstängning JQuery> SHUTDOWN COMPACT JQuery> go No rows affected or statement was DDL command

Inga filer finns på disk.

Filbaserad databas (default memory) Nästa försök är att skapa en filbaserad databas. Jag nyttjar följande JDBC-parametrar: driver=org.hsqldb.jdbcDriver url=jdbc:hsqldb:file:db/test usr=sa pwd=

Jag kör Jquery och ger följande kommandon: D:\Program Files\jquery>jquery -c hsql-file.ini JQuery 1.1 Copyright (c) 2004 Lennart Johansson Welcome to JQuery

Redan har det skapats några filer i db/ katalogen:

”test.properties”: #HSQL Database Engine #Thu Feb 16 18:55:59 CET 2006 hsqldb.script_format=0 runtime.gc_interval=0 sql.enforce_strict_size=false hsqldb.cache_size_scale=8 readonly=false hsqldb.nio_data_file=true hsqldb.cache_scale=14 version=1.8.0 hsqldb.default_table_type=memory hsqldb.cache_file_scale=1 hsqldb.log_size=200 modified=yes hsqldb.cache_version=1.7.0 hsqldb.original_version=1.8.0 hsqldb.compatible_version=1.8.0

”test.log”: CREATE USER SA PASSWORD "" ADMIN /*C1*/SET SCHEMA PUBLIC CONNECT USER SA

”test.lck”, som är en binär låsfil Jag skapar tabellen test_uncached: JQuery> JQuery> JQuery> JQuery> JQuery> JQuery> No rows

CREATE TABLE test_uncached ( id INTEGER IDENTITY, val VARCHAR(255) NULL, PRIMARY KEY(id) ); go affected or statement was DDL command

Inga filer har ännu modifierats på disk, speciellt så är ”test.log” inte uppdaterad. Jag går vidare och begär en checkpoint: JQuery> CHECKPOINT JQuery> go No rows affected or statement was DDL command

I detta läget så töms ”test.log” och ”test.script” skapas med följande innehåll: CREATE SCHEMA PUBLIC AUTHORIZATION DBA CREATE MEMORY TABLE TEST_UNCACHED(ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL PRIMARY KEY,VAL VARCHAR(255)) ALTER TABLE TEST_UNCACHED ALTER COLUMN ID RESTART WITH 0 CREATE USER SA PASSWORD "" GRANT DBA TO SA

SET WRITE_DELAY 20

Jag stoppar in ett värde i tabellen: JQuery> INSERT INTO test_uncached (val) VALUES ('ett'); JQuery> go Rows affected: 1

I detta läget så har ”test.script” inte ändrats, emedan ”test.log” har fått innehållet: /*C1*/INSERT INTO TEST_UNCACHED VALUES(0,'ett')

Jag begär åter igen en checkpoint: JQuery> CHECKPOINT JQuery> go No rows affected or statement was DDL command

Varpå ”test.log” töms och ”test.script” får innehållet: CREATE SCHEMA PUBLIC AUTHORIZATION DBA CREATE MEMORY TABLE TEST_UNCACHED(ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL PRIMARY KEY,VAL VARCHAR(255)) ALTER TABLE TEST_UNCACHED ALTER COLUMN ID RESTART WITH 1 CREATE USER SA PASSWORD "" GRANT DBA TO SA SET WRITE_DELAY 20 SET SCHEMA PUBLIC INSERT INTO TEST_UNCACHED VALUES(0,'ett')

Jag stänger databasen: JQuery> SHUTDOWN COMPACT JQuery> go No rows affected or statement was DDL command

Varpå låsfilen ”test.lck” och ”test.log” försvinner. I övrigt ändras inga filer. Jag stoppar och startar om Jquery och kontrollerar att datat finns kvar: JQuery> exit Bye bye! D:\Program Files\jquery>jquery -c hsql-file.ini JQuery 1.1 Copyright (c) 2004 Lennart Johansson Welcome to JQuery JQuery> SELECT * FROM test_uncached; JQuery> go ID VAL 0 ett Number of rows: 1

Åter igen dyker låsfilen ”test.lck” och loggfilen ”test.log” upp. ”test.log” har innehållet:

/*C1*/SET SCHEMA PUBLIC CONNECT USER SA

Jag begär en checkpoint och loggen töms utan att skriva till några andra filer. Åter igen så begär jag en nerstängning så att låsfilen och loggfilen plockas bort.

Filbaserad databas (default cached) Nästa steg är att ändra i databasens property så att tabeller by default inte enbart skall ligga i primärminnet (tolkar jag det som). Ändrar följande rad i ”test.properties”: hsqldb.default_table_type=memory

till hsqldb.default_table_type=cached

Jag startar sedan om Jquery: D:\Program Files\jquery>jquery -c hsql-file.ini JQuery 1.1 Copyright (c) 2004 Lennart Johansson Welcome to JQuery

Redan i detta läget så har det dykt upp en ny fil ”test.data” som är 1024KB stor men som innehållsmässigt är tom.. Jag stoppar in ännu ett värde i vår befintliga tabell test_uncached och begär en checkpoint: JQuery> INSERT INTO test_uncached (val) VALUES ('två'); JQuery> go Rows affected: 1 JQuery> CHECKPOINT; JQuery> GO No rows affected or statement was DDL command

”test.script” har nu innehållet: CREATE SCHEMA PUBLIC AUTHORIZATION DBA CREATE CACHED TABLE TEST_UNCACHED(ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL PRIMARY KEY,VAL VARCHAR(255)) SET TABLE TEST_UNCACHED INDEX'32 2' CREATE USER SA PASSWORD "" GRANT DBA TO SA SET WRITE_DELAY 20

Notera att den befintliga tabellens innehåll har flyttats till ”test.data” och att tabellen numera är CACHED. Det har också dykt upp en ny fil ”test.backup” som är 5KB stor. JQuery> SELECT * FROM test_uncached; JQuery> GO ID VAL 0 ett 1 två Number of rows: 2

Jag stänger databasen: JQuery> SHUTDOWN COMPACT; JQuery> GO No rows affected or statement was DDL command

Sedan försvinner låsfilen ”test.lck” och loggfilen ”test.log”.

Slutsats Om man anger att databasen skall vara filbaserad url=jdbc:hsqldb:file:db/test

och anger att tabellerna default skall vara filbaserade hsqldb.default_table_type=cached

så kommer databasen automatiskt att justera befintliga tabeller då de accessas så att de flyttas till cache-filen ”test.data”. Speciellt betyder detta att vi inte behöver nyttja syntaxen ”CREATE CACHED TABLE …” eftersom vi i kodbasen (hårdkodad SQL) inte alltid vet om vi kör mot en HSQLDB eller någon annan databas och inte heller (lett) har möjlighet att ta reda på det heller.

HSQLDB version 1.7.1 Jag kör nu några liknande tester (som ovan). Jag konstaterar att denna versionen beter sig annorlunda då jag använder samma JDBCURL:er som ovanför. När jag använder ”jdbc:hsqldb:mem:testdb” så skapas en tom fil ”mem”. I övrigt så är beteendet som förväntat från en primärminnesdatabas. Jag kan skapa tabeller och stoppa in värden i denna, men inget skrivs till fil. Det har ingen effekt om jag skapar en katalog med namnet ”mem”; det skrivs inga filer dit. När jag använder ”jdbc:hsqldb:file:db/test” så får jag ett fel: D:\Program Files\jquery>jquery -c hsql-file.ini JQuery 1.1 Copyright (c) 2004 Lennart Johansson java.sql.SQLException: File input/output error: file:db/test.properties java.io. FileNotFoundException: file:db\test.properties (The filename, directory name, or volume label syntax is incorrect)

Jag struntar (för närvarande i att titta närmare på en ren primärminnesdatabas) och går direkt på en filbaserad databas.

Filbaserad databas Jag nyttjar följande JDBC-parametrar (utan ”:file:”): driver=org.hsqldb.jdbcDriver url=jdbc:hsqldb:db/test usr=sa pwd=

Jag startar Jquery: D:\Program Files\jquery>jquery -c hsql-ss-file.ini JQuery 1.1 Copyright (c) 2004 Lennart Johansson Welcome to JQuery

Det har nu skapats tre filer i db-katalogen: ”test.script”: CREATE USER SA PASSWORD "" ADMIN /*C1*/CONNECT USER sa PASSWORD ""

”test.properties” #HSQL database #Thu Feb 16 20:15:53 CET 2006 sql.strict_fk=true readonly=false sql.strong_fk=true hsqldb.version=1.7.1 version=1.7.1 hsqldb.cache_scale=14 sql.compare_in_locale=false sql.month=true hsqldb.log_size=200 modified=yes hsqldb.cache_version=1.6.0 hsqldb.original_version=1.7.1 hsqldb.compatible_version=1.6.0 sql.enforce_size=false

”test.data” som är en tom binärfil (0KB). Jag skapar en tabell test_uncached: JQuery> JQuery> JQuery> JQuery> JQuery> No rows

CREATE TABLE test_uncached ( id INTEGER IDENTITY, val VARCHAR(255) NULL ); go affected or statement was DDL command

Filen ”test.script” har nu fått innehållet: CREATE USER SA PASSWORD "" ADMIN /*C1*/CONNECT USER sa PASSWORD "" CREATE TABLE test_uncached ( id INTEGER IDENTITY, VARCHAR(255) NULL )

Filen ”test.data” är tom. Stoppar nu in några värden i tabellen: JQuery> INSERT INTO test_uncached (val) VALUES ('ett'); JQuery> go Rows affected: 1

val

Genast (och utan någon checkpoint) så har nu filen ”test.script” uppdaterats: CREATE USER SA PASSWORD "" ADMIN /*C1*/CONNECT USER sa PASSWORD "" CREATE TABLE test_uncached ( id INTEGER IDENTITY, VARCHAR(255) NULL ) INSERT INTO TEST_UNCACHED VALUES(0,'ett')

val

Efter en checkpoint JQuery> CHECKPOINT JQuery> go No rows affected or statement was DDL command

så får filen ”test.script” följande utseende: CREATE TABLE TEST_UNCACHED(ID INTEGER NOT NULL IDENTITY PRIMARY KEY,VAL VARCHAR(255)) GRANT ALL ON CLASS "org.hsqldb.Library" TO PUBLIC GRANT ALL ON CLASS "java.lang.Math" TO PUBLIC CREATE USER SA PASSWORD "" ADMIN CREATE ALIAS DAYNAME FOR "org.hsqldb.Library.dayname" CREATE ALIAS SPACE FOR "org.hsqldb.Library.space" CREATE ALIAS SUBSTRING FOR "org.hsqldb.Library.substring" CREATE ALIAS HEXTORAW FOR "org.hsqldb.Library.hexToRaw" CREATE ALIAS SQRT FOR "java.lang.Math.sqrt" CREATE ALIAS ABS FOR "org.hsqldb.Library.abs" CREATE ALIAS POWER FOR "java.lang.Math.pow" CREATE ALIAS CHAR FOR "org.hsqldb.Library.character" CREATE ALIAS CONCAT FOR "org.hsqldb.Library.concat" CREATE ALIAS PI FOR "org.hsqldb.Library.pi" CREATE ALIAS RAWTOHEX FOR "org.hsqldb.Library.rawToHex" CREATE ALIAS SECOND FOR "org.hsqldb.Library.second" CREATE ALIAS TRUNCATE FOR "org.hsqldb.Library.truncate" CREATE ALIAS MONTH FOR "org.hsqldb.Library.month" CREATE ALIAS LOWER FOR "org.hsqldb.Library.lcase" CREATE ALIAS ATAN2 FOR "java.lang.Math.atan2" CREATE ALIAS REPEAT FOR "org.hsqldb.Library.repeat" CREATE ALIAS DAYOFMONTH FOR "org.hsqldb.Library.dayofmonth" CREATE ALIAS TAN FOR "java.lang.Math.tan" CREATE ALIAS RADIANS FOR "java.lang.Math.toRadians" CREATE ALIAS FLOOR FOR "java.lang.Math.floor" CREATE ALIAS NOW FOR "org.hsqldb.Library.now" CREATE ALIAS ACOS FOR "java.lang.Math.acos" CREATE ALIAS DAYOFWEEK FOR "org.hsqldb.Library.dayofweek" CREATE ALIAS CEILING FOR "java.lang.Math.ceil" CREATE ALIAS DAYOFYEAR FOR "org.hsqldb.Library.dayofyear" CREATE ALIAS LCASE FOR "org.hsqldb.Library.lcase" CREATE ALIAS WEEK FOR "org.hsqldb.Library.week" CREATE ALIAS SOUNDEX FOR "org.hsqldb.Library.soundex" CREATE ALIAS ASIN FOR "java.lang.Math.asin" CREATE ALIAS LOCATE FOR "org.hsqldb.Library.locate" CREATE ALIAS EXP FOR "java.lang.Math.exp" CREATE ALIAS MONTHNAME FOR "org.hsqldb.Library.monthname" CREATE ALIAS YEAR FOR "org.hsqldb.Library.year"

CREATE CREATE CREATE CREATE CREATE CREATE CREATE CREATE CREATE CREATE CREATE CREATE CREATE CREATE CREATE CREATE CREATE CREATE CREATE CREATE CREATE CREATE CREATE CREATE CREATE CREATE CREATE CREATE CREATE CREATE CREATE CREATE CREATE CREATE INSERT

ALIAS LEFT FOR "org.hsqldb.Library.left" ALIAS ROUNDMAGIC FOR "org.hsqldb.Library.roundMagic" ALIAS BITOR FOR "org.hsqldb.Library.bitor" ALIAS LTRIM FOR "org.hsqldb.Library.ltrim" ALIAS COT FOR "org.hsqldb.Library.cot" ALIAS COS FOR "java.lang.Math.cos" ALIAS MOD FOR "org.hsqldb.Library.mod" ALIAS SIGN FOR "org.hsqldb.Library.sign" ALIAS DEGREES FOR "java.lang.Math.toDegrees" ALIAS LOG FOR "java.lang.Math.log" ALIAS SIN FOR "java.lang.Math.sin" ALIAS CURTIME FOR "org.hsqldb.Library.curtime" ALIAS DIFFERENCE FOR "org.hsqldb.Library.difference" ALIAS INSERT FOR "org.hsqldb.Library.insert" ALIAS SUBSTR FOR "org.hsqldb.Library.substring" ALIAS DATABASE FOR "org.hsqldb.Library.database" ALIAS MINUTE FOR "org.hsqldb.Library.minute" ALIAS HOUR FOR "org.hsqldb.Library.hour" ALIAS IDENTITY FOR "org.hsqldb.Library.identity" ALIAS QUARTER FOR "org.hsqldb.Library.quarter" ALIAS CURDATE FOR "org.hsqldb.Library.curdate" ALIAS BITAND FOR "org.hsqldb.Library.bitand" ALIAS USER FOR "org.hsqldb.Library.user" ALIAS UCASE FOR "org.hsqldb.Library.ucase" ALIAS RTRIM FOR "org.hsqldb.Library.rtrim" ALIAS LOG10 FOR "org.hsqldb.Library.log10" ALIAS RIGHT FOR "org.hsqldb.Library.right" ALIAS ATAN FOR "java.lang.Math.atan" ALIAS UPPER FOR "org.hsqldb.Library.ucase" ALIAS ASCII FOR "org.hsqldb.Library.ascii" ALIAS RAND FOR "java.lang.Math.random" ALIAS LENGTH FOR "org.hsqldb.Library.length" ALIAS ROUND FOR "org.hsqldb.Library.round" ALIAS REPLACE FOR "org.hsqldb.Library.replace" INTO TEST_UNCACHED VALUES(0,'ett')

Stänger ner databasen JQuery> SHUTDOWN COMPACT JQuery> go No rows affected or statement was DDL command

med resultatet att ”test.data” plockas bort.

Startar igen och ser att datat finns kvar: JQuery> exit Bye bye! D:\Program Files\jquery>jquery -c hsql-ss-file.ini JQuery 1.1 Copyright (c) 2004 Lennart Johansson Welcome to JQuery JQuery> SELECT * FROM test_uncached JQuery> go ID VAL 0 ett Number of rows: 1

Skapar nu en cached table: JQuery> JQuery> JQuery> JQuery> JQuery> No rows

CREATE CACHED TABLE test_cached ( id INTEGER IDENTITY, val VARCHAR(255) NULL ); GO affected or statement was DDL command

Genast så uppdateras ”test.script”: CREATE TABLE TEST_UNCACHED(ID INTEGER NOT NULL IDENTITY PRIMARY KEY,VAL VARCHAR(255)) GRANT ALL ON CLASS "java.lang.Math" TO PUBLIC GRANT ALL ON CLASS "org.hsqldb.Library" TO PUBLIC CREATE USER SA PASSWORD "" ADMIN …klipp…klipp…klipp… CREATE ALIAS REPLACE FOR "org.hsqldb.Library.replace" INSERT INTO TEST_UNCACHED VALUES(0,'ett') /*C1*/CONNECT USER sa PASSWORD "" CREATE CACHED TABLE test_cached ( id INTEGER IDENTITY, val VARCHAR(255) NULL )

Noterar att id nu (automatiskt) börjar med 0. Kör en checkpoint JQuery> CHECKPOINT JQuery> GO

Efter detta har ”test.script” reorganiserats till: CREATE TABLE TEST_UNCACHED(ID INTEGER NOT NULL IDENTITY PRIMARY KEY,VAL VARCHAR(255)) CREATE CACHED TABLE TEST_CACHED(ID INTEGER NOT NULL IDENTITY PRIMARY KEY,VAL VARCHAR(255)) SET TABLE TEST_CACHED INDEX '-1 0' GRANT ALL ON CLASS "org.hsqldb.Library" TO PUBLIC GRANT ALL ON CLASS "java.lang.Math" TO PUBLIC CREATE USER SA PASSWORD "" ADMIN …klipp…klipp…klipp…

CREATE ALIAS REPLACE FOR "org.hsqldb.Library.replace" INSERT INTO TEST_UNCACHED VALUES(0,'ett')

Fortfarande så är filen ”test.data” tom. Jag stoppar in ett värde i den cachade tabellen: JQuery> INSERT INTO test_cached (val) VALUES ('ett'); JQuery> GO Rows affected: 1

och detta läggs till i filen ”test.script”: CREATE TABLE TEST_UNCACHED(ID INTEGER NOT NULL IDENTITY PRIMARY KEY,VAL VARCHAR(255)) CREATE CACHED TABLE TEST_CACHED(ID INTEGER NOT NULL IDENTITY PRIMARY KEY,VAL VARCHAR(255)) SET TABLE TEST_CACHED INDEX '-1 0' …klipp…klipp…klipp… INSERT INTO TEST_UNCACHED VALUES(0,'ett') INSERT INTO TEST_CACHED VALUES(0,'ett')

Kör en checkpoint: JQuery> CHECKPOINT JQuery> GO No rows affected or statement was DDL command

Efter detta så har raden ”INSERT INTO TEST_UNCACHED …” tagits bort från ”test.script” och värdet har placerats i ”test.data”. Dessutom har filen ”test.backup” skapats. CREATE TABLE TEST_UNCACHED(ID INTEGER NOT NULL IDENTITY PRIMARY KEY,VAL VARCHAR(255)) CREATE CACHED TABLE TEST_CACHED(ID INTEGER NOT NULL IDENTITY PRIMARY KEY,VAL VARCHAR(255)) …klipp…klipp…klipp… INSERT INTO TEST_UNCACHED VALUES(0,'ett')

Stänger ner databasen utan att något speciellt sker. JQuery> SHUTDOWN COMPACT JQuery> GO No rows affected or statement was DDL command

Kvar är filerna ”test.script”, ”test.properties”, ”test.data” och ”test.backup”. Startar om, lägger till ett värde i vardera tabellen: JQuery> INSERT INTO test_uncached (val) VALUES ('två'); JQuery> go Rows affected: 1 JQuery> INSERT INTO test_cached (val) VALUES ('två');

JQuery> go Rows affected: 1

Innehållet i ”test.script” är nu: CREATE TABLE TEST_UNCACHED(ID INTEGER NOT NULL IDENTITY PRIMARY KEY,VAL VARCHAR(255)) CREATE CACHED TABLE TEST_CACHED(ID INTEGER NOT NULL IDENTITY PRIMARY KEY,VAL VARCHAR(255)) …klipp…klipp…klipp… INSERT INTO TEST_UNCACHED VALUES(0,'ett') /*C1*/CONNECT USER sa PASSWORD "" INSERT INTO TEST_UNCACHED VALUES(1,'tv\u2020') INSERT INTO TEST_CACHED VALUES(1,'tv\u2020')

Jag går ur utan att göra checkpoint och utan att stoppa databasen men stänger dock ”kopplet” mot databasen på ett kontrollerat sätt. Resultatet är att det cachade värdet skrivs till ”test.data” och ”test.script” uppdateras: CREATE TABLE TEST_UNCACHED(ID INTEGER NOT NULL IDENTITY PRIMARY KEY,VAL VARCHAR(255)) CREATE CACHED TABLE TEST_CACHED(ID INTEGER NOT NULL IDENTITY PRIMARY KEY,VAL VARCHAR(255)) …klipp…klipp…klipp… INSERT INTO TEST_UNCACHED VALUES(0,'ett') INSERT INTO TEST_UNCACHED VALUES(1,'tv\u2020')

Observera speciellt att raden /*C1*/CONNECT USER sa PASSWORD ""

nu inte finns kvar i ”test.script”.

Slutsats Loghanteringen i HSQLDB version 1.7.1 hanteras i motsats till version 1.8.0 via scriptfilen. Det behövs inte heller någon checkpoint för att transaktioner skall skrivas till scriptfilen. Vid en nerstängning där åtminstone kopplet mot databasen tas ner så sköter HSQLDB om att städa i script-filen och flytta eventuella cachade värden till data- och backup-filen. Vi kan också notera att de irriterande CONNECT-raderna faktiskt är menat att försvinna då man gör checkpointing eller gör en kontrollerad nerstängning.

Uppgradering från version 1.7.1 till 1.8.0 Jag gör nu ett byte av JDBC-drivrutin (och därmed HSQLDB implementation) till version 1.8.0 och ser vad som sker då jag startar om. Resultatet av en omstart med utbytt hsqldb.jar ger följande fel: D:\Program Files\jquery>jquery -c hsql-file.ini JQuery 1.1 Copyright (c) 2004 Lennart Johansson java.sql.SQLException: error in script file line: 9 Unexpected token: SUBSTRING in statement [CREATE ALIAS SUBSTRING] D:\Program Files\jquery>

Jag noterar nu att ”test.data” har ökat i storlek till 1024 KB, men en enkel besiktning verkar ge vid handen att värdena alltjämt finns kvar där i filen. ”test.properties” verkar inte ha modifierats. Jag plockar manuellt bort alla alias-deklarationer och efter detta så startar HSQLDB utan problem: D:\Program Files\jquery>jquery -c hsql-file.ini JQuery 1.1 Copyright (c) 2004 Lennart Johansson Welcome to JQuery

Filen ”test.properties” har nu också uppdaterats och jag noterar speciellt att vi fått en viktig rad i tillägg: #HSQL Database Engine #Thu Feb 16 21:09:15 CET 2006 hsqldb.cache_file_scale=1 runtime.gc_interval=0 version=1.7.1 modified=yes hsqldb.script_format=0 hsqldb.cache_size_scale=8 hsqldb.cache_scale=14 hsqldb.log_size=200 sql.enforce_strict_size=false readonly=false hsqldb.compatible_version=1.7.0 hsqldb.original_version=1.7.1 sql.compare_in_locale=false hsqldb.nio_data_file=true hsqldb.cache_version=1.7.0 hsqldb.default_table_type=memory

Jag kontrollerar om våra värden ligger kvar: JQuery> SELECT * FROM test_cached; JQuery> GO ID VAL 0 ett 1 två Number of rows: 2 JQuery> SELECT * FROM test_uncached; JQuery> GO ID VAL 0 ett 1 två Number of rows: 2

Jag skriver värden till båda tabellerna: JQuery> INSERT JQuery> GO Rows affected: JQuery> INSERT JQuery> GO Rows affected:

INTO test_uncached (val) VALUES ('tre'); 1 INTO test_cached (val) VALUES ('tre'); 1

Vi ser att vi får det förväntade beteendet med ”test.log”: /*C1*/SET SCHEMA PUBLIC CONNECT USER SA INSERT INTO TEST_UNCACHED VALUES(2,'tre') INSERT INTO TEST_CACHED VALUES(2,'tre')

En checkpoint städar i databasen: JQuery> CHECKPOINT JQuery> GO No rows affected or statement was DDL command

Nu är loggfilen ”test.log” tom och ”test.script” har uppdaterats (jämte ”test.data” och ”test.backup”): CREATE SCHEMA PUBLIC AUTHORIZATION DBA CREATE MEMORY TABLE TEST_UNCACHED(ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL PRIMARY KEY,VAL VARCHAR(255)) CREATE CACHED TABLE TEST_CACHED(ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL PRIMARY KEY,VAL VARCHAR(255)) SET TABLE TEST_CACHED INDEX'88 3' ALTER TABLE TEST_UNCACHED ALTER COLUMN ID RESTART WITH 3 CREATE USER SA PASSWORD "" GRANT DBA TO SA SET WRITE_DELAY 20 SET SCHEMA PUBLIC INSERT INTO TEST_UNCACHED VALUES(0,'ett') INSERT INTO TEST_UNCACHED VALUES(1,'tv\u2020')

INSERT INTO TEST_UNCACHED VALUES(2,'tre')

Jag testar nu beteendet då man stänger ner, alternativt inte stänger ner databasen: JQuery> SHUTDOWN COMPACT JQuery> exit Bye bye!

Jag konstaterar att låsfilen ”test.lck” alltjämt finns kvar, vilket inte var fallet tidigare då jag körde med version 1.8.0. Det kan vara så att jag i detta läget inte får använda SHUTDOWN COMPACT. Längre ner provar jag igen med bara SHUTDOWN. Jag startar åter igen och får inga problem med det befintliga låset: D:\Program Files\jquery>jquery -c hsql-file.ini JQuery 1.1 Copyright (c) 2004 Lennart Johansson Welcome to JQuery JQuery> select * from test_cached JQuery> go ID VAL 0 ett 1 två 2 tre Number of rows: 3 JQuery> exit Bye bye!

Fortfarande ligger låset kvar. Jag går in och stoppar nu in ett värde i den primärminnestabellen: D:\Program Files\jquery>jquery -c hsql-file.ini JQuery 1.1 Copyright (c) 2004 Lennart Johansson Welcome to JQuery JQuery> INSERT INTO test_uncached (val) VALUES ('fyra'); JQuery> go Rows affected: 1 JQuery> exit Bye bye!

Låset finns kvar, ”test.log” innehåller SQL-satsen och följaktligen innehåller inte ”test.script” SQL-satsen. Jag startar igen för att se om HSQLDB kan hantera en existerande loggfil: D:\Program Files\jquery>jquery -c hsql-file.ini JQuery 1.1 Copyright (c) 2004 Lennart Johansson Welcome to JQuery

Efter detta så har loggfilen tömts och SQL-satsen har placerats i ”test.script”: CREATE SCHEMA PUBLIC AUTHORIZATION DBA CREATE MEMORY TABLE TEST_UNCACHED(ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL PRIMARY KEY,VAL VARCHAR(255)) CREATE CACHED TABLE TEST_CACHED(ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL PRIMARY KEY,VAL VARCHAR(255)) SET TABLE TEST_CACHED INDEX'88 3' ALTER TABLE TEST_UNCACHED ALTER COLUMN ID RESTART WITH 4 CREATE USER SA PASSWORD "" GRANT DBA TO SA SET WRITE_DELAY 20 SET SCHEMA PUBLIC INSERT INTO TEST_UNCACHED VALUES(0,'ett') INSERT INTO TEST_UNCACHED VALUES(1,'tv\u2020') INSERT INTO TEST_UNCACHED VALUES(2,'tre') INSERT INTO TEST_UNCACHED VALUES(3,'fyra')

Jag begär åter igen en nerstängning, denna gången med SHUTDOWN och utan COMPACT och nu fungerar det: JQuery> SHUTDOWN JQuery> go No rows affected or statement was DDL command

Efter detta så är även låsfilen ”test.lck” och loggfilen ”test.log” borta. När detta har gjorts så kan jag senare också använda SHUTDOWN COMPACT. Jag noterar också att någonstans på vägen så har ”test.properties” uppdaterats och innehåller nu flera nya och ändrade rader (fler än de som är markerade): #HSQL Database Engine #Thu Feb 16 21:29:42 CET 2006 hsqldb.script_format=0 runtime.gc_interval=0 sql.enforce_strict_size=false hsqldb.cache_size_scale=8 readonly=false hsqldb.nio_data_file=true hsqldb.cache_scale=14 version=1.8.0 hsqldb.default_table_type=memory hsqldb.cache_file_scale=1 sql.compare_in_locale=false hsqldb.log_size=200 modified=no hsqldb.cache_version=1.7.0 hsqldb.original_version=1.7.1 hsqldb.compatible_version=1.8.0

Åter igen så ändrar jag i ”test.properties” och byter ut raden hsqldb.default_table_type=memory

mot hsqldb.default_table_type=cached

Startar om och ser nu att även den icke-cachade tabellen flyttats till filen. Innehållet i ”test.script” är nu: CREATE SCHEMA PUBLIC AUTHORIZATION DBA CREATE CACHED TABLE TEST_UNCACHED(ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL PRIMARY KEY,VAL VARCHAR(255)) CREATE CACHED TABLE TEST_CACHED(ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL PRIMARY KEY,VAL VARCHAR(255)) SET TABLE TEST_UNCACHED INDEX'192 5' SET TABLE TEST_CACHED INDEX'72 3' CREATE USER SA PASSWORD "" GRANT DBA TO SA SET WRITE_DELAY 20

Speciellt så finns inga INSERT-satser kvar i filen, men all data finns i ”test.data”: JQuery> SELECT * FROM test_uncached JQuery> GO ID VAL 0 ett 1 två 2 tre 3 fyra 4 fem Number of rows: 5

Slutsats Det är möjligt att relativt smärtfritt uppgradera HSQLDB om man accepterar steget att plocka bort vissa (oanvända) rader i script-filen. När migreringen väl är gjord så kan vi (optionellt) ändra default-värdet för lagring i databasen så att vi får denna filbaserad istället för primärminnesbaserad utan att behöva ändra i befintlig SQL-kod (som kan tänkas köras mot andra databashanterare också). Fördelarna är således att vi inte ytterligare bygger in beroenden till HSQLDB i de hårdkodade SQL-satserna och att databasen torde boota snabbare eftersom man inte behöver spela upp alla INSERT, UPDATE och DELETE mot primärminnestabellen. Nackdelen är att vi blir mycket beroende av att använda CHECKPOINT, något som inte alls görs idag. Utan detta så ligger värdena kvar i loggen tills databasen startas om.

Jag noterar också att loggen verkar ha en maximal storlek. Denna konfigurationsparameter finns även i version 1.7.1 men refererar då kanske till storleken på script-filen? Eftersom script-filen för närvarande fylls upp av alla CONNECT-raderna så kan det vara så att vi har en absolut maximal begränsning någonstans. Detta indikerar att vi kanske ändå skulle behöva använda CHECKPOINT även i den befintliga versionen av HSQLDB. Annars har vi ännu ett gott argument för att kontrollera hur nerstängningsförfarandet ser ut. Om inte annat så borde något ske vid nerstängning och kanske borde vi göra en CHECKPOINT varje gång databaskopplet stängs. Detta önskar vi dock endast göra mot HSQLDB så detta kan betyda att vi bör ändra databas-klassen att även innehålla namnet på drivarn.

Related Documents


More Documents from ""