如何使用OracleConnectionPoolDataSource特定配置P6Spy

时间:2012-11-19 08:31:35

标签: p6spy

我们在项目中使用Oracle连接池机制,因为我们的应用程序使用了一些oracle特定功能。

jetty.xml中数据源的配置如下:

<Call name="addService">
<Arg>
  <New class="org.mortbay.jetty.plus.DefaultDataSourceService">
    <Set name="Name">DataSourceService</Set>

    <Call name="addDataSource">
        <Arg>app_ds</Arg><!--java:comp/env-->
        <Arg>
         <New class="oracle.jdbc.pool.OracleConnectionPoolDataSource">
            <Set name="description">xxxx</Set>
            <Set name="user">xxx</Set>
            <Set name="password">xxxx</Set>
            <Set name="loginTimeout">xxx</Set>
            <Set name="URL">jdbc:oracle:thin:@localhost:1521:xxx</Set>
        </New>
      </Arg>
    </Call>
     <Call name="start"/>
 </New>

  

现在我们如何将这个数据源与P6Spy集成,以便P6Spy可以将所有SQL语句打印到控制台上......?

我之前使用P6spy和其他数据源一样,比如spring的DriverManagerDataSource,其他数据源如

(在Tomcat中)

Resource name="jdbc/test" auth="Container"
      type="javax.sql.DataSource" driverClassName="oracle.jdbc.driver.OracleDriver"
      url="jdbc:oracle:thin:@xxx"
      username="xxx" password="xxx" maxActive="65" maxIdle="10"
      maxWait="-1" removeAbandoned="true"/>

...等。

所有这些数据源都将driverClassName作为参数,我们可以在“oracle.jdbc.driver.OracleDriver”的位置提供“com.p6spyengine.spy.P6SpyDriver”,并在spy.properties中提供真实的驱动程序名称。一切正常。

但是使用oracle.jdbc.pool.OracleConnectionPoolDataSource,没有名为driverClassName的属性来提供代理驱动程序。

在这种情况下,我如何将P6Spy与它集成?

请帮忙......

先谢谢, 克里希纳V

2 个答案:

答案 0 :(得分:1)

根据我对Glassfish的经验,我建议:

  • 保留现有的oracle(真实)数据源定义
  • 创建一个新的(P6Spy one)用作真实的一个,

定义如下:

<Call name="addService">
    <Arg>
        <New class="org.mortbay.jetty.plus.DefaultDataSourceService">
            <Set name="Name">DataSourceService</Set>

            <Call name="addDataSource">
                <Arg>p6spy_ds</Arg><!--java:comp/env -->
                <Arg>
                    <New class="com.p6spy.engine.spy.P6DataSource">
                        <!-- properties would be irrelevant here -->
                        <Set name="description">xxxx</Set>
                        <Set name="user">xxx</Set>
                        <Set name="password">xxxx</Set>
                        <Set name="loginTimeout">xxx</Set>
                        <Set name="URL">jdbc:oracle:thin:@localhost:1521:xxx</Set>
                    </New>
                </Arg>
            </Call>
            <Call name="start" />
        </New>
  • 并确保引用spy.properties文件中的真实文件

使用:

realdatasource=jdbc/app_ds # assuming that app_ds is your real datasource
  • 最后一件事是在你的所有应用程序逻辑中引用proxy_ds以确保使用它(如果引用会花费你太多,你总是可以调用代理数据源与原始数据源相同并重命名原始的+在spy.properties配置文件中引用新名称)

答案 1 :(得分:1)

使用Jetty,添加P6Spy实际上更容易一些。 P6Spy有一个P6DataSource,它通过构造函数参数接受另一个数据源。这是迄今为止设置P6Spy的最简单方法。

<Call name="addService">
<Arg>
  <New class="org.mortbay.jetty.plus.DefaultDataSourceService">
    <Set name="Name">DataSourceService</Set>

    <Call name="addDataSource">
        <Arg>app_ds</Arg><!--java:comp/env-->
        <Arg>
         <New class="com.p6spy.engine.spy.P6DataSource">
           <Arg>
              <New class="oracle.jdbc.pool.OracleConnectionPoolDataSource">
                 <Set name="description">xxxx</Set>
                 <Set name="user">xxx</Set>
                 <Set name="password">xxxx</Set>
                 <Set name="loginTimeout">xxx</Set>
                 <Set name="URL">jdbc:oracle:thin:@localhost:1521:xxx</Set>
              </New>
           </Arg>
         </New>
      </Arg>
    </Call>
     <Call name="start"/>
 </New>