2017-09-04 4 views
0

Je suis en train de mettre à jour P6SPY sur nos applications Java basées sur Spring framework. La version actuelle de p6spy est 2.1.4 et nous voulons au moins la version 3.0.0 (ou 3.2.0).Configuration p6spy 3.x (éviter Aucun constructeur visible dans la classe com.p6spy.engine.wrapper.ConnectionWrapper)

Après avoir modifié la version dans pom.xml et l'application déployée, certaines erreurs AOP sont apparues.

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

Notre contexte configuation est:

<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> 

un problème avec la configuration? J'ai cherché ce problème et n'ai rien trouvé. Après un moment, j'ai réalisé ce qui pourrait être un problème. Nous utilisons cette classe comme Aspect:

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; 
    } 
} 

Le point est que nous devons savoir, quel utilisateur a fait une action dans la base de données. Une exception est levée à chaque fois que la connexion est obtenue. Existe-t-il un autre moyen de le faire fonctionner? Exception est:

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

Dans la version 2.1.4 de p6spy, aucun problème n'apparaît – Worsik

+0

Cela pourrait-il être fait par JdbcEventListener au lieu de la classe Aspect? https://github.com/p6spy/p6spy/blob/master/src/main/java/com/p6spy/engine/event/JdbcEventListener.java – Worsik

Répondre

0

temporairement, j'ai pu résoudre ce problème, mais pas la façon dont je me attends. Pour un comportement presque correct, je devais vérifier si Connection est enveloppé par p6spy a et, dans ce cas, déballer la connexion, ajouter un objet Advice et revenir à la ligne.

 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); 
     } 

Seul problème, ce que j'ai est, maintenant que la requête SQL qui est pas écrit dans le journal, est d'appeler DBMS_SESSION.CLEAR_IDENTIFIER(). Je suppose que c'est parce que l'objet de conseil a été ajouté à la connexion déballée.

Si quelqu'un découvre comment le résoudre correctement, veuillez répondre.

+0

En cours https://github.com/p6spy/p6spy/issues/ 401 quelqu'un a écrit que dans p6spy version 3.3.0 devrait être constructeur public pour ConnectorWrapper. – Worsik