Running and Using HyperSQL
3
In-Process Access to Database Catalogs
In general, JDBC is used for all access to databases. This is done by making a connection to the database, then using
various methods of the java.sql.Connection object that is returned to access the data. Access to an in-process
database is started from JDBC, with the database path specified in the connection URL. For example, if the file:
database name is "testdb" and its files are located in the same directory as where the command to run your application
was issued, the following code is used for the connection:
Connection c = DriverManager.getConnection("jdbc:hsqldb:file:testdb", "SA", "");
The database file path format can be specified using forward slashes in Windows hosts as well as Linux hosts. So
relative paths or paths that refer to the same directory on the same drive can be identical. For example if your database
directory in Linux is /opt/db/ containing a database testdb (with files named testdb.*),
then the database file path is /opt/db/testdb. If you create an identical directory structure on
the C: drive of a Windows host, you can use the same URL in both Windows and Linux:
Connection c = DriverManager.getConnection("jdbc:hsqldb:file:/opt/db/testdb", "SA", "");
When using relative paths, these paths will be taken relative to the directory in which the shell command to start the
Java Virtual Machine was executed. Refer to the Javadoc for JDBCConnection for more details.
Paths and database names for file databases are treated as case-sensitive when the database is created or the first
connection is made to the database. But if a second connection is made to an open database, using a path and name
that differs only in case, then the connection is made to the existing open database. This measure is necessary because
in Windows the two paths are equivalent.
A mem: database is specified by the mem: protocol. For mem: databases, the path is simply a name. Several mem:
databases can exist at the same time and distinguished by their names. In the example below, the database is called
"mymemdb":
Connection c = DriverManager.getConnection("jdbc:hsqldb:mem:mymemdb", "SA", "");
A res: database, is specified by the res: protocol. As it is a Java resource, the database path is a Java URL (similar to the
path to a class). In the example below, "resdb" is the root name of the database files, which exists in the directory "org/
my/path" within the classpath (probably in a Jar). A Java resource is stored in a compressed format and is decompressed
in memory when it is used. For this reason, a res: database should not contain large amounts of data and is always
read-only.
Connection c = DriverManager.getConnection("jdbc:hsqldb:res:org.my.path.resdb", "SA", "");
The first time in-process connection is made to a database, some general data structures are initialised and a few helper
threads are started. After this, creation of connections and calls to JDBC methods of the connections execute as if they
are part of the Java application that is making the calls. When the SQL command "SHUTDOWN" is executed, the
global structures and helper threads for the database are destroyed.
Note that only one Java process at a time can make in-process connections to a given file: database. However, if the
file: database has been made read-only, or if connections are made to a res: database, then it is possible to make in-
process connections from multiple Java processes.
Server Modes
For most applications, in-process access is faster, as the data is not converted and sent over the network. The main
drawback is that it is not possible by default to connect to the database from outside your application. As a result
you cannot check the contents of the database with external tools such as Database Manager while your application
is running.