3

我们在项目中使用 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"/>

..ETC。

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

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

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

请帮忙...

在此先感谢,克里希纳五世

4

2 回答 2

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>
于 2013-12-20T18:10:34.447 回答
1

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

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

定义如下:

<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配置文件中)
于 2013-09-09T08:19:19.783 回答