Login | Register
My pages Projects Community openCollabNet

Axion: Tidbits

Tidbits

Here's a collection of comments, tips, and notes that we're not sure where else to put right now. The features and syntax described here are currently supported, and the general functionality will likely be supported in the future, but they should be considered non-normative--we may change these features or syntax in future releases.

Database name overrides location

When you first connect to an Axion database, you indicate whether the database is transient (in-memory) or persistent, and if persistent, where the data files live. Internally, Axion will store a case-insensitive reference to the named database, and this database will persist until the VM exits or the database is SHUTDOWN.

Note that once the database is created (and until the database is SHUTDOWN), all connect strings that reference a database with that name will point to the same database. This means, for example, if you initially connect to a database using:

jdbc:axiondb:FOO:/data/foodb

Then all of the following connect strings will also connect to the database whose files live at /data/foodb:

jdbc:axiondb:FOO:/data/bardb
jdbc:axiondb:FOO
jdbc:axiondb:foo:/bardb
jdbc:axiondb:foo
jdbc:axiondb:FoO

That is, after the initial connection to the database, only the case-insensitive name is important. All references to databases with the same name will point to the same database. (The Axion team believes this to be a feature, for reasons we'll see below.)


SHUTDOWN

When Axion is running in-process, note that the VM is hosting both the client and server side of the database. The server-side of the database persists beyond the lifespan of specific client-side Connections. (I.e., if you close a Connection and then reopen it, the database isn't recreated, it still exists.) To close the server-side of the database, you need to issue a SHUTDOWN command. E.g.,

Connection conn = DriverManager.getConnection("jdbc:axiondb:foo:/data/foo");
Statement stmt = conn.createStatement();
stmt.execute("shutdown");
stmt.close();
conn.close();

CHECKPOINT

Axion isn't fully durable just yet. Some of the database state doesn't persist to disk immediately. To force Axion to synchronize its in-memory state with the persistent, on-disk state, you can issue a CHECKPOINT command. E.g.:

Connection conn = DriverManager.getConnection("jdbc:axiondb:foo:/data/foo");
Statement stmt = conn.createStatement();
stmt.execute("checkpoint");
stmt.close();
conn.close();

CHECKPOINT is implicitly invoked whenever you close a Connection or when the database is SHUTDOWN.


Read-Only Mode

You can force Axion into a read-only mode by setting the property readonly to true in your axiondb.properties file. This will cause any CREATE, INSERT, UPDATE, DELETE, etc. command to throw a SQLException.

Read-only mode can be used when an Axion database is stored on read-only media, but it isn't strictly necessary. Axion will not attempt to open a file for writing until a data-modifying command is executed. (I.e., if you only issue SELECT commands, Axion will only open files for reading anyway.)


REMOUNT and CHECKFILESTATE

Sometimes an Axion database is stored on removeable media like a CD or DVD. It is possible for the user or operating system to remove or move this media or these mount points while the database is running. Two extensions have been added to Axion to help deal with these situations.

The CHECKFILESTATE command will confirm that the database's data files are accessible. On success, CHECKFILESTATE will return a ResultSet containing at least one row. On failure, CHECKFILESTATE will return an empty ResultSet. For example:

Connection conn = DriverManager.getConnection("jdbc:axiondb:foo:/data/foo");
Statement stmt = conn.createStatement();
ResultSet rset = stmt.executeQuery("checkfilestate");
if(rset.next()) {
  // database files are still readable
} else {
  // database files seem to have been moved or removed
}
rset.close();
stmt.close();
conn.close();

The REMOUNT command will point the database to a new location on the file system (for example, to the new mount-point for a CD containing the database files). The syntax is REMOUNT new-location. For example:

Connection conn = DriverManager.getConnection("jdbc:axiondb:foo:/data/foo");
Statement stmt = conn.createStatement();
ResultSet rset = stmt.execute("remount /data/bar");
stmt.close();
conn.close();

Note that the new-location argument may be a bind variable.

Note that as described in Database name overrides location, both jdbc:axiondb:foo:/data/foo and jdbc:axiondb:foo:/data/bar (and for that matter, jdbc:axiondb:foo) will point to the same database, both before and after the remount.


Extending Axion with new Data Types

To add a new data type to Axion, simply create a class that implements DataType and register it with Axion in the axiondb.properties file.

See the org.axiondb.types package for examples.


Extending Axion with new Functions

To add a new function to Axion, simply create a class that implements AggregateFunction or ScalarFunction and register it with Axion in the axiondb.properties file.

See the org.axiondb.functions package for examples.


Defragmenting (Compacting) an Axion Database

The current default implementation of a disk-based Axion database does not recycle the "slots" that a row is saved into. This means that the disk files grow, not only for INSERT statements, but also for UPDATEs. Similarly, DELETEs do not reduce the size of these files either.

It is possible to "defragment" or "compact" such a database via the Defrag tool. It is used like this:

java -cp axiondb.jar;commons-collections.jar;commons-logging.jar \
         org.axiondb.tools.Defrag [dbpath]

The behavior of this application is unspecified if the database is open in any other process while this application is running.

Note that a database that is only used via INSERT and SELECT statements is already minimally sized, there is no value in defragmenting it.




Axion - Open Source Java Database Engine
$Id: tidbits.html,v 1.36 2007/11/15 15:09:27 rwald Exp $
Published 15 Nov 2007 at 3:07 PM GMT.