Как настроить P6Spy с OracleConnectionPoolDataSource в конкретных
Мы используем механизм пула соединений 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 с другими источниками данных, такими как SpringManagerDataSource, другими источниками данных, такими как as
(В 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, в котором мы можем предоставить "com.p6spyengine.spy.P6SpyDriver" вместо "oracle.jdbc.driver.OracleDriver" и предоставить реальное имя драйвера в spy.properties. Все работало нормально.
Но с oracle.jdbc.pool.OracleConnectionPoolDataSource не существует такого свойства, называемого driverClassName, для которого предоставляется прокси-драйвер.
В этом случае, как я могу интегрировать P6Spy с ним?
Пожалуйста помоги...
Заранее спасибо, Кришна V
2 ответа
Исходя из моего опыта работы с Glassfish, я бы предложил:
- сохранить существующее определение источника данных оракула (реального)
- создать новый (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
файл конфигурации)
С 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>