Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Steps to use a Firebird database in Grails

I am trying to connect my Grails application to a Firebird database.

I am using:

  • Grails 2.2.1
  • JDK 1.7
  • Firebird 2.5.2
  • Jaybird 2.2.2

So far, this is what I have done:

  • I downloaded Jaybird-2.2.2JDK_1.7.zip from http://www.firebirdsql.org/en/jdbc-driver/
  • I unzipped this file and copied jaybird-2.2.2.jar into my application's lib folder.
  • In BuildConfig.groovy, I added runtime "org.firebirdsql.jdbc:jaybird:2.2.2" to the dependencies section.
  • I edited DataSource.groovy as detailed below.

The dataSource section:

dataSource {
    pooled = false
    driverClassName = "org.firebirdsql.jdbc.FBDriver"
    dialect = "org.hibernate.dialect.FirebirdDialect"
    username = "SYSDBA"
    password = "masterkey"
}

The hibernate section:

hibernate {
    cache.use_second_level_cache = true
    cache.use_query_cache = true
    cache.provider_class = 'org.firebirdsql.pool.FBSimpleDataSource'
}

(I have also had cache.region.factory_class = 'net.sf.ehcache.hibernate.EhCacheRegionFactory and cache.provider_class = 'com.opensymphony.oscache.hibernate.OSCacheProvider' in the above section on separate occasions, but neither made any difference.)

When running my Grails app, startup fails with a huge error that boils down to the following message:

java.lang.IllegalStateException: Could not load JDBC driver class [org.firebirdsql.jdbc.FBDriver]

I have searched the web far and wide, but I cannot find an example of a working Grails/Firebird configuration anywhere. There is a fix floating around that involves copying minij2ee.jar, but that is for a different error message. Also, people have suggested emptying the .grails folder – I have tried this, to no avail.

Could someone please advise, how can I get Grails to work with Firebird?


Here is the whole exception, though it seems to repeat a couple of times during startup:

->> 303 | innerRun in java.util.concurrent.FutureTask$Sync
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|   138 | run      in java.util.concurrent.FutureTask
|   886 | runTask  in java.util.concurrent.ThreadPoolExecutor$Worker
|   908 | run      in     ''
^   662 | run . .  in java.lang.Thread

Caused by BeanCreationException: Error creating bean with name 'sessionFactory':
 Cannot resolve reference to bean 'dataSource' while setting bean property 'data
Source'; nested exception is org.springframework.beans.factory.BeanCreationExcep
tion: Error creating bean with name 'dataSource': Cannot resolve reference to be
an 'dataSourceUnproxied' while setting constructor argument; nested exception is
 org.springframework.beans.factory.BeanCreationException: Error creating bean wi
th name 'dataSourceUnproxied': Error setting property values; nested exception i
s org.springframework.beans.PropertyBatchUpdateException; nested PropertyAccessE
xceptions (1) are:
PropertyAccessException 1: org.springframework.beans.MethodInvocationException:
Property 'driverClassName' threw exception; nested exception is java.lang.Illega
lStateException: Could not load JDBC driver class [org.firebirdsql.jdbc.FBDriver
]

Running --stacktrace with --verbose:

| Error Error running script --stacktrace --verbose: Cannot invoke method findAl
l() on null object
java.lang.NullPointerException: Cannot invoke method findAll() on null object
        at org.codehaus.groovy.runtime.NullObject.invokeMethod(NullObject.java:7
7)
        at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaC
lassSite.java:45)
        at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSi
teArray.java:45)
        at org.codehaus.groovy.runtime.callsite.NullCallSite.call(NullCallSite.j
ava:32)
        at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSi
teArray.java:45)
        at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite.call(PojoMeta
MethodSite.java:55)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCa
llSite.java:116)
        at org.codehaus.groovy.grails.cli.ScriptNameResolver.resolvesTo(ScriptNa
meResolver.groovy:30)
        at org.codehaus.groovy.grails.cli.GrailsScriptRunner.getPotentialScripts
(GrailsScriptRunner.java:489)
        at org.codehaus.groovy.grails.cli.GrailsScriptRunner.executeScriptWithCa
ching(GrailsScriptRunner.java:429)
        at org.codehaus.groovy.grails.cli.GrailsScriptRunner.executeScriptWithCa
ching(GrailsScriptRunner.java:416)
        at org.codehaus.groovy.grails.cli.GrailsScriptRunner$executeScriptWithCa
ching.call(Unknown Source)
        at org.codehaus.groovy.grails.cli.interactive.InteractiveMode.parseAndEx
ecute(InteractiveMode.groovy:280)
        at org.codehaus.groovy.grails.cli.interactive.InteractiveMode$parseAndEx
ecute.callCurrent(Unknown Source)
        at org.codehaus.groovy.grails.cli.interactive.InteractiveMode.run(Intera
ctiveMode.groovy:133)
        at org.codehaus.groovy.grails.cli.interactive.InteractiveMode$run.call(U
nknown Source)
        at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSi
teArray.java:45)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCa
llSite.java:108)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCa
llSite.java:112)
        at RunApp$_run_closure7_closure11.doCall(RunApp:127)
        at RunApp$_run_closure7_closure11.doCall(RunApp)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.
java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
sorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.springsource.loaded.ri.ReflectiveInterceptor.jlrMethodInvoke(Refl
ectiveInterceptor.java:1243)
        at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:
90)
        at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:233)
        at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1082)
        at groovy.lang.ExpandoMetaClass.invokeMethod(ExpandoMetaClass.java:1106)

        at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:906)
        at groovy.lang.Closure.call(Closure.java:412)
        at groovy.lang.Closure.call(Closure.java:406)
        at groovy.lang.Closure.run(Closure.java:490)
        at java.lang.Thread.run(Thread.java:662)
| Error Error running script --stacktrace --verbose: Cannot invoke method findAl
l() on null object

Here is the repositories block from my BuildConfig.groovy file:

repositories {
    inherits true // Whether to inherit repository definitions from plugins

    grailsPlugins()
    grailsHome()
    grailsCentral()

    mavenLocal()
    mavenCentral()

    // uncomment these (or add new ones) to enable remote dependency resolution from public Maven repositories
    mavenRepo "http://snapshots.repository.codehaus.org"
    mavenRepo "http://repository.codehaus.org"
    mavenRepo "http://download.java.net/maven/2/"
    mavenRepo "http://repository.jboss.com/maven2/"
}
like image 678
Stephan B Avatar asked Mar 06 '13 12:03

Stephan B


People also ask

How do I use Firebird database?

SQL> CONNECT "/databases/firebird/MY_EMPLOYEE.FDB" If connecting remotely (using TCP/IP), use the CONNECT statement with the server name and complete file path of the database or, an alias. When using the full path, remember to ensure that the server name is separated from the database path with a colon.

What is Firebird project?

The Firebird Project is a commercially independent project of C and C++ programmers, technical advisors and supporters developing and enhancing a multi-platform relational database management system based on the source code released by Inprise Corp (now known as Borland Software Corp) on 25 July, 2000.


1 Answers

You are probably missing a required dependency of Jaybird. You need to include the connector-api-1.5.jar (in the lib folder of the Jaybird distribution) on the classpath. The alternative is to use jaybird-full-2.2.2.jar (which includes the classes of connector-api-1.5.jar).

EDIT

Out of some curiosity, I installed grails and gave it a go. I initially also got a similar error (using grails console) and the stacktrace showed me java.lang.NoClassDefFoundError: javax/resource/ResourceException. It looks like grails - contrary to the documentation - does not retrieve transitive dependencies (this was a wong, see EDIT 2).

After I explicitly added a runtime dependency on 'javax.resource:connector-api:1.5', eg:

dependencies {
    // specify dependencies here under either 'build', 'compile', 'runtime', 'test' or 'provided' scopes e.g.

    // runtime 'mysql:mysql-connector-java:5.1.22'
    runtime 'org.firebirdsql.jdbc:jaybird-jdk17:2.2.2',
            'javax.resource:connector-api:1.5'
}

With this additional dependency it worked. As the connector-api is normally provided by an application server, it might be better to specify this one as provided instead (you might want to check with your actual deployment environment).

If you need support for retrieval of generated keys (or Gorm might need it), then I'd suggest you also add 'org.antlr:antlr-runtime:3.4' (as a runtime dependency).

EDIT 2

After some additional testing, it looks like first installing the downloaded jaybird libraries into lib, and then declaring a dependency will make ivy create a dependency on that local library instead of retrieving it from maven. After removing the jaybird library from the lib folder and removing the org.firebirdsql.jdbc folder from my Ivy cache it correctly downloaded it from Maven, including the connector-api dependency.

like image 78
Mark Rotteveel Avatar answered Sep 23 '22 06:09

Mark Rotteveel