Grails async:@subscriber; sqlexception:PoolConnection已经关闭。
我有几个使用Grails async框架的Grails服务,但是在订户方法保存域对象之前,我遇到了冬眠关闭连接的问题。但是,如果短暂睡觉订户线程(100ms),我不会出现错误。有人可以帮我了解发生了什么吗?
服务
package com.my.company
import grails.events.annotation.Publisher
import grails.events.annotation.Subscriber
import grails.gorm.transactions.Transactional
import org.springframework.transaction.TransactionDefinition
import us.cloudcard.api.exception.InvalidResourceException
class AdditionalPhotoService {
S3Service s3Service
AdditionalPhotoDataService additionalPhotoDataService
PhotoService photoService
PhotoDataService photoDataService
FacialRecognitionService facialRecognitionService
@Publisher(Event.ADDITIONAL_PHOTO_CREATED)
@Transactional(rollbackFor = Throwable.class)
AdditionalPhoto create(AdditionalPhoto additionalPhoto) {
additionalPhoto.validate()
if (additionalPhoto.hasErrors())
throw new InvalidResourceException(additionalPhoto.errors)
additionalPhoto.save()
additionalPhoto.externalURL = s3Service.storePhoto(additionalPhoto)
return additionalPhoto
}
byte[] fetchBytes(AdditionalPhoto additionalPhoto) {
if (!additionalPhoto.bytes)
additionalPhoto.bytes = RestUtil.getBytes(additionalPhoto.externalURL)
return additionalPhoto.bytes
}
@Transactional
@Subscriber(Event.ADDITIONAL_PHOTO_CREATED)
void compareToPhoto(AdditionalPhoto additionalPhoto) {
log.debug("comparing faces for additionalPhoto #$additionalPhoto.id")
if (!additionalPhoto.additionalPhotoType.enableFacialRecognition) return
// this method only works if I uncomment this sleep call
// sleep(100)
photo = photo ?: additionalPhoto.person.currentPhoto
additionalPhoto.facialRecognitionScore = facialRecognitionService.compareFaces(photoService.fetchBytes(photo), fetchBytes(additionalPhoto))
additionalPhoto.save()
}
例外
org.springframework.jdbc.UncategorizedSQLException: Hibernate operation: could not prepare statement; uncategorized SQLException for SQL [select person0_.id as id1_18_0_, person0_.version as version2_18_0_, person0_.date_created as date_cre3_18_0_, ... {extraneous query columns removed} ... from person person0_ where person0_.id=?]; SQL state [null]; error code [0]; PooledConnection has already been closed.; nested exception is java.sql.SQLException: PooledConnection has already been closed.
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:89)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81)
at org.grails.orm.hibernate.GrailsHibernateTemplate.convertJdbcAccessException(GrailsHibernateTemplate.java:725)
at org.grails.orm.hibernate.GrailsHibernateTemplate.convertHibernateAccessException(GrailsHibernateTemplate.java:712)
at org.grails.orm.hibernate.GrailsHibernateTemplate.doExecute(GrailsHibernateTemplate.java:301)
at org.grails.orm.hibernate.GrailsHibernateTemplate.get(GrailsHibernateTemplate.java:364)
at org.grails.orm.hibernate.AbstractHibernateGormInstanceApi.autoRetrieveAssocations(AbstractHibernateGormInstanceApi.groovy:325)
at org.grails.orm.hibernate.AbstractHibernateGormInstanceApi.save(AbstractHibernateGormInstanceApi.groovy:146)
at org.grails.datastore.gorm.GormInstanceApi.save(GormInstanceApi.groovy:119)
at org.grails.datastore.gorm.GormEntity$Trait$Helper.save(GormEntity.groovy:100)
at us.cloudcard.api.AdditionalPhoto.save(AdditionalPhoto.groovy)
at us.cloudcard.api.AdditionalPhoto.save(AdditionalPhoto.groovy)
at org.grails.datastore.gorm.GormEntity$save.call(Unknown Source)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:115)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:119)
at us.cloudcard.api.AdditionalPhotoService.compareFaces(AdditionalPhotoService.groovy:109)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:101)
at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:323)
at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:351)
at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.callCurrent(PogoMetaClassSite.java:64)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:176)
at us.cloudcard.api.AdditionalPhotoService$__tt__compareToAdditionalPhoto_closure9.doCall(AdditionalPhotoService.groovy:118)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:101)
at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:323)
at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:263)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1041)
at groovy.lang.Closure.call(Closure.java:405)
at groovy.lang.Closure.call(Closure.java:421)
at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:2330)
at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:2315)
at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:2368)
at org.codehaus.groovy.runtime.dgm$188.invoke(Unknown Source)
at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite$PojoMetaMethodSiteNoUnwrapNoCoerce.invoke(PojoMetaMethodSite.java:244)
at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite.call(PojoMetaMethodSite.java:53)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:115)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:127)
at us.cloudcard.api.AdditionalPhotoService.$tt__compareToAdditionalPhoto(AdditionalPhotoService.groovy:118)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:101)
at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:323)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1217)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1041)
at org.codehaus.groovy.runtime.InvokerHelper.invokePogoMethod(InvokerHelper.java:1011)
at org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:994)
at org.codehaus.groovy.runtime.InvokerHelper.invokeMethodSafe(InvokerHelper.java:97)
at us.cloudcard.api.AdditionalPhotoService$_compareToAdditionalPhoto_closure7.doCall(AdditionalPhotoService.groovy)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:101)
at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:323)
at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:263)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1041)
at groovy.lang.Closure.call(Closure.java:405)
at groovy.lang.Closure.call(Closure.java:421)
at grails.gorm.transactions.GrailsTransactionTemplate$2.doInTransaction(GrailsTransactionTemplate.groovy:94)
at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140)
at grails.gorm.transactions.GrailsTransactionTemplate.execute(GrailsTransactionTemplate.groovy:91)
at us.cloudcard.api.AdditionalPhotoService.compareToAdditionalPhoto(AdditionalPhotoService.groovy)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.springframework.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:282)
at grails.events.subscriber.MethodSubscriber.call(MethodSubscriber.groovy:51)
at org.grails.events.EventSubscriberTrigger.proceed(EventSubscriberTrigger.groovy:34)
at org.grails.events.bus.ExecutorEventBus$_buildNotificationCallable_closure1$_closure3.doCall(ExecutorEventBus.groovy:36)
at org.grails.events.bus.ExecutorEventBus$_buildNotificationCallable_closure1$_closure3.call(ExecutorEventBus.groovy)
at groovy.lang.Closure.run(Closure.java:486)
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
at java.base/java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:264)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:829)
Caused by: java.sql.SQLException: PooledConnection has already been closed.
at org.apache.tomcat.jdbc.pool.DisposableConnectionFacade.invoke(DisposableConnectionFacade.java:87)
at com.sun.proxy.$Proxy115.prepareStatement(Unknown Source)
at jdk.internal.reflect.GeneratedMethodAccessor238.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy$LazyConnectionInvocationHandler.invoke(LazyConnectionDataSourceProxy.java:385)
at com.sun.proxy.$Proxy124.prepareStatement(Unknown Source)
at jdk.internal.reflect.GeneratedMethodAccessor238.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy$TransactionAwareInvocationHandler.invoke(TransactionAwareDataSourceProxy.java:241)
at com.sun.proxy.$Proxy124.prepareStatement(Unknown Source)
at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$5.doPrepare(StatementPreparerImpl.java:149)
at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:176)
at org.hibernate.engine.jdbc.internal.StatementPreparerImpl.prepareQueryStatement(StatementPreparerImpl.java:151)
at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.prepareQueryStatement(AbstractLoadPlanBasedLoader.java:198)
at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeQueryStatement(AbstractLoadPlanBasedLoader.java:162)
at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeLoad(AbstractLoadPlanBasedLoader.java:104)
at org.hibernate.loader.entity.plan.AbstractLoadPlanBasedEntityLoader.load(AbstractLoadPlanBasedEntityLoader.java:259)
at org.hibernate.persister.entity.AbstractEntityPersister.doLoad(AbstractEntityPersister.java:4415)
at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:4405)
at org.hibernate.event.internal.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:569)
at org.hibernate.event.internal.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:537)
at org.hibernate.event.internal.DefaultLoadEventListener.load(DefaultLoadEventListener.java:208)
at org.hibernate.event.internal.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:332)
at org.hibernate.event.internal.DefaultLoadEventListener.doOnLoad(DefaultLoadEventListener.java:108)
at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:74)
at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:113)
at org.hibernate.internal.SessionImpl.fireLoadNoChecks(SessionImpl.java:1184)
at org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:1173)
at org.hibernate.internal.SessionImpl.access$2100(SessionImpl.java:194)
at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.doLoad(SessionImpl.java:2784)
at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.lambda$load$1(SessionImpl.java:2765)
at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.perform(SessionImpl.java:2721)
at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.load(SessionImpl.java:2765)
at org.hibernate.internal.SessionImpl.get(SessionImpl.java:981)
at org.grails.orm.hibernate.GrailsHibernateTemplate.lambda$get$0(GrailsHibernateTemplate.java:364)
at org.grails.orm.hibernate.GrailsHibernateTemplate.doExecute(GrailsHibernateTemplate.java:297)
... 84 common frames omitted
,这有效,但我不想睡
@Transactional
@Subscriber(Event.ADDITIONAL_PHOTO_CREATED)
void compareToPhoto(AdditionalPhoto additionalPhoto) {
log.debug("comparing faces for additionalPhoto #$additionalPhoto.id")
if (!additionalPhoto.additionalPhotoType.enableFacialRecognition) return
// this method only works if I use this sleep call
sleep(100)
photo = photo ?: additionalPhoto.person.currentPhoto
additionalPhoto.facialRecognitionScore = facialRecognitionService.compareFaces(photoService.fetchBytes(photo), fetchBytes(additionalPhoto))
additionalPhoto.save()
}
I have several Grails Services that are using the Grails Async Framework, but I'm running into problems with Hibernate closing the connection before the Subscriber method saves the domain object. However, if sleep the Subscriber thread briefly (100ms), I don't get the error. Can someone please help me understand what's going on?
Service
package com.my.company
import grails.events.annotation.Publisher
import grails.events.annotation.Subscriber
import grails.gorm.transactions.Transactional
import org.springframework.transaction.TransactionDefinition
import us.cloudcard.api.exception.InvalidResourceException
class AdditionalPhotoService {
S3Service s3Service
AdditionalPhotoDataService additionalPhotoDataService
PhotoService photoService
PhotoDataService photoDataService
FacialRecognitionService facialRecognitionService
@Publisher(Event.ADDITIONAL_PHOTO_CREATED)
@Transactional(rollbackFor = Throwable.class)
AdditionalPhoto create(AdditionalPhoto additionalPhoto) {
additionalPhoto.validate()
if (additionalPhoto.hasErrors())
throw new InvalidResourceException(additionalPhoto.errors)
additionalPhoto.save()
additionalPhoto.externalURL = s3Service.storePhoto(additionalPhoto)
return additionalPhoto
}
byte[] fetchBytes(AdditionalPhoto additionalPhoto) {
if (!additionalPhoto.bytes)
additionalPhoto.bytes = RestUtil.getBytes(additionalPhoto.externalURL)
return additionalPhoto.bytes
}
@Transactional
@Subscriber(Event.ADDITIONAL_PHOTO_CREATED)
void compareToPhoto(AdditionalPhoto additionalPhoto) {
log.debug("comparing faces for additionalPhoto #$additionalPhoto.id")
if (!additionalPhoto.additionalPhotoType.enableFacialRecognition) return
// this method only works if I uncomment this sleep call
// sleep(100)
photo = photo ?: additionalPhoto.person.currentPhoto
additionalPhoto.facialRecognitionScore = facialRecognitionService.compareFaces(photoService.fetchBytes(photo), fetchBytes(additionalPhoto))
additionalPhoto.save()
}
Exception
org.springframework.jdbc.UncategorizedSQLException: Hibernate operation: could not prepare statement; uncategorized SQLException for SQL [select person0_.id as id1_18_0_, person0_.version as version2_18_0_, person0_.date_created as date_cre3_18_0_, ... {extraneous query columns removed} ... from person person0_ where person0_.id=?]; SQL state [null]; error code [0]; PooledConnection has already been closed.; nested exception is java.sql.SQLException: PooledConnection has already been closed.
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:89)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81)
at org.grails.orm.hibernate.GrailsHibernateTemplate.convertJdbcAccessException(GrailsHibernateTemplate.java:725)
at org.grails.orm.hibernate.GrailsHibernateTemplate.convertHibernateAccessException(GrailsHibernateTemplate.java:712)
at org.grails.orm.hibernate.GrailsHibernateTemplate.doExecute(GrailsHibernateTemplate.java:301)
at org.grails.orm.hibernate.GrailsHibernateTemplate.get(GrailsHibernateTemplate.java:364)
at org.grails.orm.hibernate.AbstractHibernateGormInstanceApi.autoRetrieveAssocations(AbstractHibernateGormInstanceApi.groovy:325)
at org.grails.orm.hibernate.AbstractHibernateGormInstanceApi.save(AbstractHibernateGormInstanceApi.groovy:146)
at org.grails.datastore.gorm.GormInstanceApi.save(GormInstanceApi.groovy:119)
at org.grails.datastore.gorm.GormEntity$Trait$Helper.save(GormEntity.groovy:100)
at us.cloudcard.api.AdditionalPhoto.save(AdditionalPhoto.groovy)
at us.cloudcard.api.AdditionalPhoto.save(AdditionalPhoto.groovy)
at org.grails.datastore.gorm.GormEntity$save.call(Unknown Source)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:115)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:119)
at us.cloudcard.api.AdditionalPhotoService.compareFaces(AdditionalPhotoService.groovy:109)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:101)
at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:323)
at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:351)
at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.callCurrent(PogoMetaClassSite.java:64)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:176)
at us.cloudcard.api.AdditionalPhotoService$__tt__compareToAdditionalPhoto_closure9.doCall(AdditionalPhotoService.groovy:118)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:101)
at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:323)
at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:263)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1041)
at groovy.lang.Closure.call(Closure.java:405)
at groovy.lang.Closure.call(Closure.java:421)
at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:2330)
at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:2315)
at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:2368)
at org.codehaus.groovy.runtime.dgm$188.invoke(Unknown Source)
at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite$PojoMetaMethodSiteNoUnwrapNoCoerce.invoke(PojoMetaMethodSite.java:244)
at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite.call(PojoMetaMethodSite.java:53)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:115)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:127)
at us.cloudcard.api.AdditionalPhotoService.$tt__compareToAdditionalPhoto(AdditionalPhotoService.groovy:118)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:101)
at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:323)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1217)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1041)
at org.codehaus.groovy.runtime.InvokerHelper.invokePogoMethod(InvokerHelper.java:1011)
at org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:994)
at org.codehaus.groovy.runtime.InvokerHelper.invokeMethodSafe(InvokerHelper.java:97)
at us.cloudcard.api.AdditionalPhotoService$_compareToAdditionalPhoto_closure7.doCall(AdditionalPhotoService.groovy)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:101)
at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:323)
at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:263)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1041)
at groovy.lang.Closure.call(Closure.java:405)
at groovy.lang.Closure.call(Closure.java:421)
at grails.gorm.transactions.GrailsTransactionTemplate$2.doInTransaction(GrailsTransactionTemplate.groovy:94)
at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140)
at grails.gorm.transactions.GrailsTransactionTemplate.execute(GrailsTransactionTemplate.groovy:91)
at us.cloudcard.api.AdditionalPhotoService.compareToAdditionalPhoto(AdditionalPhotoService.groovy)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.springframework.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:282)
at grails.events.subscriber.MethodSubscriber.call(MethodSubscriber.groovy:51)
at org.grails.events.EventSubscriberTrigger.proceed(EventSubscriberTrigger.groovy:34)
at org.grails.events.bus.ExecutorEventBus$_buildNotificationCallable_closure1$_closure3.doCall(ExecutorEventBus.groovy:36)
at org.grails.events.bus.ExecutorEventBus$_buildNotificationCallable_closure1$_closure3.call(ExecutorEventBus.groovy)
at groovy.lang.Closure.run(Closure.java:486)
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
at java.base/java.util.concurrent.FutureTask.run$$capture(FutureTask.java:264)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:829)
Caused by: java.sql.SQLException: PooledConnection has already been closed.
at org.apache.tomcat.jdbc.pool.DisposableConnectionFacade.invoke(DisposableConnectionFacade.java:87)
at com.sun.proxy.$Proxy115.prepareStatement(Unknown Source)
at jdk.internal.reflect.GeneratedMethodAccessor238.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy$LazyConnectionInvocationHandler.invoke(LazyConnectionDataSourceProxy.java:385)
at com.sun.proxy.$Proxy124.prepareStatement(Unknown Source)
at jdk.internal.reflect.GeneratedMethodAccessor238.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy$TransactionAwareInvocationHandler.invoke(TransactionAwareDataSourceProxy.java:241)
at com.sun.proxy.$Proxy124.prepareStatement(Unknown Source)
at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$5.doPrepare(StatementPreparerImpl.java:149)
at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:176)
at org.hibernate.engine.jdbc.internal.StatementPreparerImpl.prepareQueryStatement(StatementPreparerImpl.java:151)
at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.prepareQueryStatement(AbstractLoadPlanBasedLoader.java:198)
at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeQueryStatement(AbstractLoadPlanBasedLoader.java:162)
at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeLoad(AbstractLoadPlanBasedLoader.java:104)
at org.hibernate.loader.entity.plan.AbstractLoadPlanBasedEntityLoader.load(AbstractLoadPlanBasedEntityLoader.java:259)
at org.hibernate.persister.entity.AbstractEntityPersister.doLoad(AbstractEntityPersister.java:4415)
at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:4405)
at org.hibernate.event.internal.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:569)
at org.hibernate.event.internal.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:537)
at org.hibernate.event.internal.DefaultLoadEventListener.load(DefaultLoadEventListener.java:208)
at org.hibernate.event.internal.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:332)
at org.hibernate.event.internal.DefaultLoadEventListener.doOnLoad(DefaultLoadEventListener.java:108)
at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:74)
at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:113)
at org.hibernate.internal.SessionImpl.fireLoadNoChecks(SessionImpl.java:1184)
at org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:1173)
at org.hibernate.internal.SessionImpl.access$2100(SessionImpl.java:194)
at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.doLoad(SessionImpl.java:2784)
at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.lambda$load$1(SessionImpl.java:2765)
at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.perform(SessionImpl.java:2721)
at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.load(SessionImpl.java:2765)
at org.hibernate.internal.SessionImpl.get(SessionImpl.java:981)
at org.grails.orm.hibernate.GrailsHibernateTemplate.lambda$get$0(GrailsHibernateTemplate.java:364)
at org.grails.orm.hibernate.GrailsHibernateTemplate.doExecute(GrailsHibernateTemplate.java:297)
... 84 common frames omitted
This works, but I don't want to have to sleep the thread
@Transactional
@Subscriber(Event.ADDITIONAL_PHOTO_CREATED)
void compareToPhoto(AdditionalPhoto additionalPhoto) {
log.debug("comparing faces for additionalPhoto #$additionalPhoto.id")
if (!additionalPhoto.additionalPhotoType.enableFacialRecognition) return
// this method only works if I use this sleep call
sleep(100)
photo = photo ?: additionalPhoto.person.currentPhoto
additionalPhoto.facialRecognitionScore = facialRecognitionService.compareFaces(photoService.fetchBytes(photo), fetchBytes(additionalPhoto))
additionalPhoto.save()
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论