grails-core
grails-core copied to clipboard
Problem With Multiple Datasources
grails-app/conf/application.yml#L100-L110
dataSource:
pooled: true
jmxExport: true
driverClassName: org.h2.Driver
username: sa
password:
dataSources:
cars:
dbCreate: create-drop
url: jdbc:h2:./carsDB;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE
grails-app/domain/datasourcesdemo/Car.groovy
package datasourcesdemo
class Car {
String name
static mapping = {
datasource 'cars'
}
}
grails-app/services/datasourcesdemo/CarService.groovy
package datasourcesdemo
import grails.gorm.services.Service
import grails.gorm.transactions.Transactional
@Service(Car)
@Transactional(connection='cars')
interface CarService {
Car get(Serializable id)
List<Car> list(Map args)
Long count()
void delete(Serializable id)
Car save(Car car)
}
If I attempt to save new a Car instance using the scaffolding in that project an exception is thrown:
2021-05-04 08:58:48.792 ERROR --- [nio-8080-exec-9] o.g.web.errors.GrailsExceptionResolver : HibernateException occurred when processing request: [POST] /car/save - parameters:
name: Name
create: Create
No Session found for current thread. Stacktrace follows:
java.lang.reflect.InvocationTargetException: null
at org.grails.core.DefaultGrailsControllerClass$ReflectionInvoker.invoke(DefaultGrailsControllerClass.java:211)
at org.grails.core.DefaultGrailsControllerClass.invoke(DefaultGrailsControllerClass.java:188)
at org.grails.web.mapping.mvc.UrlMappingsInfoHandlerAdapter.handle(UrlMappingsInfoHandlerAdapter.groovy:90)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
at org.grails.web.servlet.mvc.GrailsWebRequestFilter.doFilterInternal(GrailsWebRequestFilter.java:77)
at org.grails.web.filters.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:67)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Caused by: org.springframework.dao.DataAccessResourceFailureException: Could not obtain current Hibernate Session; nested exception is org.hibernate.HibernateException: No Session found for current thread
at org.grails.orm.hibernate.GrailsHibernateTemplate.getSession(GrailsHibernateTemplate.java:335)
at org.grails.orm.hibernate.GrailsHibernateTemplate.doExecute(GrailsHibernateTemplate.java:284)
at org.grails.orm.hibernate.GrailsHibernateTemplate.execute(GrailsHibernateTemplate.java:241)
at org.grails.orm.hibernate.GrailsHibernateTemplate.execute(GrailsHibernateTemplate.java:120)
at org.grails.orm.hibernate.AbstractHibernateGormValidationApi.validate(AbstractHibernateGormValidationApi.groovy:78)
at org.grails.orm.hibernate.AbstractHibernateGormValidationApi.validate(AbstractHibernateGormValidationApi.groovy:51)
at org.grails.orm.hibernate.AbstractHibernateGormValidationApi.validate(AbstractHibernateGormValidationApi.groovy:50)
at org.grails.datastore.gorm.GormValidateable$Trait$Helper.validate(GormValidateable.groovy:97)
... 13 common frames omitted
Caused by: org.hibernate.HibernateException: No Session found for current thread
at org.grails.orm.hibernate.GrailsSessionContext.currentSession(GrailsSessionContext.java:112)
at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:475)
at org.grails.orm.hibernate.GrailsHibernateTemplate.getSession(GrailsHibernateTemplate.java:333)
... 20 common frames omitted
Environment Information
- Grails Version: 4.0.10
- JDK Version: openjdk version "1.8.0_202"
Example Application
I looked into it quickly and it seems to be failing with validation which occurs because of using Domain class as command object.
Meanwhile, I am looking into this, you can workaround by adding the following on the Controller action:
./grails-app/controllers/datasourcesdemo/CarController.groovy
@Transactional(connection='cars')
def save(Car car) {
...
FYI... I updated the linked project to 5.1.7 and the same issue appears there using GORM 7.2.1.