[geotk] EPSG database and JavaDB/Derby
Martin Desruisseaux
martin.desruisseaux at geomatys.fr
Tue Oct 6 19:12:03 EDT 2009
Hello Jon
Obviously I'm very pleased if the migration is going well for you :)
To make a short story, there is a simple solution for your concern at the end of
this email. The rest of this email is only discussion.
Jon Blower a écrit :
> The Geotoolkit referencing bundle includes an EPSG database, which
> requires derby.jar (or some other database engine) to access. ncWMS
> is a web application so according to the instructions, I shouldn't
> package derby.jar with the WAR file, but install it separately into
> the Tomcat container. However, this is an extra installation step
> (admittedly a simple one) that is a bit of extra effort for my users.
Yes... But actually we realized that the difficulty goes beyong the case of EPSG
alone. We are using both Tomcat and Glassfish, and in our experience having JDBC
driver in WEB-INF/lib is a cause of trouble, no matter which driver (we got the
same problems with Derby, PostgreSQL and Oracle drivers).
The problem may not be obvious when there is only one application deployed in a
container (while some symptoms are visible at shutdown time, basically caused by
the JDBC driver being "shutdown" too early while the web application is also in
the process of being shutdown. When the JDBC driver is installed in common/lib
instead, then it is properly "shutdown" only after the web applications).
However the problem become more serious when there is 2 or more applications
deployed in the same container. Strange behaviors like NoClassDefFoundError
(while the JAR is really on the classpath) happen. I think that the problem is
caused by Tomcat using a different ClassLoader for each web application, causing
the JVM to consider 2 Derby drivers (or PostgreSQL, etc.) as different classes
even if they are actually the same, while only one of them can be registered in
java.sql.Driver or java.util.ServiceLoader (because they have the same class name).
Note that the above apply not only to JDBC drivers, but to anything that
register itself as a service at the JVM level. In addition to JDBC drivers, this
apply to ImageReaders & ImageWriters (we are aware that geotk-coverageio declare
such services, which is an issue that we will need to consider). For this reason
I would not recommand to put the "Image I/O extension for JAI" JAR file in
WEB-INF/lib for instance. As a rule of thumbs, for any JAR file for which the
above command-line display at least one entry:
unzip -ll thejarfile.jar META-INF/services/java*
putting this JAR file in common/lib instead than WEB-INF/lib is safer. In our
tests, moving every JDBC drivers in common/lib and making sure that there is
none remaining in any WEB-INF/lib directory solved a lot of our issues.
For Tomcat users, installing the JDBC drivers in Tomcat is an unconvenient extra
step. But for the users of a bigger framework like Glassfish, there is no extra
step because the JDBC drivers are already provided by the container, which also
manage connection pools etc.
> In GeoTools, I was using the epsg-wkt module, which packaged the CRSs
> in text form without a database engine. This was very convenient
> because no management of database connections was necessary, and the
> WAR file for ncWMS could be completely self-contained.
>
> What would be the best way of packaging the CRS database with my web
> application? I am not very worried about performance. Is there a WKT
> implementation of the database in Gtk?
Yes. Only the WKT file itself is not provided by Geotk so you need to provide it
in one of your JAR file. The rational is that the WKT file in GeoTools is
already a subset of the EPSG database, and different users may want different
subsets. You can copy the GeoTools property file, eventually add/remove/modify
some CRS for your area of interest, then put that file in one of your JAR files
under the following file name:
org/geotoolkit/referencing/factory/espg/epsg.properties
Thats all. No need to code anything - it should be recognized automatically
(note however that if a connection to an EPSG database is found, it will have
precedence over the property file). More information there:
http://www.geotoolkit.org/apidocs/org/geotoolkit/referencing/factory/epsg/PropertyEpsgFactory.html
Please let me know if there is any issue,
Martin
More information about the Geotoolkit
mailing list