- ...
- Original code, based on in-depth study of database theory and the SQL Standard
- Ahead of other open-source solutions in supported SQL features
- The fastest overall open-source SQL implementation for small and medium sized databases
- Three transaction control models, including lock based and MVCC models
- Fully multithreaded
- Compact code footprint
- ...
"Install" HSQLDB(ever the latest release) in Linux
HSQLDB (also known as HyperStructuredSQL or HyperSQL ---its old name was Hypersonic or HSQL---) it's a portable RDBMS writting 100% in Java. It can be embedded with your application as well as can be used separately(offer Embedded and server modes).So as i just say HSQLDB can also run as a database server, handling connections from different JVMs, and also as a purely in-memory engine. It has a JDBC driver and supports a large subset of SQL-92 and SQL:2008 standards.[1]
It is a a fast,[2] and very small (around 1100 kilobytes in version 2.0) database engine that supports almost all features of a standard database system(offers both in-memory and disk-based tables).It comes with a small jar file
hsqldb.jar
(This includes the JDBC driver and the database engine)
that can be found in:hsqldb_x_y_z/hsqldb/libfolder. The
hsqldb.jar
file must be put on the application classpath.Installation
- Start by downloading the latest stable release, from SourceForge. The file to look for is in a directory called hsqldb_x_y_z and is named hsqldb-x.y.z.zip (Actually it's hsqldb-2.1.0.zip . Possibly in future you can find it with a higher version number).
- Unzip the archive in your home directory
- You now have a directory called hsqldb-2.1.0 containing a directory hsqldb containing all files related to the DBMS. You will see the following contents as in Fig. above
- Here "bin" directory contains some Windows(only) batch files(*.bat).
- *.bat --> *.sh
- "\" --> "/"
- "%" --> "$"
- "@" --> "set +v"
- don't forget to control the correct conversion of line endings "CR/LF" --> "LF" (in Geany go to Document > Set line endings > click on Convert and set to LF(Unix) )
- rename the file filename.bat --> filename.sh
runManagerSwing.sh(Notice that runManager(AWT based) do the same work although is weirdly to view)
cd ../data set +v java -classpath ../lib/hsqldb.jar org.hsqldb.util.DatabaseManagerSwing $1 $2 $3 $4 $5 $6 $7 $8 $9
Now i will describe how got HSQLDB working:
How to run a standalone HyperSQL (hsqldb) Server
The most common use of HyperSQL is for in-memory operations, but could happen that persistent standalone server is required. Exist three ways (But here i examine two of them) to start the HSQLDB as a standalone server:
- Starting standalone HyperSQL with command line arguments: That's the best and fastest way of running a standalone hsqldb server:
harrykar@harrysas:~/Activities/DBMS/hsqldb-2.1.0/hsqldb$ java -classpath lib/hsqldb.jar org.hsqldb.server.Server --database.0 file:hsqldb/hemrajdb --dbname.0 testdb
- Starting standalone HyperSQL with configuration file:
- hsqldb.jar ( The most important file of the hsqldb RDBMS system ) in hsqldb_x_y_z/hsqldb/lib must be in our classpath.
- Now check whether java in the (execution command) path or not. Just execute javac(included in the Java Development Kit (JDK) ) command and wait. If path has been set to java, then it will display some textual output showing command options.
- Now (in hsqldb directory) prepare a file named server.properties like this(Note that is only an example). We want create our DB in hsqldb directory that will contain four hemrajdb.* files after server execution:
server.database.0=file:hsqldb/hemrajdb server.dbname.0=testdb
- Start the server. As below command executes you will see some output and a new directory will be created into current path named hsqldb in which you will find the following contents: hemrajdb.lck, hemrajdb.log, hemrajdb.tmp, hemrajdb.script hemrajdb.properties.
harrykar@harrysas:~/Activities/DBMS/hsqldb-2.1.0/hsqldb$ java -classpath lib/hsqldb.jar org.hsqldb.server.Server [Server@1c691f36]: [Thread[main,5,main]]: checkRunning(false) entered [Server@1c691f36]: [Thread[main,5,main]]: checkRunning(false) exited [Server@1c691f36]: Startup sequence initiated from main() method [Server@1c691f36]: Loaded properties from [/home/harrykar/Activities/DBMS/hsqldb-2.1.0/hsqldb/server.properties] [Server@1c691f36]: Initiating startup sequence... [Server@1c691f36]: Server socket opened successfully in 8 ms. [Server@1c691f36]: Database [index=0, id=0, db=file:hsqldb/hemrajdb, alias=testdb] opened sucessfully in 589 ms. [Server@1c691f36]: Startup sequence completed in 598 ms. [Server@1c691f36]: 2011-05-08 22:19:06.930 HSQLDB server 2.1.0 is online on port 9001 [Server@1c691f36]: To close normally, connect and execute SHUTDOWN SQL [Server@1c691f36]: From command line, use [Ctrl]+[C] to abort abruptly
- Once you created the database then you have to run the command in the same way as before with some extra arguments to connect with existing database e.g.
harrykar@harrysas:~/Activities/DBMS/hsqldb-2.1.0/hsqldb$ java -classpath lib/hsqldb.jar org.hsqldb.server.Server --database.0 file:hsqldb/hemrajdb --dbname.0 testdb [Server@6ef0eed6]: [Thread[main,5,main]]: checkRunning(false) entered [Server@6ef0eed6]: [Thread[main,5,main]]: checkRunning(false) exited [Server@6ef0eed6]: Startup sequence initiated from main() method [Server@6ef0eed6]: Loaded properties from [/home/harrykar/Activities/DBMS/hsqldb-2.1.0/hsqldb/server.properties] [Server@6ef0eed6]: Initiating startup sequence... [Server@6ef0eed6]: Server socket opened successfully in 3 ms. [Server@6ef0eed6]: Database [index=0, id=0, db=file:hsqldb/hemrajdb, alias=testdb] opened sucessfully in 583 ms. [Server@6ef0eed6]: Startup sequence completed in 587 ms. [Server@6ef0eed6]: 2011-05-09 00:17:54.641 HSQLDB server 2.1.0 is online on port 9001 [Server@6ef0eed6]: To close normally, connect and execute SHUTDOWN SQL [Server@6ef0eed6]: From command line, use [Ctrl]+[C] to abort abruptly
- Starting standalone HyperSQL with Java Code: I refer the thrid way of starting a standalone HyperSQL server through java code here only for completeness sake.
HsqlProperties p = new HsqlProperties(); p.setProperty("server.database.0","file:/opt/db/accounts"); p.setProperty("server.dbname.0","an_alias"); // set up the rest of properties Server server = new Server(); server.setProperties(p); server.setLogWriter(null); // can use custom writer server.setErrWriter(null); // can use custom writer server.start();
Access the Database trough a GUI client
- Now you need to run ./runManagerSwing.sh file from /bin directory. Before start you have to enter some connection configurations and then press ok button to connect to the graphical user interface to database.
- You can enter also the following:
Type: HSQL Database Engine Standalone Driver: org.hsqldb.jdbcDriver URL: jdbc:hsqldb:file:/path/to/your/app/demobase User: SA
- Now create a table and put some data into it (click Execute-button after copying the following to the text field):
CREATE TABLE Bookmarks (title VARCHAR(50), url VARCHAR(255)); INSERT INTO Bookmarks (title, url) VALUES ('Java Technology', 'http://java.sun.com/'); INSERT INTO Bookmarks (title, url) VALUES ('HSQLDB 100% Java Database', 'http://hsqldb.sourceforge.net/'); INSERT INTO Bookmarks (title, url) VALUES ('Apache Jakarta Tomcat', 'http://jakarta.apache.org/tomcat/'); CHECKPOINT
- The first four lines are standard SQL. The final line is HSQLDB specific. To persist changes to your file after modifications, use the CHECKPOINT command.
- You can test that it worked, by executing this(you must get the Bookmarks table ordinated by title column as you can see below in the screenshot):
SELECT * FROM Bookmarks ORDER BY title;
- Exit the manager.
- demobase.log,
- demobase.properties and
- demobase.script (and if you didn't exit the manager, you'll also have a demobase.lck file).
How-to: changing user password on HSQL
In order to connect to any database you need to provide four properties:- driver class
- URL to database
- user name
- user password
For HSQL it might look something similar to this:
driver=org.hsqldb.jdbcDriver url=jdbc:hsqldb:file:app.db;shutdown=true username=sa password=
The default user ‘sa’ has empty password. This works fine as long as you don’t need to change the password for the default user. But there are times when you need to change it. For instance Glassfish Application Server won’t let you create a data source with empty password. So the question remains – how to change the password of embedded database?
You have to log to the database as “SA” user and run below SQL script:
You have to log to the database as “SA” user and run below SQL script:
ALTER USER sa SET PASSWORD ''put-here-your-password';
There are many ways to do it. I will show you one of them:
- Open your command line, go to folder where you keep your hsql.jar and run:
java -jar url=jdbc:hsqldb:file:app.db;shutdown=true -sql “ALTER USER sa SET PASSWORD ‘put-here-your-password’;”
- This yet still won’t work as system will inform you that you have not entered credentials needed for database manipulation.
Failed to retrieve connection info for database ‘jdbc.hsqldb:file:app.db’: Please set up authentication file ‘sqltool.rc’
- You need to create file sqltool.rc in the same folder where you keep your hsql.jar. This file will keep entry configuration for your database. Insert text below to your sqltool.rc file:
urlid conn1 url jdbc:hsqldb:file:C:/hsqldbs/app.db;shutdown=true username sa password
- Note that we gave this entry an id (urlid) called conn1. Now we can execute our SQL once again this time adding entry point urlid at the end:
java -jar url=jdbc:hsqldb:file:app.db;shutdown=true -sql “ALTER USER sa SET PASSWORD ‘put-here-your-password’;” conn1
- This time the connection will succeed and password of the SA user will be change.
A bit of details
HSQLDB does not support full ACID transactions;
JDBC URLs
JDBC URLs for HSQLDB look like the following:jdbc:hsqldb:file:
filepathname
: File-persistencejdbc:hsqldb:hsql:
DB_NAME
: database serverjdbc:hsqldb:mem:
DBname
: in-memory only
org.hsqldb.jdbcDriver
. --------------------------------------------------
Todo: SqlTool HSQLDB's CLI