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.
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
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?
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.
Thank you very much! Saved my work.