Embedding a Derby database
Derby can serve as an embedded relational database in Java applications. This may be a solution for use cases that need real-time access to relatively stable data, such as gene aliases and annotations. Getting Derby to work within a Cytoscape plugin was not trivial, so I wanted to share that experience.
Important Links
Offical Apache Derby site
Useful Quick Start site for newbies
Reference to OSGi (osgi.jar)
Getting It To Work
- Like other libraries to be included in a plugin, you have to unjar the classes and include them in your build folder.
- In order to get my application running, I needed to include both derby.jar and derbytools.jar. Leaving the other out helps keep the size down. These two jars add ~2.3MB.
One of the classes in derby.jar throws an exception while the plugin is being loaded by Cytoscape. EmbeddedActivator.class (org.apache.derby.osgi) implements BundleActivator.class which is not included in the Derby distribution.
- Turns out this class is part of an "optional" OSGi package which is under a proprietary license, not Apache!
Rather than going down that dark and treacherous road, I simply removed the osgi folder containing only the EmbeddedActivator class and jared the remaining classes along with my plugin. No problems.
Materials
Here is a sinlge jar file containing derby.jar plus derbytools.jar minus the offending class: derby-slim.jar
And here is sample code for your build.xml to unjar and include the derby classes in your build file:
1 <unjar overwrite="Yes" dest="${build}">
2 <fileset dir="${lib.derby}">
3 <include name="lib/derby-slim.jar"/>
4 </fileset>
5 </unjar>
6
Next
- I plan on testing performance by loading a GenMAPP Gene Database exceding 500MB into Derby and seeing how it runs.
- I'd like to work on a general Derby Interface: a plugin that loads derby-slim.jar once and offers generic methods for all other plugins