我有一个连接到云扳手数据库的SpringBoot Java应用程序。不存在w.r.t连接问题,也可以将数据读写到表中,但是在Dynatrace中检查W.r.t连接/跟踪级别日志时,我可以看到,每次调用Spanner都会抛出一个异常。是否有任何配置的扳手,我错过了,或它是什么,我应该担心,如何解决这个问题,如果是一个问题?请帮帮忙。
下面是我的代码中使用的扳手依赖项-
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>google-cloud-spanner</artifactId>
<version>6.10.1</version>
<scope>compile</scope>
</dependency>以下是例外细节-
(我故意隐藏了一些类--你知道的客户保密信息-)
Exception:
com.google.cloud.spanner.SessionPool$LeakedSessionException
Message:
Session was checked out from the pool at 2022-07-13T17:50:07.372Z
Stacktrace:
com.google.cloud.spanner.SessionPool$PooledSessionFuture.markCheckedOut(SessionPool.java:1093)
com.google.cloud.spanner.SessionPool$PooledSessionFuture.access$
com.google.cloud.spanner.SessionPool.checkoutSession(SessionPool.java:2037)
com.google.cloud.spanner.SessionPool.getSession(SessionPool.java:2018)
com.google.cloud.spanner.DatabaseClientImpl.getSession(DatabaseClientImpl.java:53)
com.google.cloud.spanner.DatabaseClientImpl.singleUse(DatabaseClientImpl.java:101)
com.google.cloud.spring.data.spanner.core.SpannerTemplate$$Lambda$.get
com.google.cloud.spring.data.spanner.core.SpannerTemplate.doWithOrWithoutTransactionContext(SpannerTemplate.java:643)
com.google.cloud.spring.data.spanner.core.SpannerTemplate.getReadContext(SpannerTemplate.java:126)
com.google.cloud.spring.data.spanner.core.SpannerTemplate.performQuery(SpannerTemplate.java:485)
com.google.cloud.spring.data.spanner.core.SpannerTemplate.executeQuery(SpannerTemplate.java:448)
com.<INTENTIONALLY HIDDEN PROJECT SPECIFIC CLASS>.getResponse(<INTENTIONALLY HIDDEN PROJECT SPECIFIC CLASS>.java:36)
com.<INTENTIONALLY HIDDEN PROJECT SPECIFIC CLASS>$$FastClassBySpringCGLIB$$c883d7ab.invoke(<generated>)
org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:783)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:753)
org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:753)
org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:698)
com.<INTENTIONALLY HIDDEN PROJECT SPECIFIC CLASS>$$EnhancerBySpringCGLIB$$.getResponse
com.<INTENTIONALLY HIDDEN PROJECT SPECIFIC CLASS>.processGetRequest(<INTENTIONALLY HIDDEN PROJECT SPECIFIC CLASS>.java:50)
com.<INTENTIONALLY HIDDEN PROJECT SPECIFIC CLASS>$$FastClassBySpringCGLIB$$cd4920ff.invoke(<generated>)
org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:689)
com.<INTENTIONALLY HIDDEN PROJECT SPECIFIC CLASS>$$EnhancerBySpringCGLIB$$.processGetRequest
com.<INTENTIONALLY HIDDEN PROJECT SPECIFIC CLASS>.<INTENTIONALLY HIDDEN PROJECT SPECIFIC METHOD>(<INTENTIONALLY HIDDEN PROJECT SPECIFIC CLASS>.java:34)
jdk.internal.reflect.NativeMethodAccessorImpl.invoke0
jdk.internal.reflect.NativeMethodAccessorImpl.invoke
jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke
java.lang.reflect.Method.invoke
org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)
org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150)
org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)
org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1067)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)发布于 2022-07-14 05:20:33
我对Dynatrace并不熟悉,所以我不能百分之百肯定它在这个案例中的作用,但我的印象是,在Dynatrace的报告中,这是一个假阳性。
云扳手客户端库在内部使用会话池。当使用签出会话的线程的调用堆栈签出时,此会话池将标记每个会话。这样做是为了更容易地找到,其中会话泄漏来自,如果发生会话泄漏的话。此过程的工作方式如下:
LeakedSessionException以捕获当前线程的调用堆栈:当一个会话签出时调用方法:当会话被签回池时,https://github.com/googleapis/java-spanner/blob/1822a138b254c8645dee629a5a055ba3dfe822a9/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SessionPool.java#L2135LeakedSessionException被清除(当会话关闭时会发生这种情况):https://github.com/googleapis/java-spanner/blob/1822a138b254c8645dee629a5a055ba3dfe822a9/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SessionPool.java#L1282因此,正如您可以从上面看到的,异常将只在正常情况下被创建,而不是抛出或记录。如果您确实有会话泄漏,那么当会话池关闭时,将使用异常抛出或记录错误:https://github.com/googleapis/java-spanner/blob/1822a138b254c8645dee629a5a055ba3dfe822a9/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SessionPool.java#L2275。
关闭应用程序时,Dynatrace是否记录此异常?还是在正常操作中记录?如果后者是这样的话,肯定是来自Dynatrace的假阳性。
https://stackoverflow.com/questions/72972037
复制相似问题