At the Colorado Software Summit I attended a presentation on Derby by Dan Debrunner. Derby is the open source version of IBM's Cloudscape database engine. After seeing the presentation I decided to try to run it on IKVM. I tried some simple tests and they all went fine. At the moment Derby doesn't include a test suite yet (IBM is working on releasing their tests), so I didn't do any extensive testing.
Since Derby is a real transactional database engine it uses a transaction log and requires FileDescriptor.sync() to work corectly, so I decided to implement that. I hadn't previously implemented it, because it unfortunately requires platform specific code, so it only works on Windows and on Posix systems (when running on Mono).
I wrote a very simple test app in C# (and the Java equivalent) and did some performance tests (download source):
||Sun JDK 1.5
(Times in milliseconds, based on average of three best runs out of four runs.)
All the usual disclaimers about benchmarks apply of course, but it's interesting to see that IKVM on .NET outperforms JDK 1.5 on the queries. Preparing the statements take longs, but that is expected, as IKVM has to convert the generated class files to CIL (and this part of IKVM is not very efficient).
Another interesting aside is that when I ran the test on JDK 1.4.1, the insert operation took about 40 seconds to run. This rather extreme performance bug was fixed in 1.4.2.
One thing that is important to note when running Derby on IKVM is that Derby compiles all queries to bytecode and IKVM doesn't support garbage collecting classes (due to .NET's inability to unload code), so unless your application uses a fixed set of prepared statements that fit in the Derby statement cache, you're going to leak memory.
I made a new snapshot that includes the new sync implementation:
- Resync'ed with GNU Classpath cvs.
- Implemented java.io.FileDescriptor.sync() and java.nio.channels.FileChannel.force().
- Fixed java.io.File to treat file paths as case insensitive on Windows.
- Made exception helper a little more robust against exceptions happening early in bootstrap.
- Fixed japi build file to include all the public APIs.
- Fixed ClassLoaderWrapper.getSystemClassLoader() to bypass ClassLoader.getSystemClassLoader() and access the underlying field directly, to prevent a security check.
- Changed DotNetTypeWrapper to overrider GetClassLoader to lazily get the system class loader.
- Fixed ikvmc generated main stub to return 1 if the program exited with an exception.
- Implemented support for java.security.manager system property (the security manager can now be set from the command line using -Djava.security.manager=<class>).
New snapshots: just the binaries and source plus binaries.