Using secondary datasources in Grails 3

Something changed in Grails 3 and how datasources are configured.

If you have datasources defined like this:

   dataSources:
       dataSource:
           pooled: true
           jmxExport: true
           driverClassName: org.h2.Driver
           username: sa
           password:
           dbCreate: create-drop
           url: jdbc:h2:mem:devDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE
       secondary:
           pooled: true
           jmxExport: true
           driverClassName: org.h2.Driver
           username: sa
           password:
           dbCreate: create-drop
           url: jdbc:h2:mem:devDb2;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE

 

You can use the “other datasource” (secondary) in a Grails domain class very simply:

   class Book {
   
       String title
   
       static constraints = {
       }
   
       static mapping = {
           datasource 'secondary'
       }
   }
   

And you can use the dataSource object by name in a Grails service like this:

   class MyService {
   
      def dataSource
   .....
   }
   

So you would think that the following would work:

   class MyService {
   
      def secondary
   .....
   }

but it doesn’t… Grails doesn’t know how to wire that secondary datasource so it’s null.

Instead, you have to put it in the resources.groovy or use Spring’s @Autowired on it like so:

   class BookSqlSecondaryService {
   
      @Autowired
      @Qualifier('dataSource_secondary')
      def secondary
   }
   

The documentation will be updated in Grails 3.2 but it’s still the case in Grails 3.0.x and Grails 3.1.x.

One thought on “Using secondary datasources in Grails 3

  1. Wayne Vetrone says:

    I am unable to use Qualifier in my Grails 3.1.4 project. Any suggestions?

    startup failed:
    C:\gcprime_local\gcprime-3\gcprime\grails-app\services\adminrequest\BasicReports
    Service.groovy: 11: unable to resolve class Qualifier , unable to find class fo
    r annotation
    @ line 11, column 1.
    @Qualifier(‘dataSource_workflow’)
    ^

    I have added the following imports and that did not help

    import org.springframework.beans.factory.annotation.Autowired
    import org.springframework.beans.factory.annotation.Qualifier

    1. Dave — I hadn’t used this in Grails 3.1 before (I was in the 3.0 world)… AL (below ) said it worked in Grails 3.1.8… so maybe upgrade your Grails version?

  2. Al H. says:

    Thank you very much Mike! After a couple hours trying to figure out how to get this done in Grails 3, your advice did the trick. Note that I’m using Grails 3.1.8, so I didn’t run into the issue that Wayne did in the previous post.

Leave a Reply

Your email address will not be published. Required fields are marked *

*

*