Derby
From APIDesign
(→On Classpath Database) |
|||
(3 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. | ||
+ | |||
+ | === [[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. | 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): | 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): | ||
Line 7: | Line 11: | ||
<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). | |
- | + | ==== 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. | [[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/>