2017-09-04 155 views
0

我在基於Spring框架的Java應用程序上升級P6SPY。 當前的p6spy版本是2.1.4,我們至少需要版本3.0.0(或3.2.0)。p6spy 3.x配置(避免在類com.p6spy.engine.wrapper.ConnectionWrapper中沒有可見的構造函數)

當我在pom.xml和部署的應用程序中更改了版本後,出現了一些AOP錯誤。

No visible constructors in class com.p6spy.engine.wrapper.ConnectionWrapper 

我們而言configuation是:

<jee:jndi-lookup id="myDataSource" jndi-name="jdbc/ourDS" resource-ref="true"/> 

<bean id="monitoringDataSource" class="com.p6spy.engine.spy.P6DataSource"> 
    <constructor-arg ref="myDataSource" /> 
</bean> 

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="dataSource" ref="monitoringDataSource" /> 
    <property name="persistenceProviderClass" value="org.hibernate.ejb.HibernatePersistence" /> 
    <property name="jpaProperties"> 
     <props> 
      <prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop> 
      <prop key="hibernate.jdbc.batch_size">0</prop> 
      <prop key="hibernate.jdbc.fetch_size">20</prop> 
      <prop key="hibernate.jdbc.use_streams_for_binary">true</prop> 
      <prop key="hibernate.jdbc.use_get_generated_keys">true</prop> 
      <prop key="hibernate.connection.isolation">2</prop> 
      <prop key="hibernate.cache.provider_class">net.sf.ehcache.hibernate.EhCacheProvider</prop> 
      <prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</prop> 
      <prop key="hibernate.cache.use_query_cache">true</prop> 
      <prop key="hibernate.cache.use_second_level_cache">true</prop> 
      <prop key="hibernate.generate_statistics">true</prop> 
      <prop key="hibernate.show_sql">false</prop> 
      <prop key="hibernate.id.new_generator_mappings">true</prop> 
      <prop key="javax.persistence.sharedCache.mode">ENABLE_SELECTIVE</prop> 
      <prop key="org.hibernate.envers.audit_table_suffix">_VER</prop> 
      <prop key="org.hibernate.envers.store_data_at_delete">true</prop> 
      <prop key="hibernate.session.events.log">false</prop> 
     </props> 
    </property> 
    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/> 
    </property> 
    <property name="jpaDialect"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect"/> 
    </property> 
    <property name="packagesToScan"> 
     <list> 
      <value>omitted</value> 
      <value>omitted</value> 
     </list> 
    </property> 
</bean> 

一些錯誤配置?我已經搜索了這個問題,什麼都沒發現。

過了一段時間,我意識到什麼可能是一個問題。 我們使用這個類作爲看點:

package mypackage.db.aspect; 

import mypackage.db.security.SecurityHolder; 
import java.lang.reflect.Method; 
import java.sql.CallableStatement; 
import java.sql.Connection; 
import java.sql.SQLException; 
import org.aspectj.lang.ProceedingJoinPoint; 
import org.aspectj.lang.annotation.Around; 
import org.aspectj.lang.annotation.Aspect; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
import org.springframework.aop.MethodBeforeAdvice; 
import org.springframework.aop.aspectj.AspectJExpressionPointcutAdvisor; 
import org.springframework.aop.framework.ProxyFactory; 
import org.springframework.stereotype.Component; 

@Component 
@Aspect 
public class ClientIdentifierAspect { 

    private static Logger log = LoggerFactory.getLogger(ClientIdentifierAspect.class); 

    @Around("execution(* javax.sql.DataSource.getConnection(..))") 
    public Connection onNewConnection(final ProceedingJoinPoint pjp) throws Throwable { 
     Connection connection = (Connection) pjp.proceed(pjp.getArgs()); 
     if (connection != null) { 
      String loginName = SecurityHolder.getOwner() != null ? SecurityHolder.getOwner().getLoginName() : ""; 
      //loginName = loginName.replaceAll("'", "''"); 
      try (CallableStatement cs = connection.prepareCall("{ call DBMS_SESSION.SET_IDENTIFIER(?) }")) { 
       cs.setString(1, loginName); 
       cs.execute(); 

       // proxy trida pro smazani identifieru pri uzavirani spojeni 
       // viz https://beautifulbytes.wordpress.com/2013/01/21/use-spring-aop-and-jmx-to-monitor-and-cancel-jdbc-statements/ 
       ProxyFactory factory = new ProxyFactory(); 
       factory.setProxyTargetClass(true); 
       factory.setTarget(connection); 
       AspectJExpressionPointcutAdvisor aspectJExpressionPointcutAdvisor = new AspectJExpressionPointcutAdvisor(); 
       aspectJExpressionPointcutAdvisor.setExpression("execution (* java.sql.Connection.close(..))"); 
       aspectJExpressionPointcutAdvisor.setAdvice(new MethodBeforeAdvice() { 
        @Override 
        public void before(Method method, Object[] args, Object target) throws Throwable { 
         Connection con = (Connection) target; 
         try (CallableStatement cs = con.prepareCall("{ call DBMS_SESSION.CLEAR_IDENTIFIER() }")) { 
          cs.execute(); 
         } catch (SQLException ex) { 
          throw ex; 
         } 
        } 
       } 
       ); 
       factory.addAdvisor(aspectJExpressionPointcutAdvisor); 
       ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader(); 
       connection = (Connection) factory.getProxy(contextClassLoader); 
      } catch (SQLException ex) { 
       throw ex; 
      } catch (Exception ex) { 
       log.error("", ex); 
      } 
     } 
     return connection; 
    } 
} 

的一點是,我們需要知道,哪些用戶在做數據庫的一些動作。每次獲得連接時拋出異常。 有沒有另一種方法如何讓這個工作? 的例外是:

ERROR mypackage.db.aspect.ClientIdentifierAspect- 
org.springframework.aop.framework.AopConfigException: Could not generate CGLIB subclass of class [class com.p6spy.engine.wrapper.ConnectionWrapper]: Common causes of this problem include using a final class or a non-visible class; nested exception is java.lang.IllegalArgumentException: No visible constructors in class com.p6spy.engine.wrapper.ConnectionWrapper 
    at org.springframework.aop.framework.CglibAopProxy.getProxy(CglibAopProxy.java:212) ~[spring-aop-4.2.1.RELEASE.jar:?] 
    at org.springframework.aop.framework.ProxyFactory.getProxy(ProxyFactory.java:109) ~[spring-aop-4.2.1.RELEASE.jar:?] 
    at mypackage.db.aspect.ClientIdentifierAspect.onNewConnection(ClientIdentifierAspect.java:61) [orionutil-db-2.34-SNAPSHOT.jar:?] 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_51] 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_51] 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_51] 
    at java.lang.reflect.Method.invoke(Method.java:497) ~[?:1.8.0_51] 
    at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:621) [spring-aop-4.2.1.RELEASE.jar:?] 
    at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:610) [spring-aop-4.2.1.RELEASE.jar:?] 
    at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:68) [spring-aop-4.2.1.RELEASE.jar:?] 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) [spring-aop-4.2.1.RELEASE.jar:?] 
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) [spring-aop-4.2.1.RELEASE.jar:4.2.1.RELEASE] 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) [spring-aop-4.2.1.RELEASE.jar:?] 
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207) [spring-aop-4.2.1.RELEASE.jar:?] 
    at com.sun.proxy.$Proxy108.getConnection(Unknown Source) [?:?] 
    at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122) [hibernate-core-5.0.1.Final.jar:5.0.1.Final] 
    at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcEnvironmentInitiator.java:180) [hibernate-core-5.0.1.Final.jar:5.0.1.Final] 
    at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:68) [hibernate-core-5.0.1.Final.jar:5.0.1.Final] 
    at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:35) [hibernate-core-5.0.1.Final.jar:5.0.1.Final] 
    at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:88) [hibernate-core-5.0.1.Final.jar:5.0.1.Final] 
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:234) [hibernate-core-5.0.1.Final.jar:5.0.1.Final] 
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:208) [hibernate-core-5.0.1.Final.jar:5.0.1.Final] 
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:189) [hibernate-core-5.0.1.Final.jar:5.0.1.Final] 
    at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.configure(JdbcServicesImpl.java:51) [hibernate-core-5.0.1.Final.jar:5.0.1.Final] 
    at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:94) [hibernate-core-5.0.1.Final.jar:5.0.1.Final] 
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:217) [hibernate-core-5.0.1.Final.jar:5.0.1.Final] 
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:189) [hibernate-core-5.0.1.Final.jar:5.0.1.Final] 
    at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.handleTypes(MetadataBuildingProcess.java:352) [hibernate-core-5.0.1.Final.jar:5.0.1.Final] 
    at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:111) [hibernate-core-5.0.1.Final.jar:5.0.1.Final] 
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:770) [hibernate-entitymanager-5.0.1.Final.jar:?] 
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:797) [hibernate-entitymanager-5.0.1.Final.jar:?] 
    at org.hibernate.jpa.HibernatePersistenceProvider.createContainerEntityManagerFactory(HibernatePersistenceProvider.java:135) [hibernate-entitymanager-5.0.1.Final.jar:?] 
    at org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:50) [hibernate-entitymanager-5.0.1.Final.jar:?] 
    at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:343) [spring-orm-4.2.1.RELEASE.jar:4.2.1.RELEASE] 
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:318) [spring-orm-4.2.1.RELEASE.jar:4.2.1.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1637) [spring-beans-4.2.1.RELEASE.jar:?] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1574) [spring-beans-4.2.1.RELEASE.jar:?] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545) [spring-beans-4.2.1.RELEASE.jar:?] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) [spring-beans-4.2.1.RELEASE.jar:?] 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:305) [spring-beans-4.2.1.RELEASE.jar:?] 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) [spring-beans-4.2.1.RELEASE.jar:?] 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:301) [spring-beans-4.2.1.RELEASE.jar:?] 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:196) [spring-beans-4.2.1.RELEASE.jar:?] 
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1045) [spring-context-4.2.1.RELEASE.jar:?] 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:824) [spring-context-4.2.1.RELEASE.jar:?] 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:537) [spring-context-4.2.1.RELEASE.jar:?] 
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:446) [spring-web-4.2.1.RELEASE.jar:4.2.1.RELEASE] 
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:328) [spring-web-4.2.1.RELEASE.jar:4.2.1.RELEASE] 
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107) [spring-web-4.2.1.RELEASE.jar:4.2.1.RELEASE] 
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4729) [catalina.jar:8.0.24] 
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5167) [catalina.jar:8.0.24] 
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) [catalina.jar:8.0.24] 
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:725) [catalina.jar:8.0.24] 
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:701) [catalina.jar:8.0.24] 
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:717) [catalina.jar:8.0.24] 
    at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:586) [catalina.jar:8.0.24] 
    at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:460) [catalina.jar:8.0.24] 
    at org.apache.catalina.startup.HostConfig.check(HostConfig.java:1556) [catalina.jar:8.0.24] 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_51] 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_51] 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_51] 
    at java.lang.reflect.Method.invoke(Method.java:497) ~[?:1.8.0_51] 
    at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:300) [tomcat-coyote.jar:8.0.24] 
    at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819) [?:1.8.0_51] 
    at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801) [?:1.8.0_51] 
    at org.apache.catalina.manager.ManagerServlet.check(ManagerServlet.java:1460) [catalina.jar:8.0.24] 
    at org.apache.catalina.manager.ManagerServlet.deploy(ManagerServlet.java:906) [catalina.jar:8.0.24] 
    at org.apache.catalina.manager.ManagerServlet.doGet(ManagerServlet.java:344) [catalina.jar:8.0.24] 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:622) [servlet-api.jar:?] 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) [servlet-api.jar:?] 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291) [catalina.jar:8.0.24] 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) [catalina.jar:8.0.24] 
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) [tomcat-websocket.jar:8.0.24] 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) [catalina.jar:8.0.24] 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) [catalina.jar:8.0.24] 
    at org.apache.catalina.filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:108) [catalina.jar:8.0.24] 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) [catalina.jar:8.0.24] 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) [catalina.jar:8.0.24] 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219) [catalina.jar:8.0.24] 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) [catalina.jar:8.0.24] 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:614) [catalina.jar:8.0.24] 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142) [catalina.jar:8.0.24] 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) [catalina.jar:8.0.24] 
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:617) [catalina.jar:8.0.24] 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) [catalina.jar:8.0.24] 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518) [catalina.jar:8.0.24] 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091) [tomcat-coyote.jar:8.0.24] 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:668) [tomcat-coyote.jar:8.0.24] 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1527) [tomcat-coyote.jar:8.0.24] 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1484) [tomcat-coyote.jar:8.0.24] 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [?:1.8.0_51] 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [?:1.8.0_51] 
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-util.jar:8.0.24] 
    at java.lang.Thread.run(Thread.java:745) [?:1.8.0_51] 
Caused by: java.lang.IllegalArgumentException: No visible constructors in class com.p6spy.engine.wrapper.ConnectionWrapper 
    at org.springframework.cglib.proxy.Enhancer.filterConstructors(Enhancer.java:531) ~[spring-core-4.2.1.RELEASE.jar:?] 
    at org.springframework.cglib.proxy.Enhancer.generateClass(Enhancer.java:448) ~[spring-core-4.2.1.RELEASE.jar:?] 
    at org.springframework.cglib.transform.TransformingClassGenerator.generateClass(TransformingClassGenerator.java:33) ~[spring-core-4.2.1.RELEASE.jar:?] 
    at org.springframework.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25) ~[spring-core-4.2.1.RELEASE.jar:4.2.1.RELEASE] 
    at org.springframework.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:216) ~[spring-core-4.2.1.RELEASE.jar:4.2.1.RELEASE] 
    at org.springframework.cglib.proxy.Enhancer.createHelper(Enhancer.java:377) ~[spring-core-4.2.1.RELEASE.jar:?] 
    at org.springframework.cglib.proxy.Enhancer.createClass(Enhancer.java:317) ~[spring-core-4.2.1.RELEASE.jar:?] 
    at org.springframework.aop.framework.ObjenesisCglibAopProxy.createProxyClassAndInstance(ObjenesisCglibAopProxy.java:55) ~[spring-aop-4.2.1.RELEASE.jar:?] 
    at org.springframework.aop.framework.CglibAopProxy.getProxy(CglibAopProxy.java:202) ~[spring-aop-4.2.1.RELEASE.jar:?] 
+0

在p6spy 2.1.4版中,沒有出現問題 – Worsik

+0

可以通過JdbcEventListener而不是Aspect類來完成嗎? https://github.com/p6spy/p6spy/blob/master/src/main/java/com/p6spy/engine/event/JdbcEventListener.java – Worsik

回答

0

暫時,我能解決這個問題,但不是我所期望的方式。 對於幾乎正確的行爲,我需要檢查連接是否被p6spy a包裝,並在這種情況下,打開連接,添加通知對象並重新包裝。

 try (CallableStatement cs = connection.prepareCall("{ call DBMS_SESSION.SET_IDENTIFIER(?) }")) { 
      cs.setString(1, loginName); 
      cs.execute(); 

      AspectJExpressionPointcutAdvisor aspectJExpressionPointcutAdvisor = new AspectJExpressionPointcutAdvisor(); 
      aspectJExpressionPointcutAdvisor.setExpression("execution (* java.sql.Connection.close(..))"); 
      aspectJExpressionPointcutAdvisor.setAdvice(new MethodBeforeAdvice() { 
       @Override 
       public void before(Method method, Object[] args, Object target) throws Throwable { 
        Connection con = (Connection) target; 
        try (CallableStatement cs = con.prepareCall("{ call DBMS_SESSION.CLEAR_IDENTIFIER() }")) { 
         log.info("p6spy\n{ call DBMS_SESSION.CLEAR_IDENTIFIER() }"); 
         cs.execute(); 
        } catch (SQLException ex) { 
         throw ex; 
        } 
       } 
      }); 
      // proxy trida pro smazani identifieru pri uzavirani spojeni 
      // viz https://beautifulbytes.wordpress.com/2013/01/21/use-spring-aop-and-jmx-to-monitor-and-cancel-jdbc-statements/ 
      ProxyFactory factory = new ProxyFactory(); 
      boolean wrapBack = false; 
      ConnectionInformation ci = null; 
      if (connection instanceof ConnectionWrapper) { 
       ConnectionWrapper w = (ConnectionWrapper) connection; 
       ci = w.getConnectionInformation(); 
       Connection unwrap = (Connection) w.unwrapP6SpyProxy(); 
       factory.setProxyTargetClass(false); 
       factory.setTarget(unwrap); 
       wrapBack = true; 
      } else { 
       factory.setProxyTargetClass(true); 
       factory.setTarget(connection); 
      } 
      ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader(); 
      factory.addAdvisor(aspectJExpressionPointcutAdvisor); 
      connection = (Connection) factory.getProxy(contextClassLoader); 
      if (wrapBack && ci != null) { 
       connection = P6Core.wrapConnection(connection, ci); 
      } 

     } catch (SQLException ex) { 
      throw ex; 
     } catch (Exception ex) { 
      log.error("", ex); 
     } 

唯一的問題我已經是,現在只有未在日誌中寫SQL查詢,就是調用DBMS_SESSION.CLEAR_IDENTIFIER()。我想這是因爲建議對象被添加到解包的連接。

如果有人發現如何正確解決它,請回答。

+0

問題https://github.com/p6spy/p6spy/issues/ 401有人寫道,在p6spy版本3.3.0應該是ConnectorWrapper的公共構造函數。 – Worsik

相關問題