I am upgrading P6SPY on our Java applications based on Spring framework. Current p6spy version is 2.1.4 and we want at least version 3.0.0 (or 3.2.0).

After I changed version in pom.xml and deployed application, some AOP errors appeared.

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

Our context configuation is:

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

Is something wrong with the configuration? I've searched for this problem and found nothing.

After a while I realized what might be a problem. We are using this class as 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;
    }
}

The point is that we need to know, which user did some action in database. Exception is thrown everytime connection is obtained. Is there another way how to get this working? Exception is:

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:?]
1

There are 1 best solutions below

1
On

Temporarily, I was able to solve this issue, but not in the way I would expect. For almost proper behavior, I needed to check if Connection is wrapped by p6spy a and in that case, to unwrap connection, add Advice object and wrap again.

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

Only problem I have is, that now only SQL query which is not written in log, is call DBMS_SESSION.CLEAR_IDENTIFIER(). I guess it's because Advice object was added to unwrapped connection.

If anyone finds out how to solve it properly, please answer.