Derby

From APIDesign

(Difference between revisions)
Jump to: navigation, search
Current revision (07:32, 17 July 2010) (edit) (undo)
(On Classpath Database)
 
(5 intermediate revisions not shown.)
Line 1: Line 1:
[[wikipedia:Apache_Derby|Derby]] (also known as [[Java]] DB) is a lightweight, embeddable [[SQL]] database. It is very useful while running tests. I decided to use it to demonstrate functionality of the [[LiveDB]] project.
[[wikipedia:Apache_Derby|Derby]] (also known as [[Java]] DB) is a lightweight, embeddable [[SQL]] database. It is very useful while running tests. I decided to use it to demonstrate functionality of the [[LiveDB]] project.
-
It took me about two days to find out how to configure the [[Derby]] database through [[Ant]] build script. I wanted the [[Ant]] script to start the database, create there a table, fill it with some sample data and then compile and execute associated unit tests. For a while I was oscillating between using embedded driver vs. starting the server and connecting to it via socket. At the end the embedded driver turned to be easier to use:
+
=== [[Derby]] and [[Ant]] ===
 +
 
 +
It took me about two days to find out how to configure the [[Derby]] database through [[Ant]] build script. I wanted the [[Ant]] script to start the database, create there a table, fill it with some sample data and then compile and execute associated unit tests. Then the database shall be discarded.
 +
 
 +
==== Embed or Connect? ====
 +
 
 +
For a while I was oscillating between using embedded driver vs. starting the server and connecting to it via socket. At the end the embedded driver turned to be easier to use. One of its benefits is that one does not need to start separate process. Whenever one needs a database, it is enough to create the driver and use it (but don't forget to shut the database down if you modify it):
<source lang="xml" snippet="livedb.derby.create"/>
<source lang="xml" snippet="livedb.derby.create"/>
 +
==== Shut the Database Down ====
 +
 +
The last problem that I had to face was inconsistent state of the database. To eliminate that, you need to shut the database down. As far as I can tell this cannot be done in [[Ant]] (version 1.8.1) without having an ''<sql>'' target that fails and print a nasty warning. In spite of that I consider this more elegant than writing own [[Ant]] task (as suggested [http://www.ibm.com/developerworks/data/library/techarticle/dm-0412snell/ elsewhere] on the blogosphere; btw. that article is from year 2004, so it clearly shows how ''big'' process [[Ant]] made since then).
 +
 +
==== On Classpath Database ====
 +
 +
You may notice that I am creating the database inside ''build/classes'' directory. E.g. on the application classpath. This allows my tests to reference the database with location agnostic ''jdbc:derby:classpath:db'' [[URL]] (the last ''db'' is relative path to root of classpath elements).
-
The last problem that I had to face was inconsistent state of a database. To eliminate that, you need to close the shut the database down. As far as I can tell this cannot be done in [[Ant]] (version 1.8.1) without having an ''<sql>'' target that fails and print a nasty warning. However even this is easier than writing own [[Ant]] task (as suggested elsewhere on the blogosphere).
+
==== Perfect Match ====
-
I could not google out any sufficient how to, thus I am writing this one. I hope it will be useful for those who want to merge [[Ant]] and [[Derby]] database.
+
[[Derby]] comes with huge amount of documentation. However it seems to cover everything else than usage in unit tests and scripting with [[Ant]]. I could not google out any sufficient how to, thus I wrote this one. I hope it will be useful for those who want to merge [[Ant]] and [[Derby]] database in similar ways.
<comments/>
<comments/>

Current revision

Derby (also known as Java DB) is a lightweight, embeddable SQL database. It is very useful while running tests. I decided to use it to demonstrate functionality of the LiveDB project.

Contents

Derby and Ant

It took me about two days to find out how to configure the Derby database through Ant build script. I wanted the Ant script to start the database, create there a table, fill it with some sample data and then compile and execute associated unit tests. Then the database shall be discarded.

Embed or Connect?

For a while I was oscillating between using embedded driver vs. starting the server and connecting to it via socket. At the end the embedded driver turned to be easier to use. One of its benefits is that one does not need to start separate process. Whenever one needs a database, it is enough to create the driver and use it (but don't forget to shut the database down if you modify it):

Code from build.xml:
See the whole file.

<target name="-check-db">
    <property name="db" location="build/classes/db"/>
    <available property="db.exists" file="${db}"/>
</target>
<target name="create-db" unless="db.exists" depends="init,-check-db">
    <mkdir dir="${db}"/>
    <delete dir="${db}"/>
    <echo message="Creating DB in ${db}"/>
    <sql classpath="${file.reference.derby.jar}" userid="j1" password="j1" 
        url="jdbc:derby:${db};create=true" 
        driver="org.apache.derby.jdbc.EmbeddedDriver"
    >
    create table APP.AGE (
        NAME VARCHAR(30),
        AGE NUMERIC(3)
    );
    insert into APP.AGE values ('apidesign', 3);
    </sql>
    <!-- don't forget to shutdown the DB -->
    <sql classpath="${file.reference.derby.jar}" userid="j1" password="j1" 
        url="jdbc:derby:${db};shutdown=true" 
        driver="org.apache.derby.jdbc.EmbeddedDriver" 
        onerror="continue"
        errorproperty="ignore.error" 
        failonconnectionerror="false"
    >none</sql>
    <echo message="DB created OK."/>
</target>
 

Shut the Database Down

The last problem that I had to face was inconsistent state of the database. To eliminate that, you need to shut the database down. As far as I can tell this cannot be done in Ant (version 1.8.1) without having an <sql> target that fails and print a nasty warning. In spite of that I consider this more elegant than writing own Ant task (as suggested elsewhere on the blogosphere; btw. that article is from year 2004, so it clearly shows how big process Ant made since then).

On Classpath Database

You may notice that I am creating the database inside build/classes directory. E.g. on the application classpath. This allows my tests to reference the database with location agnostic jdbc:derby:classpath:db URL (the last db is relative path to root of classpath elements).

Perfect Match

Derby comes with huge amount of documentation. However it seems to cover everything else than usage in unit tests and scripting with Ant. I could not google out any sufficient how to, thus I wrote this one. I hope it will be useful for those who want to merge Ant and Derby database in similar ways.

<comments/>

Personal tools
buy