当我尝试第二次访问多租户域‘成员’时,我得到了一个“池连接已经关闭”的问题。我在MySQL数据库中使用Grails3.3.11。我不知道我做错了什么。
I有一个控制器定义如下-
@CurrentTenant
class GroupController{
def save(){
groupService.getMember()
groupService.updateMember()
}
}I有一个定义为-的服务
@Transactional
class GroupService{
def getMember(){
return Member.createCriteria().list{
eq('customer','test')
}
}
def updateMember(){
Member.executeUpdate("Update member set group='testGroup'")
}
}当我点击updatemember()函数时,我得到了以下错误-
PooledConnection has already been closed.. Stacktrace follows:
java.lang.reflect.InvocationTargetException
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:967)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
at org.springframework.boot.web.filter.ApplicationContextHeaderFilter.doFilterInternal(ApplicationContextHeaderFilter.java:54)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:317)
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:127)
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:91)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:114)
at grails.plugin.springsecurity.web.UpdateRequestContextHolderExceptionTranslationFilter.doFilter(UpdateRequestContextHolderExceptionTranslationFilter.groovy:64)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at grails.plugin.springsecurity.web.filter.GrailsHttpPutFormContentFilter.doFilterInternal(GrailsHttpPutFormContentFilter.groovy:54)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at grails.plugin.springsecurity.web.filter.GrailsAnonymousAuthenticationFilter.doFilter(GrailsAnonymousAuthenticationFilter.groovy:54)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter.doFilter(RememberMeAuthenticationFilter.java:158)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:170)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.deerwalk.impl.CustomCasAuthenticationFilter.doFilter(CustomCasAuthenticationFilter.java:119)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at grails.plugin.springsecurity.web.authentication.logout.MutableLogoutFilter.doFilter(MutableLogoutFilter.groovy:64)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at grails.plugin.springsecurity.web.SecurityRequestHolderFilter.doFilter(SecurityRequestHolderFilter.groovy:58)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:214)
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:177)
at org.grails.web.servlet.mvc.GrailsWebRequestFilter.doFilterInternal(GrailsWebRequestFilter.java:77)
at org.grails.web.filters.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:67)
at org.jasig.cas.client.session.SingleSignOutFilter.doFilter(SingleSignOutFilter.java:97)
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)I正在使用多个数据源,它们被定义为-
dataSource:
pooled: true
driverClassName: com.mysql.cj.jdbc.Driver
#dbCreate: "update"
url: jdbc:mysql://localhost:3306/index?zeroDateTimeBehavior=convertToNull&autoReconnect=true&relaxAutoCommit=true&useSSL=false
username: root
password: root
properties:
initialSize: 5
maxActive: 100
minIdle: 5
maxIdle: 25
maxWait: 10000
maxAge: 10 * 60000
timeBetweenEvictionRunsMillis: 1800000
minEvictableIdleTimeMillis: 1800000
validationQuery: "SELECT 1"
validationInterval: 15000
testWhileIdle: true
testOnBorrow: true
testOnReturn: false
jdbcInterceptors: ConnectionState
defaultTransactionIsolation: java.sql.Connection.TRANSACTION_READ_COMMITTED
dataSources:
shard1:
url: jdbc:mysql://localhost:3306/shard1?zeroDateTimeBehavior=convertToNull&autoReconnect=true&relaxAutoCommit=true&useSSL=false
dbCreate: none
shard2:
url: jdbc:mysql://localhost:3306/shard2?zeroDateTimeBehavior=convertToNull&autoReconnect=true&relaxAutoCommit=true&useSSL=false
dbCreate: none发布于 2021-11-02 10:24:32
尝试在控制器和服务之间引入一个额外的层。创建一个将由控制器调用的新类,并在新类中添加引入currentTenant注释,我过去已经以类似的方式解决了这个问题,但是我不知道为什么会解决这个问题。
例:-
class GroupController{
def save(){
new GroupHandler().handleSave();
}
}
@CurrentTenant
class GroupHandler{
def groupService // initialize service bean here
def handleSave(){
groupService.getMember()
groupService.updateMember()
}
}https://stackoverflow.com/questions/69808378
复制相似问题