In preparation for some Java work I wanted to configure and test the Drizzle JDBC Driver. Any chance to swing Drizzle into a MySQL discussion is worth the research. What I found was an issue compiling and an issue running on Ubuntu 9.04
You can start by downloading and building the Drizzle JDBC. My first problem was when I tried to build a usable .jar. I got errors in the test cases which caused by default no built .jar to work with. I raised Bug #432146 – org.drizzle.jdbc.MySQLDriverTest Tests fail. As I stated it may not be a real bug, but it seems at present that you require a running MySQL instance as well as a running Drizzle instance. In my case I didn’t have MySQL running, and I think to be fair, I should be able to build a Drizzle driver without MySQL.
Anyway, as per the Wiki Docs I proceeded to package without successful test cases. My next problem was more interesting, and perhaps found earlier from the tests?
I first created a test schema my code was going to use.
$ ~/drizzle/deploy/bin/drizzle Your Drizzle connection id is 724 Server version: 2009.09.1126 Source distribution (trunk) drizzle> create schema test_java; Query OK, 1 row affected (0 sec) drizzle> exit
I wrote a simple Java program.
$ cat ExampleDrizzle.java import java.sql.*; public class ExampleDrizzle { public static void main(String args[]) { try { Class.forName("org.drizzle.jdbc.Driver"); } catch (Exception e) { System.out.println(e.getMessage()); System.exit(1); } try { Connection con = DriverManager.getConnection("jdbc:drizzle://localhost:4427/test_java"); Statement st = con.createStatement(); st.executeUpdate("CREATE TABLE a (id int not null primary key, value varchar(20))"); st.close(); con.close(); } catch (SQLException e) { System.out.println(e.getMessage()); } } }
Compiled.
$ javac ExampleDrizzle.java
Ran.
$ java ExampleDrizzle org.drizzle.jdbc.Driver not found in gnu.gcj.runtime.SystemClassLoader{urls=[file:mysql-connector-java-5.1.8-bin.jar,file:./], parent=gnu.gcj.runtime.ExtensionClassLoader{urls=[], parent=null}}
Oops, been a while since using Java. I was amazed I could write the code in vi in the first place.
$ export CLASSPATH=drizzle-jdbc-0.5-SNAPSHOT.jar:. $ java ExampleDrizzle 17-Sep-09 6:48:45 PM org.drizzle.jdbc.internal.drizzle.DrizzleProtocolINFO: Connected to: localhost:4427 Exception in thread "main" java.lang.NoClassDefFoundError: org.drizzle.jdbc.DrizzleConnection at java.lang.Class.initializeClass(libgcj.so.90) at org.drizzle.jdbc.Driver.connect(Driver.java:74) at java.sql.DriverManager.getConnection(libgcj.so.90) at ExampleDrizzle.main(ExampleDrizzle.java:15) Caused by: java.lang.ClassNotFoundException: java.sql.SQLFeatureNotSupportedException not found in gnu.gcj.runtime.SystemClassLoader{urls=[file:drizzle-jdbc-0.5-SNAPSHOT.jar,file:./], parent=gnu.gcj.runtime.ExtensionClassLoader{urls=[], parent=null}} at java.net.URLClassLoader.findClass(libgcj.so.90) at java.lang.ClassLoader.loadClass(libgcj.so.90) at java.lang.ClassLoader.loadClass(libgcj.so.90) at java.lang.Class.forName(libgcj.so.90) at java.lang.Class.initializeClass(libgcj.so.90) ...3 more
Hmmm, that’s disappointing. I thought about it a minute, figured some guidance would be beneficial , so I sought out the best Java person on #drizzle IRC. Getting a name, but no response from an initial inquiry after about a half hour I thought again at the problem. Just what java are you using?
$ java -version java version "1.5.0" gij (GNU libgcj) version 4.3.3 $ ls -l /usr/bin/java lrwxrwxrwx 1 root root 22 2009-07-17 12:36 /usr/bin/java -> /etc/alternatives/java $ sudo find / -name java [sudo] password for rbradfor: /usr/lib/java /usr/lib/ure/share/java /usr/lib/jvm/java-6-sun-1.6.0.16/bin/java /usr/lib/jvm/java-6-sun-1.6.0.16/jre/bin/java /usr/lib/jvm/java-1.5.0-gcj-4.3-1.5.0.0/bin/java /usr/lib/jvm/java-1.5.0-gcj-4.3-1.5.0.0/jre/bin/java /usr/bin/java /usr/include/c++/4.3/gnu/java /usr/include/c++/4.3/java /usr/local/include/google/protobuf/compiler/java $ ls -l /etc/alternatives/j* ... lrwxrwxrwx 1 root root 33 2009-09-17 17:50 jar -> /usr/lib/jvm/java-gcj/jre/bin/jar lrwxrwxrwx 1 root root 39 2009-09-17 17:50 jar.1.gz -> /usr/lib/jvm/java-gcj/man/man1/jar.1.gz lrwxrwxrwx 1 root root 35 2009-09-17 17:50 jarsigner -> /usr/lib/jvm/java-gcj/bin/jarsigner lrwxrwxrwx 1 root root 45 2009-09-17 17:50 jarsigner.1.gz -> /usr/lib/jvm/java-gcj/man/man1/jarsigner.1.gz lrwxrwxrwx 1 root root 34 2009-09-17 17:50 java -> /usr/lib/jvm/java-gcj/jre/bin/java lrwxrwxrwx 1 root root 40 2009-09-17 17:50 java.1.gz -> /usr/lib/jvm/java-gcj/man/man1/java.1.gz lrwxrwxrwx 1 root root 31 2009-09-17 17:50 javac -> /usr/lib/jvm/java-gcj/bin/javac lrwxrwxrwx 1 root root 41 2009-09-17 17:50 javac.1.gz -> /usr/lib/jvm/java-gcj/man/man1/javac.1.gz ...
I wonder if I should use the real Sun Java.
$ sudo apt-get install sun-java6-jdk Reading package lists... Done Building dependency tree Reading state information... Done sun-java6-jdk is already the newest version. 0 upgraded, 0 newly installed, 0 to remove and 2 not upgraded. $ sudo update-alternatives --config java There are 4 alternatives which provide `java'. Selection Alternative ----------------------------------------------- 1 /usr/lib/jvm/java-6-sun/jre/bin/java 2 /usr/bin/gij-4.3 3 /usr/bin/gij-4.2 *+ 4 /usr/lib/jvm/java-gcj/jre/bin/java Press enter to keep the default[*], or type selection number: 1 Using '/usr/lib/jvm/java-6-sun/jre/bin/java' to provide 'java'. $ ls -l /usr/bin/java lrwxrwxrwx 1 root root 22 2009-07-17 12:36 /usr/bin/java -> /etc/alternatives/java $ ls -l /etc/alternatives/java lrwxrwxrwx 1 root root 36 2009-09-17 18:53 /etc/alternatives/java -> /usr/lib/jvm/java-6-sun/jre/bin/java
Yep, it took a minute to discover the update-alternatives command, lucky I didn’t try that manually.
A second try.
$ javac ExampleDrizzle.java $ java ExampleDrizzle Sep 17, 2009 6:54:22 PM org.drizzle.jdbc.internal.drizzle.DrizzleProtocolINFO: Connected to: localhost:4427 Sep 17, 2009 6:54:22 PM org.drizzle.jdbc.internal.drizzle.DrizzleProtocol close INFO: Closing connection Sep 17, 2009 6:54:22 PM org.drizzle.jdbc.internal.common.packet.AsyncPacketFetcher run INFO: Connection closed $ ~/drizzle/deploy/bin/drizzle test_java Server version: 2009.09.1126 Source distribution (trunk) drizzle> show tables; +---------------------+ | Tables_in_test_java | +---------------------+ | a | +---------------------+ 1 row in set (0 sec) drizzle> desc a; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | id | int | NO | PRI | NULL | | | value | varchar(20) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ 2 rows in set (0 sec)
And I’ve got a working testcase.
Robert Hodgs says
Hi Ronald,
At this point the gcj a bit of a menace to Java applications as it has a number of incompatibilities at the library as well as utility level. I usually recommend the ‘rpm -e’ treatment, as your example shows how easy it is to get the real thing from Sun. (BTW, we should all give Sun a big thumbs up on open sourcing Java–it’s a tremendous contribution.)
Cheers, Robert