Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

サポートエンジニアが語る。WebLogic Server のリクエスト処理フロー見える化!

4,500 views

Published on

「サポートエンジニアが語る。WebLogic Server のリクエスト処理フロー見える化!」

2016年7月21日に開催されたWebLogic Server勉強会のセッション資料です。
サポートエンジニアの観点から、WebLogic Server がリクエストを受け付け、トランザクションを処理し、データベースにコミットするまでの処理フローを見える化します。開発の現場、デバッグやトラブルシューティングなどでも役に立ついくつかの実践的な方法を組み合わせて説明します。Java EE アプリケーションの開発をしている方や、これから始めようとしている方におすすめのセッションです。

日本オラクル株式会社 テクノロジーサポート本部 東 健太郎

Published in: Technology

サポートエンジニアが語る。WebLogic Server のリクエスト処理フロー見える化!

  1. 1. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | サポートエンジニアが語る。 WebLogic Server リクエスト処理フロー見える化! 第 58 回 WebLogic Server 勉強会@東京 日本オラクル株式会社 Fusion Middleware 製品サポート 東 健太郎 (Azuma, Kentaro) 2016 年 7 月 21 日
  2. 2. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | Safe Harbor Statement The following is intended to outline our general product direction. It is intended for information purposes only, and may not be incorporated into any contract. It is not a commitment to deliver any material, code, or functionality, and should not be relied upon in making purchasing decisions. The development, release, and timing of any features or functionality described for Oracle’s products remains at the sole discretion of Oracle. 2
  3. 3. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | Program Agenda はじめに 検証アプリケーションの動作シナリオ説明 各ポイントでの見える化実践 Java Flight Recorder からの見える化 まとめ 1 2 3 4 5 3
  4. 4. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | Program Agenda はじめに 検証アプリケーションの動作シナリオ説明 各ポイントでの見える化実践 Java Flight Recorder からの見える化 まとめ 1 2 3 4 5 4
  5. 5. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | 日々、サポートへいろいろな問い合わせがあります • サーバが応答しません • アプリと DB は問題ないはずなので、WLS がだめみたいです • トランザクションが動いていないみたいです • WLS ってどんなふうに動いていますか? 5
  6. 6. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | 私たちも特別なツールは持っていません • 一般のツールやコマンドなどを使って問題の調査をします • 欲しい情報が得られるように工夫しています • デバッグログやダンプなどとじっくり向き合う地味な作業もあります・・・ 6
  7. 7. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | 見える化しましょう • 製品サポートの経験から得られたいくつかの有用な Tips を共有します • WebLogic Server (WLS) のこんな処理フローも見えるようになります 7 –HTTP (SOAP) リクエスト / レスポンス –Web サービス (JAX-WS サーブレット) –Enterprise Java Beans (EJB) –Java Persistence API (JPA) –トランザクション (JTA) –データソース / JDBC ドライバ / データベース
  8. 8. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | こんな人たちに聞いてほしいです • WLS や Java EE について基本的な理解があるエンジニア • WLS 上で動く Java EE アプリの開発をしている方や、これから始める方 • 製品サポートへ WLS についての SR を登録する機会のある方 • 今後の問題調査やトラブルシュートに役立てて頂けると嬉しいです! 8
  9. 9. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | Program Agenda はじめに 検証アプリケーションの動作シナリオ説明 各ポイントでの見える化実践 Java Flight Recorder からの見える化 まとめ 1 2 3 4 5 9
  10. 10. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | 使用したソフトウェア / 仕様のバージョン • Oracle WebLogic Server 12.2.1.0.0 – JDBC Thin Driver 12.1.0.2.0 • Java SE 1.8.0_66 – Java Flight Recorder 5.5.0 • Java EE 7.0 – Servlet 3.0 – JAX-WS 2.0 – EJB 3.0 – JPA 2.0 • Oracle JDeveloper 12.2.1.0.0 • Oracle Database 11.2.0.4.0 10
  11. 11. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | リクエスト処理フローの全体図 11 WLS Managed Server (Server-0) HTTP Server (Embedded) Web Service (Servlet + JAX-WS) Web Container EJB (Stateless Session Bean) JTA (Javax.transaction.TransactionManager) Data Source EJB Container Transaction Manager JDBC Driver (Thin XA) JPA (EclipseLink) SOAP Client (soapUI) Database
  12. 12. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | トランザクションの境界 12 WLS Managed Server (Server-0) HTTP Server (Embedded) Web Service (Servlet + JAX-WS) Database Web Container EJB (Stateless Session Bean) JTA (Javax.transaction.TransactionManager) Data Source EJB Container Transaction Manager JDBC Driver (Thin XA) JPA (EclipseLink) EJB から Database まで SOAP Client (soapUI)
  13. 13. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | ECID で関連づけできる範囲 13 WLS Managed Server (Server-0) HTTP Server (Embedded) Web Service (Servlet + JAX-WS) Database Web Container EJB (Stateless Session Bean) JTA (Javax.transaction.TransactionManager) Data Source EJB Container Transaction Manager JDBC Driver (Thin XA) JPA (EclipseLink) Client から Database まですべて SOAP Client (soapUI)
  14. 14. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | ECID って? • Execution Context ID (実行コンテキスト ID) • WLS や Database を流れるリクエストを一意に識別できる識別子 • フォーマットの例 : 7b80c4eb-acad-4a13-b677-eeff11508e2d-00000020 • ECID に着目することで、リクエストの流れを紐付けて追うことができます 14 ※ 参考情報 [Java, WLS, FMW] Using Diagnostic Context for Correlation (日本語) https://orablogs-jp.blogspot.jp/2015/12/using-diagnostic-context-for-correlation.html 12.5.1 メッセージの関連付けでのECIDおよびRIDの理解 http://docs.oracle.com/cd/E72987_01/core/ASADM/logs.htm#CIHDHJIG
  15. 15. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | リクエスト処理シーケンス 15 Data Source SQL Insert lock table ... Web Service EJB JTA JDBC SOAP Client rollback Oracle Database JPA SOAP Request SOAP Response Rollback 実行まで、 SQL Insert 文はブロックされる
  16. 16. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | Program Agenda はじめに 検証アプリケーションの動作シナリオ説明 各ポイントでの見える化実践 Java Flight Recorder からの見える化 まとめ 1 2 3 4 5 16
  17. 17. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | HTTP (SOAP) リクエスト / レスポンスの確認 17 WLS Managed Server (Server-0) HTTP Server (Embedded) Web Service (Servlet + JAX-WS) Database Web Container EJB (Stateless Session Bean) JTA (Javax.transaction.TransactionManager) Data Source SOAP Client (soapUI) EJB Container Transaction Manager JDBC Driver (Thin XA) JPA (EclipseLink)
  18. 18. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | HTTP (SOAP) リクエスト・ヘッダの確認 [soapUI] : [Request] –> [Raw (tab)] 18
  19. 19. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | HTTP (SOAP) リクエスト・ボディの確認 [soapUI] : [Request] –> [XML (tab)] 19 COMM = 900 DEPTNO = 30 EMPNO = 9999 ENAME = SHERYL HIREDATE = 1986-07-31T00:00:00+09:00 JOB=SALESMAN MGR=7698 SAL=2000
  20. 20. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | HTTP (SOAP) レスポンス・ヘッダの確認 [soapUI] : [Response] -> [Raw (tab)] 20
  21. 21. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | HTTP (SOAP) レスポンス・ボディの確認. [soapUI] : [Response] -> [XML (tab)] 21
  22. 22. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | データベースに Insert / Commit されたデータの確認 22 WLS Managed Server (Server-0) HTTP Server (Embedded) Web Service (Servlet + JAX-WS) Database Web Container EJB (Stateless Session Bean) JTA (Javax.transaction.TransactionManager) Data Source SOAP Client (soapUI) EJB Container Transaction Manager JDBC Driver (Thin XA) JPA (EclipseLink)
  23. 23. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | データベースに Insert / Commit されたデータの確認. [SQL*Plus] : 検証アプリケーション実行後の SELECT 結果 23 SQL> SELECT * FROM scott.emp ORDER BY empno DESC; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ------- -------- --------- ------ ------------------- ------ ------ -------- 9999 SHERYL SALESMAN 7698 1986-07-31/00:00:00 2000 900 30 7934 MILLER CLERK 7782 1982-01-23/00:00:00 1300 10 7902 FORD ANALYST 7566 1981-12-03/00:00:00 3000 20 ... ...
  24. 24. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | HTTP (SOAP) リクエスト / レスポンスのパケットを確認 24 WLS Managed Server (Server-0) HTTP Server (Embedded) Web Service (Servlet + JAX-WS) Database Web Container EJB (Stateless Session Bean) JTA (Javax.transaction.TransactionManager) Data Source SOAP Client (soapUI) EJB Container Transaction Manager JDBC Driver (Thin XA) JPA (EclipseLink)
  25. 25. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | HTTP (SOAP) リクエスト / レスポンスのパケットを確認 [Wireshark] : [packet list pane] 25 SOAP リクエスト・ヘッダ SOAP リクエスト・ボディ ... SOAP レスポンス・ヘッダ SOAP レスポンス・ボディ
  26. 26. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | HTTP (SOAP) リクエスト・ヘッダのパケットを確認 [Wireshark] : [packet bytes pane] 26
  27. 27. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | HTTP (SOAP) リクエスト・ボディのパケットを確認 [Wireshark] : [packet bytes pane] 27
  28. 28. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | HTTP (SOAP) レスポンス・ヘッダのパケットを確認 [Wireshark] : [packet bytes pane] 28
  29. 29. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | HTTP (SOAP) レスポンス・ボディのパケットを確認 [Wireshark] : [packet bytes pane] 29
  30. 30. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | Wireshark を使ったパケットダンプの取得 • パケットキャプチャの開始ウィザードを起動する 30 ※ 参考情報 Wireshark https://www.wireshark.org/
  31. 31. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | tcpdump を使ったパケットダンプの取得. • tcpdump コマンドを実行する 31 ※ 参考情報 【tcpdump】ネットワークトラフィックをダンプ出力する http://itpro.nikkeibp.co.jp/article/COLUMN/20140512/556024/?rt=nocnt $ su – # tcpdump -i eth0 -w packetdump.dmp tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes ... ^C 42 packets captured 44 packets received by filter 0 packets dropped by kernel ※ バイナリ (-w) で出力することで、パケットダンプを Wireshark で解析できます
  32. 32. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | HTTP Server を流れるリクエストを確認 32 WLS Managed Server (Server-0) HTTP Server (Embedded) Web Service (Servlet + JAX-WS) Database Web Container EJB (Stateless Session Bean) JTA (Javax.transaction.TransactionManager) Data Source SOAP Client (soapUI) EJB Container Transaction Manager JDBC Driver (Thin XA) JPA (EclipseLink)
  33. 33. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | HTTP アクセスログの確認 [access.log] 33 #Version: 1.0 #Fields: c-ip s-ip date time cs-method cs-uri sc-status bytes time-taken ctx-ecid ctx-rid #Software: WebLogic # Start-Date: 2016-06-27 11:59:49 ... 10.188.146.159 10.185.152.210:8001 2016-06-27 11:59:49 POST /SampleClient/SessionEJBWebServicePort 200 458 23.357 7b80c4eb-acad-4a13-b677-eeff11508e2d- 00000020 0 ... ECID も出力することができる
  34. 34. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | HTTP アクセスログの設定 [WLS Console] : [Servers] –> [<server-name>] –> [Logging] –> [HTTP] 34 ... c-ip s-ip date time cs-method cs-uri sc-status bytes time-taken ctx-ecid ctx-rid ※ 参考情報 12.1.1 Oracle Fusion Middleware HTTPアクセス・ロギングの理解 http://docs.oracle.com/cd/E72987_01/core/ASADM/logs.htm#CIHEHEEB 拡張ログ・フォーマット
  35. 35. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | HTTP デバッグログから HTTP リクエスト・ヘッダを確認 [DebugHttp] : HTTP Request Header 35 ※ 実際は 1 行 ####<Jun 27, 2016 11:59:26 AM JST> <Debug> <Http> ... <7b80c4eb-acad-4a13-b677-eeff11508e2d- 00000020> <1466996366184> ... invoking servlet for : weblogic.servlet.internal.ServletRequestImpl@599a3e95[ POST /SampleClient/SessionEJBWebServicePort HTTP/1.1 Accept-Encoding: gzip,deflate Content-Type: application/soap+xml;charset=UTF-8 Content-Length: 533 Connection: Keep-Alive User-Agent: Apache-HttpClient/4.1.1 (java 1.5) ]> Server Log
  36. 36. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | HTTP デバッグログから HTTP レスポンス・ヘッダを確認 [DebugHttp] : HTTP Response Header 36 ※ 実際は 1 行 ####<Jun 27, 2016 11:59:49 AM JST> <Debug> <Http> ... <7b80c4eb-acad-4a13-b677-eeff11508e2d- 00000020> ... <Response committed. request: 'HttpRequest@1503280789 - /SampleClient/SessionEJBWebServicePort' response: weblogic.servlet.internal.ServletResponseImpl@2a4a4ced[ HTTP/1.1 200 OK Date: : Mon, 27 Jun 2016 02:59:26 GMT Content-Length: : 458 Content-Type: : application/soap+xml; charset=utf-8 X-ORACLE-DMS-ECID: 7b80c4eb-acad-4a13-b677-eeff11508e2d-00000020 X-ORACLE-DMS-RID: 0 ]> Server Log
  37. 37. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | HTTPデバッグログの設定. [WLS Console] : [Servers] –> [<server-name>] –> [Debug] 37 ... ※ 参考情報 Note:1755211.1 WebLogic Server におけるデバッグログの取得方法について (KROWN:152352) ...
  38. 38. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | Web サービス (Servlet + JAX-WS) を流れるリクエストを確認 38 WLS Managed Server (Server-0) HTTP Server (Embedded) Web Service (Servlet + JAX-WS) Database Web Container EJB (Stateless Session Bean) JTA (Javax.transaction.TransactionManager) Data Source SOAP Client (soapUI) EJB Container Transaction Manager JDBC Driver (Thin XA) JPA (EclipseLink)
  39. 39. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | Servlet フィルタを使って HTTP リクエストを確認 39 ### SessionEJBWebServiceFilter.doFilter - Started ### ECID = 7b80c4eb-acad-4a13-b677-eeff11508e2d-00000020, RID = 0 ------------------------ HTTP Request Headers ------------------------ Content-Type : application/soap+xml;charset=UTF-8 Content-Length : 533 Host : 10.185.152.210:8001 ------------------------ HTTP Request Body ------------------------ <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:cli="http://client/"> <soap:Header/> <soap:Body> <cli:persistEmp><arg0> ... <empno>9999</empno> <ename>SHERYL</ename> ... </arg0></cli:persistEmp> </soap:Body> </soap:Envelope> Stdout Log
  40. 40. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | Servlet フィルタを使って HTTP レスポンスを確認 40 ### SessionEJBWebServiceFilter.doFilter - Finished ### ECID = 7b80c4eb-acad-4a13-b677-eeff11508e2d-00000020, RID = 0 ------------------------ HTTP Response Headers ------------------------ X-ORACLE-DMS-ECID : 7b80c4eb-acad-4a13-b677-eeff11508e2d-00000020 X-ORACLE-DMS-RID : 0 ------------------------ HTTP Response Body ------------------------ <S:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:S="http://www.w3.org/2003/05/soap-envelope"> <env:Header/> <S:Body> <ns0:persistEmpResponse xmlns:ns0="http://client/"><return> ... <empno>9999</empno> <ename>SHERYL</ename> ... </return></ns0:persistEmpResponse> </S:Body> </S:Envelope> Stdout Log
  41. 41. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | Servlet フィルタの設定 [SessionEJBWebServiceFilter.java] : Servlet フィルタ実装クラス 41 @WebFilter(filterName = "WebServiceFilter", servletNames = { "SessionEJBWebServicePort" }) public class SessionEJBWebServiceFilter implements Filter { public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) ... { System.out.println("### SessionEJBWebServiceFilter.doFilter - Started ### ECID = " + DiagnosticContextHelper.getContextId() + ", RID = " + DiagnosticContextHelper.getRID()); printRequestHeaders(req); printRequestBody(req); chain.doFilter(req, res); // <-- ここで Servlet を実行する System.out.println("### SessionEJBWebServiceFilter.doFilter - Finished ### ECID = " + DiagnosticContextHelper.getContextId() + ", RID = " + DiagnosticContextHelper.getRID()); printResponseHeaders(res); printResponseBody(res); } weblogic.diagnostics.context.DiagnosticContextHelper.getContextId() ※ 参考情報 javax.servlet.annotation Annotation Type WebFilter https://docs.oracle.com/javaee/7/api/javax/servlet/annotation/WebFilter.html
  42. 42. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | アプリケーションでの ECID 文字列の取得 • DiagnosticContextHelper.getContextId() で ECID 文字列を取得できる • サーバの診断コンテキストを有効化しておく必要がある 42 ※ 参考情報 [WLS] WebLogic Server?Use the Execution Context ID in Applications?Lessons From Hansel and Gretel (日本語) https://orablogs-jp.blogspot.jp/2011/06/weblogic-serveruse-execution-context-id.html weblogic.diagnostics.context Class DiagnosticContextHelper http://docs.oracle.com/middleware/1221/wls/WLAPI/weblogic/diagnostics/context/DiagnosticContextHelper.html [WLS Console] : [Diagnostics] –> [Context]
  43. 43. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | SOAP メッセージハンドラを使って SOAP リクエストを確認 43 ### SessionEJBSOAPHandler.handleMessage ### ECID = 7b80c4eb-acad-4a13-b677-eeff11508e2d- 00000020, RID = 0 ------------------------ SOAP Inbound (Request) Envelope ------------------------ <soap:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:cli="http://client/"> <soap:Header/> <soap:Body> <cli:persistEmp><arg0> ... <empno>9999</empno> <ename>SHERYL</ename> ... </arg0></cli:persistEmp> </soap:Body> </soap:Envelope> Stdout Log
  44. 44. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | SOAPメッセージハンドラを使って SOAP レスポンスを確認 44 ### SessionEJBSOAPHandler.handleMessage ### ECID = 7b80c4eb-acad-4a13-b677-eeff11508e2d- 00000020, RID = 0 ------------------------ SOAP Outbound (Response) Envelope ------------------------ <S:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:S="http://www.w3.org/2003/05/soap-envelope"> <env:Header/> <S:Body> <ns0:persistEmpResponse xmlns:ns0="http://client/"><return> ... <empno>9999</empno> <ename>SHERYL</ename> ... </return></ns0:persistEmpResponse> </S:Body> </S:Envelope> Stdout Log
  45. 45. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | SOAP メッセージハンドラの設定 (1) [SessionEJBSOAPHandler.java] : SOAP ハンドラ実装クラス 45 ※ 実際は 1 行 public class SessionEJBSOAPHandler implements SOAPHandler<SOAPMessageContext> { @Override public boolean handleMessage(SOAPMessageContext context) { System.out.println("### SessionEJBSOAPHandler.handleMessage ### ECID = " + DiagnosticContextHelper.getContextId() + ", RID = " + DiagnosticContextHelper.getRID()); // ... SOAPMessage soapMessage = context.getMessage(); SOAPPart soapPart = soapMessage.getSOAPPart(); SOAPEnvelope soapEnvelope = soapPart.getEnvelope(); System.out.println("------------------------ SOAP " + direction + " Envelope ------------------------"); System.out.println(soapEnvelope); } ※ 参考情報 18 SOAPメッセージ・ハンドラの作成と使用 http://docs.oracle.com/cd/E72987_01/wls/WSGET/jax-ws-soaphandlers.htm javax.xml.ws.handler.soap Interface SOAPHandler<T extends SOAPMessageContext> https://docs.oracle.com/javaee/7/api/javax/xml/ws/handler/soap/SOAPHandler.html
  46. 46. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | SOAP メッセージハンドラの設定 (2) [sessionejb-soap-handler-chain.xml] : ハンドラチェイン定義ファイル 46 <handler-chains xmlns="http://java.sun.com/xml/ns/javaee"> <handler-chain> <handler> <handler-class>handler.SessionEJBSOAPHandler</handler-class> </handler> </handler-chain> </handler-chains>
  47. 47. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | SOAP メッセージハンドラの設定 (3).. [SessionEJBWebService.java] : JAX-WS Servlet クラス 47 @WebService(serviceName = "SessionEJBWebService") @HandlerChain(file = "../handler/sessionejb-soap-handler-chain.xml") @BindingType(SOAPBinding.SOAP12HTTP_BINDING) public class SessionEJBWebService { @WebMethod public Emp persistEmp(@WebParam(name = “arg0”) Emp emp) { // ... Emp _emp = sessionEJB.persistEmp(emp); // <-- ここで EJB のメソッドを実行する // ... return _emp; } Emp 表への永続化のために公開している Web サービスのオペレーション
  48. 48. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | EJB (Stateless Session Bean) の処理を確認 48 WLS Managed Server (Server-0) HTTP Server (Embedded) Web Service (Servlet + JAX-WS) Database Web Container EJB (Stateless Session Bean) JTA (Javax.transaction.TransactionManager) Data Source SOAP Client (soapUI) EJB Container Transaction Manager JDBC Driver (Thin XA) JPA (EclipseLink)
  49. 49. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | EJB インターセプタを使って処理するデータを確認 49 ### SessionEJBInterceptor.intercept - Started ### ECID = 7b80c4eb-acad-4a13-b677-eeff11508e2d- 00000020, RID = 0 ------------------------ EJB Method Parameters ------------------------ sample.Emp@6e07fada[comm=900,deptno=30,empno=9999,ename=SHERYL,hiredate=Thu Jul 31 00:00:00 JST 1986,job=SALESMAN,mgr=7698,sal=2000] ... ### SessionEJBBean.persistEmp ### ECID = 7b80c4eb-acad-4a13-b677-eeff11508e2d-00000020, RID = 0 ... ### SessionEJBInterceptor.intercept - Finished ### ECID = 7b80c4eb-acad-4a13-b677-eeff11508e2d- 00000020, RID = 0 EJB メソッド実行中 EJB メソッド実行後 EJB メソッド実行前 Stdout Log
  50. 50. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | EJB インターセプタの設定 (1) [SessionEJBInterceptor.java] : EJB インターセプタクラス 50 ※ 実際は 1 行 public class SessionEJBInterceptor { @AroundInvoke public Object intercept(InvocationContext context) throws Exception { // ... System.out.println("### SessionEJBInterceptor.intercept - Started ### ECID = " + DiagnosticContextHelper.getContextId() + ", RID = " + DiagnosticContextHelper.getRID()); System.out.println("------------------------ EJB Method Parameters ------------------------"); for (Object obj : context.getParameters()) { if(obj.getClass().getName().equals("sample.Emp")) System.out.println(((Emp)obj).toString()); } Object result = context.proceed(); // <-- ここで EJB のメソッドを実行する System.out.println("### SessionEJBInterceptor.intercept - Finished ### ECID = " + DiagnosticContextHelper.getContextId() + ", RID = " + DiagnosticContextHelper.getRID());
  51. 51. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | EJB インターセプタの設定 (2). [SessionEJBBean.java] : EJB Stateless Session Bean クラス 51 @Stateless(name = "SessionEJB", mappedName = "SessionEJB") @Interceptors(SessionEJBInterceptor.class) public class SessionEJBBean implements SessionEJB, SessionEJBLocal { // ... @TransactionAttribute(TransactionAttributeType.REQUIRED) public Emp persistEmp(Emp emp) { System.out.println("### SessionEJBBean.persistEmp ### ECID = " + DiagnosticContextHelper.getContextId() + ", RID = " + DiagnosticContextHelper.getRID()); em.persist(emp); // ここで JPA のメソッドを実行する (Database にデータを永続化 (Insert) する) // ... } ※ 参考情報 javax.interceptor Annotation Type AroundInvoke https://docs.oracle.com/javaee/7/api/javax/interceptor/AroundInvoke.html javax.interceptor Annotation Type Interceptors https://docs.oracle.com/javaee/7/api/javax/interceptor/Interceptors.html
  52. 52. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | EJB デバッグログから処理を確認 [DebugEjbInvoke] 52 ※ 実際は 1 行 ####<Jun 27, 2016 11:59:26 AM JST> <Debug> <EjbInvoke> ... <7b80c4eb-acad-4a13-b677- eeff11508e2d-00000020> ... <[BaseRemoteObject] preInvoke called with: ... Method: persistEmp(sample.Emp) TransactionAttribute: REQUIRED on remote interface of EJB: SessionEJB> ####<Jun 27, 2016 11:59:27 AM JST> <Debug> <EjbInvoke> ... <7b80c4eb-acad-4a13-b677- eeff11508e2d-00000020> ... <[BaseRemoteObject] Committing our tx: Name=[EJB sample.SessionEJBBean.persistEmp(sample.Emp)],Xid=BEA1-0000301B662DD776A418(866435730), ...> ####<Jun 27, 2016 11:59:49 AM JST> <Debug> <EjbInvoke> ... <7b80c4eb-acad-4a13-b677- eeff11508e2d-00000020> ... <[BaseRemoteObject] Committing our tx: SUCCESS> トランザクションの開始 トランザクションのコミット成功 トランザクションのコミット開始と XID の確認 Server Log
  53. 53. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | EJBデバッグログの設定. [WLS Console] : [Servers] –> [<server-name>] –> [Debug] 53 ... ... ... ※ 参考情報 Note:1755211.1 WebLogic Server におけるデバッグログの取得方法について (KROWN:152352)
  54. 54. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | トランザクションを確認 54 WLS Managed Server (Server-0) HTTP Server (Embedded) Web Service (Servlet + JAX-WS) Database Web Container EJB (Stateless Session Bean) JTA (Javax.transaction.TransactionManager) Data Source EJB Container Transaction Manager JDBC Driver (Thin XA) JPA (EclipseLink) SOAP Client (soapUI)
  55. 55. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | 管理コンソールを使用した確認 [WLS Console] : [Servers] -> [<server-name>] –> [Monitoring] –> [JTA] –> [Transactions] 55 ... 実行中のトランザクション
  56. 56. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | データベース上で実行中のトランザクションを確認 [SQL*Plus] 56 SQL> SELECT globalid, branchid, formatid, state FROM v$global_transaction; GLOBALID BRANCHID FORMATID STATE -------------------- ---------------------------------------- -------- ------ 0000301B662DD776A418 53616D706C6544535F626173655F646F6D61696E 48801 ACTIVE ※ 参考情報 V$GLOBAL_TRANSACTION http://docs.oracle.com/cd/E16338_01/server.112/b56311/dynviews_1168.htm#sthref3362 WLS 上で確認したトランザクション BEA1-0000301B662DD776A418 に相当
  57. 57. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | トランザクションデバッグログを確認 [DebugJTA2PC] 57 ####<Jun 27, 2016 11:59:49 AM JST> <Debug> <JTA2PC> ... <7b80c4eb-acad-4a13-b677-eeff11508e2d- 00000020> ... <... : [EJB sample.SessionEJBBean.persistEmp(sample.Emp)]: TX[BEA1- 0000301B662DD776A418] preparing-->prepared> ####<Jun 27, 2016 11:59:49 AM JST> <Debug> <JTA2PC> ... <7b80c4eb-acad-4a13-b677-eeff11508e2d- 00000020> ... <XAResource[SampleDS_base_domain].commit (xid=BEA1-0000301B662DD776A418-53616D706C6544535F626173655F646F6D61696E, ...)> ####<Jun 27, 2016 11:59:49 AM JST> <Debug> <JTA2PC> ... <7b80c4eb-acad-4a13-b677-eeff11508e2d- 00000020> ... <... : [EJB sample.SessionEJBBean.persistEmp(sample.Emp)]: TX[BEA1- 0000301B662DD776A418] committing-->committed> Server Log トランザクションコミット前の準備フェーズ トランザクションのコミット成功 トランザクションのコミット開始
  58. 58. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | トランザクションデバッグログの設定. [WLS Console] : [Servers] –> [<server-name>] –> [Debug] 58 ... ... ... ※ 参考情報 Note:1755211.1 WebLogic Server におけるデバッグログの取得方法について (KROWN:152352)
  59. 59. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | JPA (EclipseLink) の処理を確認 59 WLS Managed Server (Server-0) HTTP Server (Embedded) Web Service (Servlet + JAX-WS) Database Web Container EJB (Stateless Session Bean) JTA (Javax.transaction.TransactionManager) Data Source SOAP Client (soapUI) EJB Container Transaction Manager JDBC Driver (Thin XA) JPA (EclipseLink)
  60. 60. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | JPA (EclipseLink) のデバッグログを確認 [DebugJpaJdbcJdbc, DebugJpaJdbcSql] 60 ####<Jun 27, 2016 11:59:27 AM JST> <Debug> <EclipseLink> ... <BEA1-0000301B662DD776A418> <7b80c4eb-acad-4a13-b677-eeff11508e2d-00000020> ... <[DebugJpaJdbcJdbc] ... --persist() operation called on: sample.Emp@6e07fada[comm=900,deptno=30,empno=9999,ename=SHERYL,hiredate=Thu Jul 31 00:00:00 JST 1986,job=SALESMAN,mgr=7698,sal=2000].> ####<Jun 27, 2016 11:59:27 AM JST> <Debug> <EclipseLink> ... <BEA1-0000301B662DD776A418> <7b80c4eb-acad-4a13-b677-eeff11508e2d-00000020> ... <[DebugJpaJdbcSql] ... --INSERT INTO EMP (EMPNO, COMM, DEPTNO, ENAME, HIREDATE, JOB, MGR, SAL) VALUES (?, ?, ?, ?, ?, ?, ?, ?) bind => [9999, 900, 30, SHERYL, 1986-07-31, SALESMAN, 7698, 2000]> ####<Jun 27, 2016 11:59:49 AM JST> <Debug> <EclipseLink> ... <7b80c4eb-acad-4a13-b677- eeff11508e2d-00000020> ... <[DebugJpaJdbcJdbc] ... --TX afterCompletion callback, status=COMMITTED> Server Log 永続化 (Insert) 処理の開始 トランザクションのコミット成功 実行 SQL (Insert) 文の確認
  61. 61. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | JPA (EclipseLink) のデバッグログの設定 (1) [WLS Console] : [Servers] –> [<server-name>] –> [Debug] 61 ... ... ... ※ 参考情報 Note:1755211.1 WebLogic Server におけるデバッグログの取得方法について (KROWN:152352)
  62. 62. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | JPA (EclipseLink) のデバッグログの設定 (2).. [persistence.xml] : データベースとの設定情報定義ファイル 62 <persistence ... version="2.0"> <persistence-unit name="SamplePU" transaction-type="JTA"> <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> <jta-data-source>SampleDS</jta-data-source> <class>sample.Emp</class> <properties> <property name="eclipselink.logging.level" value="FINEST"/> <property name="eclipselink.target-server" value="WebLogic_12"/> <property name="eclipselink.target-database" value="Oracle11"/> </properties> </persistence-unit> </persistence> ※ 参考情報 Oracle TopLink Java Persistence API (JPA)拡張機能リファレンス 5.1.4 ロギング http://docs.oracle.com/cd/E72987_01/toplink/jpa-extensions-reference/persistenceproperties_ref.htm#sthref733
  63. 63. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | Data Source が管理するデータベース接続を確認 63 WLS Managed Server (Server-0) HTTP Server (Embedded) Web Service (Servlet + JAX-WS) Database Web Container EJB (Stateless Session Bean) JTA (Javax.transaction.TransactionManager) Data Source SOAP Client (soapUI) EJB Container Transaction Manager JDBC Driver (Thin XA) JPA (EclipseLink)
  64. 64. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | v$session ビューからデータベース接続を確認 [SQL*Plus] : 検証アプリケーション実行直後の SELECT 結果 64 SQL> SELECT s.sid,s.serial#,s.username,s.program,s.machine,s.sql_id,s.prev_sql_id,p.spid,s.ecid,q.sql_text,q.last_active_time 2 FROM v$session s, v$sql q, v$process p 3 WHERE q.sql_id = (CASE WHEN s.sql_id IS NOT NULL THEN s.sql_id ELSE s.prev_sql_id END) 4 and s.username = 'SCOTT' and s.program like '%SampleDS%' and s.paddr = p.addr 5 ORDER BY q.last_active_time DESC; SID SERIAL# USERNAME PROGRAM MACHINE --- ------- -------- -------------------------------- ---------------------- 29 5 SCOTT JDBC Thin - SampleDS on Server-0 kazuma01.jp.oracle.com SQL_ID PREV_SQL_ID SPID ECID ------------- ------------- ---- --------------------------------------------- 1bkaadbg3pq92 1bkaadbg3pq92 4432 7b80c4eb-acad-4a13-b677-eeff11508e2d-00000020 SQL_TEXT LAST_ACTIVE_TIME ---------------------------------------------------------------------------------------------------- ------------------- INSERT INTO EMP (EMPNO, COMM, DEPTNO, ENAME, HIREDATE, JOB, MGR, SAL) VALUES (:1 , :2 , :3 , :4 , :5 2016-06-27/11:59:48 ※ 参考情報 Oracle Databaseリファレンス http://docs.oracle.com/cd/E16338_01/server.112/b56311/toc.htm
  65. 65. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | Data Source のデバッグログを確認 [JDBCSQL] 65 ####<Jun 27, 2016 11:59:27 AM JST> <Debug> <JDBCSQL> ... <BEA1-0000301B662DD776A418> <7b80c4eb-acad-4a13-b677-eeff11508e2d-00000020> ... prepareStatement(INSERT INTO EMP (EMPNO, COMM, DEPTNO, ENAME, HIREDATE, JOB, MGR, SAL) VALUES (?, ?, ?, ?, ?, ?, ?, ?))> ####<Jun 27, 2016 11:59:28 AM JST> <Debug> <JDBCSQL> ... <BEA1-0000301B662DD776A418> <7b80c4eb-acad-4a13-b677-eeff11508e2d-00000020> ... setInt(1, 9999)> ... ####<Jun 27, 2016 11:59:28 AM JST> <Debug> <JDBCSQL> ... <BEA1-0000301B662DD776A418> <7b80c4eb-acad-4a13-b677-eeff11508e2d-00000020> ... setString(4, SHERYL)> ####<Jun 27, 2016 11:59:28 AM JST> <Debug> <JDBCSQL> ... <BEA1-0000301B662DD776A418> <7b80c4eb-acad-4a13-b677-eeff11508e2d-00000020> ... setDate(5, 1986-07-31)> ####<Jun 27, 2016 11:59:28 AM JST> <Debug> <JDBCSQL> ... <BEA1-0000301B662DD776A418> <7b80c4eb-acad-4a13-b677-eeff11508e2d-00000020> ... setString(6, SALESMAN)> ... Server Log
  66. 66. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | Data Source のデバッグログの設定 [WLS Console] : [Servers] –> [<server-name>] –> [Debug] 66 ... ... ... ※ 参考情報 Note:1755211.1 WebLogic Server におけるデバッグログの取得方法について (KROWN:152352)
  67. 67. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | v$session ビューの PROGRAM 列へ特定の文字列を設定 [WLS Console] : [Services] –> [Data Sources] –> [Configuration] –> [Connection Pool] 67 ... ※ 参考情報 [WLS] Setting V$SESSION for a WLS Datasource (日本語) https://orablogs-jp.blogspot.jp/2014/08/setting-vsession-for-wls-datasource.html [WLS, Database, FMW] Data Source System Property Enhancement in WLS 12.2.1 (日本語) https://orablogs-jp.blogspot.jp/2015/11/data-source-system-property-enhancement.html v$session.program=JDBC Thin - SampleDS on Server-0
  68. 68. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | v$session ビューの ECID 列へ ECID 値を設定 (1) [WLS Console] : [Services] –> [Data Sources] –> [Configuration] –> [Diagnostics] 68 ... Driver Interceptor=diag. JDBCDriverInterceptor ※ 参考情報 JDBC Data Source: Configuration: Diagnostics - Driver Interceptor http://docs.oracle.com/cd/E72987_01/wls/WLACH/pagehelp/JDBCjdbcdatasourcesjdbcdatasourceconfigdiagnosticstitle.html ドライバ・レベルの統計をモニタリングするためのコールバック(非推奨) http://docs.oracle.com/cd/E72987_01/wls/JDBCA/monitor.htm#sthref108
  69. 69. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | v$session ビューの ECID 列へ ECID 値を設定 (2) [JDBCDriverInterceptor.java] : DriverInterceptor 実装クラス 69 public class JDBCDriverInterceptor implements DriverInterceptor { @Override public Object preInvokeCallback(Object obj, String mtd, Object[] objs) throws SQLException { if (o.getClass().getName().matches("oracle¥¥.jdbc¥¥.driver¥¥.OraclePreparedStatement.*") && mtd.equals("executeUpdate")) { Connection conn = (Connection)((PreparedStatement)obj).getConnection(); conn.setClientInfo("OCSID.ECID", weblogic.diagnostics.context.DiagnosticContextHelper.getContextId()); // ... } // ... ※ 参考情報 weblogic.jdbc.extensions Interface DriverInterceptor (Deprecated) http://docs.oracle.com/cd/E72987_01/wls/WLAPI/weblogic/jdbc/extensions/DriverInterceptor.html setClientInfo Method https://docs.oracle.com/cd/E49329_01/java.121/b71308/jdbcvers.htm#BABDAEEC java.sql インタフェース Connection http://docs.oracle.com/javase/jp/7/api/java/sql/Connection.html ECID をクライアント情報プロパティとしてデータベースに設定
  70. 70. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | v$session ビューの ECID 列へ ECID 値を設定 (3).. • PRE_CLASSPATH 環境変数を使用 • <domain-home>/lib にライブラリを配置 DriverInterceptor 実装クラスを含むライブラリを WLS のクラスパスに配置 70 $ export PRE_CLASSPATH=<work-dir>/SampleDiagnostics.jar ... $ cd <domain-home>/bin $ ./startManagedWebLogic.sh <server-name> ... <domain-home>/lib/SampleDiagnostics.jar どちらの方法でもライブラリを WLS のクラスパスに配置できる
  71. 71. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | JDBC Driver (Thin XA) が処理するデータを確認 71 WLS Managed Server (Server-0) HTTP Server (Embedded) Web Service (Servlet + JAX-WS) Database Web Container EJB (Stateless Session Bean) JTA (Javax.transaction.TransactionManager) Data Source SOAP Client (soapUI) EJB Container Transaction Manager JDBC Driver (Thin XA) JPA (EclipseLink)
  72. 72. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | JDBC Driver のトランザクションデバッグログを確認 [oracle.jdbc.xa.client] 72 ####<Jun 27, 2016 11:59:26 AM JST> <Debug> <oracle.jdbc.xa.client> ... <7b80c4eb-acad-4a13-b677- eeff11508e2d-00000020> ... <[oracle.jdbc.xa.client.OracleXAResource:start] EB40847 Public Enter: BEA1-0000301B662DD776A418-53616D706C6544535F626173655F646F6D61696E, 0> ####<Jun 27, 2016 11:59:49 AM JST> <Debug> <oracle.jdbc.xa.client> ... <7b80c4eb-acad-4a13-b677- eeff11508e2d-00000020> ... <[oracle.jdbc.xa.client.OracleXAResource:end] EB40847 Public Enter: BEA1-0000301B662DD776A418-53616D706C6544535F626173655F646F6D61696E, 67108864> ####<Jun 27, 2016 11:59:49 AM JST> <Debug> <oracle.jdbc.xa.client> ... <7b80c4eb-acad-4a13-b677- eeff11508e2d-00000020> ... <[oracle.jdbc.xa.client.OracleXAResource:commit] EB40847 Public Enter: BEA1-0000301B662DD776A418-53616D706C6544535F626173655F646F6D61696E, true> Server Log トランザクション・ブランチの開始 トランザクション・ブランチのコミット トランザクション・ブランチの終了 ※ 参考情報 oracle.jdbc.xa.client Class OracleXAResource http://docs.oracle.com/cd/E57425_01/121/JAJDB/oracle/jdbc/xa/client/OracleXAResource.html
  73. 73. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | JDBC Driver の実行 SQL デバッグログを確認 [oracle.jdbc.driver] 73 ####<Jun 27, 2016 11:59:27 AM JST> <Trace> <oracle.jdbc.driver> ... <BEA1-0000301B662DD776A418> <7b80c4eb-acad-4a13-b677-eeff11508e2d-00000020> ... <[oracle.jdbc.driver.T4CPreparedStatement:<init>] 69945535 Enter: oracle.jdbc.driver.T4CConnection@1d8a0869, "INSERT INTO EMP (EMPNO, COMM, DEPTNO, ENAME, HIREDATE, JOB, MGR, SAL) VALUES (?, ?, ?, ?, ?, ?, ?, ?)", -1, -1> ... ####<Jun 27, 2016 11:59:28 AM JST> <Debug> <oracle.jdbc.driver> ... <BEA1- 0000301B662DD776A418> <7b80c4eb-acad-4a13-b677-eeff11508e2d-00000020> ... <[oracle.jdbc.driver.OraclePreparedStatement:setInt] 69945535 Public Enter: 1, 9999> ... ####<Jun 27, 2016 11:59:28 AM JST> <Debug> <oracle.jdbc.driver> ... <BEA1- 0000301B662DD776A418> <7b80c4eb-acad-4a13-b677-eeff11508e2d-00000020> ... <[oracle.jdbc.driver.OraclePreparedStatement:setString] 69945535 Public Enter: 4, "SHERYL“> ... Server Log
  74. 74. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | JDBC Driver の送受信パケットを確認 (1) [oracle.net.ns] 74 ####<Jun 27, 2016 11:59:29 AM JST> <Trace> <oracle.net.ns> ... <BEA1-0000301B662DD776A418> <7b80c4eb-acad-4a13-b677-eeff11508e2d-00000020> ... <[oracle.net.ns.DataPacket:send] 532EF555 Debug: Packet size=417 ... 00 00 37 62 38 30 63 34 |..7b80c4| 65 62 2D 61 63 61 64 2D |eb-acad-| 34 61 31 33 2D 62 36 37 |4a13-b67| 37 2D 65 65 66 66 31 31 |7-eeff11| 35 30 38 65 32 64 2D 30 |508e2d-0| 30 30 30 30 30 32 30 03 |0000020.| ... (続く) Server Log
  75. 75. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | JDBC Driver の送受信パケットを確認 (2) [oracle.net.ns] 75 00 01 00 00 00 00 00 49 |.......I| 4E 53 45 52 54 20 49 4E |NSERT.IN| 54 4F 20 45 4D 50 20 28 |TO.EMP.(| 45 4D 50 4E 4F 2C 20 43 |EMPNO,.C| 4F 4D 4D 2C 20 44 45 50 |OMM,.DEP| 54 4E 4F 2C 20 45 4E 41 |TNO,.ENA| 4D 45 2C 20 48 49 52 45 |ME,.HIRE| 44 41 54 45 2C 20 4A 4F |DATE,.JO| 42 2C 20 4D 47 52 2C 20 |B,.MGR,.| 53 41 4C 29 20 56 41 4C |SAL).VAL| 55 45 53 20 28 3A 31 20 |UES.(:1.| 2C 20 3A 32 20 2C 20 3A |,.:2.,.:| ... (続く) Server Log
  76. 76. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | JDBC Driver の送受信パケットを確認 (3). [oracle.net.ns] 76 33 20 2C 20 3A 34 20 2C |3.,.:4.,| 20 3A 35 20 2C 20 3A 36 |.:5.,.:6| 20 2C 20 3A 37 20 2C 20 |.,.:7.,.| 3A 38 20 29 01 01 01 01 |:8.)....| ... 03 C2 64 64 02 C2 0A 02 |..dd....| C1 1F 06 53 48 45 52 59 |...SHERY| 4C 07 77 BA 07 1F 01 01 |L.w.....| 01 08 53 41 4C 45 53 4D |..SALESM| 41 4E 03 C2 4D 63 02 C2 |AN..Mc..| 15 |. | ... SQL> SELECT dump(hiredate, 16) FROM scott.emp WHERE empno = 9999; DUMP(HIREDATE,16) ------------------------------ Typ=12 Len=7: 77,ba,7,1f,1,1,1 1986-07-31/00:00:00 Typ=2 : NUMBER 型 Typ=12 : DATE 型 ※ 参考情報 Oracleの組込みデータ型 http://docs.oracle.com/cd/E16338_01/server.112/b56299/sql_elements001.htm#i54330 Server Log 9999 SQL> SELECT dump(9999, 16) FROM dual; DUMP(9999,16) --------------------- Typ=2 Len=3: c2,64,64
  77. 77. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | JDBC Driver のデバッグログの設定 (1) [OracleLog.properties] : デバッグログ設定ファイル 77 java.util.logging.ConsoleHandler.level = ALL java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter handlers = java.util.logging.ConsoleHandler ... oracle.jdbc.xa.level = FINEST oracle.jdbc.xa.client.level = FINEST oracle.jdbc.driver.level = FINEST oracle.net.ns.level = FINEST ... 実行 SQL を確認 トランザクションを確認 送受信パケットを確認 ※ 参考情報 JDBCロギングの有効化と使用 https://docs.oracle.com/cd/E49329_01/java.121/b71308/diagnose.htm#sthref983 Enable native Oracle JDBC logging for WebLogic Server (Doc ID 1249585.1) How To Log SQL Statement/PreparedStatement of Oracle SQL Driver in WebLogic Server (Doc ID 1352042.1)
  78. 78. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | JDBC Driver のデバッグログの設定 (2).. WLS の起動方法 78 $ export PRE_CLASSPATH=<oracle-home>/oracle_common/modules/oracle.jdbc/ojdbc7_g.jar $ export JAVA_OPTIONS="-Doracle.jdbc.Trace=true -Djava.util.logging.config.file=<work- dir>/OracleLog.properties $JAVA_OPTIONS“ ... $ cd <domain-home>/bin $ ./startManagedWebLogic.sh <server-name> ... ※ 参考情報 JDBCロギングの有効化と使用 https://docs.oracle.com/cd/E49329_01/java.121/b71308/diagnose.htm#sthref983 Enable native Oracle JDBC logging for WebLogic Server (Doc ID 1249585.1) How To Log SQL Statement/PreparedStatement of Oracle SQL Driver in WebLogic Server (Doc ID 1352042.1) JDBC デバッグ用 JAR ファイル ロギングを有効化 ロギング構成ファイルの指定
  79. 79. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | JDBC Driver とデータベース間の送受信パケットを確認 79 WLS Managed Server (Server-0) HTTP Server (Embedded) Web Service (Servlet + JAX-WS) Database Web Container EJB (Stateless Session Bean) JTA (Javax.transaction.TransactionManager) Data Source SOAP Client (soapUI) EJB Container Transaction Manager JDBC Driver (Thin XA) JPA (EclipseLink)
  80. 80. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | Oracle Net Trace を確認 (1) [svr_4432.trc (svr_<SPID>.trc)] 80 [27-JUN-2016 11:59:29:183] nsbasic_brc: packet dump ... [27-JUN-2016 11:59:29:183] nsbasic_brc: 00 00 37 62 38 30 63 34 |..7b80c4| [27-JUN-2016 11:59:29:183] nsbasic_brc: 65 62 2D 61 63 61 64 2D |eb-acad-| [27-JUN-2016 11:59:29:183] nsbasic_brc: 34 61 31 33 2D 62 36 37 |4a13-b67| [27-JUN-2016 11:59:29:183] nsbasic_brc: 37 2D 65 65 66 66 31 31 |7-eeff11| [27-JUN-2016 11:59:29:183] nsbasic_brc: 35 30 38 65 32 64 2D 30 |508e2d-0| [27-JUN-2016 11:59:29:183] nsbasic_brc: 30 30 30 30 30 32 30 03 |0000020.| ... (続く)
  81. 81. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | Oracle Net Trace を確認 (2) [svr_4432.trc (svr_<SPID>.trc)] 81 [27-JUN-2016 11:59:29:183] nsbasic_brc: 00 01 00 00 00 00 00 49 |.......I| [27-JUN-2016 11:59:29:183] nsbasic_brc: 4E 53 45 52 54 20 49 4E |NSERT.IN| [27-JUN-2016 11:59:29:183] nsbasic_brc: 54 4F 20 45 4D 50 20 28 |TO.EMP.(| [27-JUN-2016 11:59:29:183] nsbasic_brc: 45 4D 50 4E 4F 2C 20 43 |EMPNO,.C| [27-JUN-2016 11:59:29:183] nsbasic_brc: 4F 4D 4D 2C 20 44 45 50 |OMM,.DEP| [27-JUN-2016 11:59:29:183] nsbasic_brc: 54 4E 4F 2C 20 45 4E 41 |TNO,.ENA| [27-JUN-2016 11:59:29:183] nsbasic_brc: 4D 45 2C 20 48 49 52 45 |ME,.HIRE| [27-JUN-2016 11:59:29:183] nsbasic_brc: 44 41 54 45 2C 20 4A 4F |DATE,.JO| [27-JUN-2016 11:59:29:184] nsbasic_brc: 42 2C 20 4D 47 52 2C 20 |B,.MGR,.| [27-JUN-2016 11:59:29:184] nsbasic_brc: 53 41 4C 29 20 56 41 4C |SAL).VAL| [27-JUN-2016 11:59:29:184] nsbasic_brc: 55 45 53 20 28 3A 31 20 |UES.(:1.| [27-JUN-2016 11:59:29:184] nsbasic_brc: 2C 20 3A 32 20 2C 20 3A |,.:2.,.:| ... (続く)
  82. 82. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | Oracle Net Trace を確認 (3). [svr_4432.trc (svr_<SPID>.trc)] 82 [27-JUN-2016 11:59:29:184] nsbasic_brc: 33 20 2C 20 3A 34 20 2C |3.,.:4.,| [27-JUN-2016 11:59:29:184] nsbasic_brc: 20 3A 35 20 2C 20 3A 36 |.:5.,.:6| [27-JUN-2016 11:59:29:184] nsbasic_brc: 20 2C 20 3A 37 20 2C 20 |.,.:7.,.| [27-JUN-2016 11:59:29:184] nsbasic_brc: 3A 38 20 29 01 01 01 01 |:8.)....| ... [27-JUN-2016 11:59:29:184] nsbasic_brc: 03 C2 64 64 02 C2 0A 02 |..dd....| [27-JUN-2016 11:59:29:184] nsbasic_brc: C1 1F 06 53 48 45 52 59 |...SHERY| [27-JUN-2016 11:59:29:184] nsbasic_brc: 4C 07 77 BA 07 1F 01 01 |L.w.....| [27-JUN-2016 11:59:29:184] nsbasic_brc: 01 08 53 41 4C 45 53 4D |..SALESM| [27-JUN-2016 11:59:29:184] nsbasic_brc: 41 4E 03 C2 4D 63 02 C2 |AN..Mc..| [27-JUN-2016 11:59:29:184] nsbasic_brc: 15 |. | [27-JUN-2016 11:59:29:184] nsbasic_brc: exit: oln=0, dln=407, tot=417, rc=0 ※ 参考情報 Oracle Net Servicesのトレース・ファイルの評価 http://docs.oracle.com/cd/E16338_01/network.112/b56288/trouble.htm#i459469
  83. 83. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | Oracle Net Trace を trcasst で検証 [svr_4432.trc (svr_<SPID>.trc)] 83 $ trcasst svr_4432.trc ... Start Timestamp : 27-JUN-2016 11:52:08:018 End Timestamp : 27-JUN-2016 12:03:23:456 ... ORACLE NET SERVICES: Total Calls : 20 sent, 21 received, 0 oci Total Bytes : 5475 sent, 5731 received Average Bytes: 273 sent per packet, 272 received per packet Maximum Bytes: 2349 sent, 2585 received Grand Total Packets: 20 sent, 21 received ※ 参考情報 トレース・アシスタントを使用したトレース・ファイルの検証 http://docs.oracle.com/cd/E16338_01/network.112/b56288/trouble.htm#i459188 送受信パケットの統計情報を出力
  84. 84. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | Oracle Net Trace の設定. [<oracle-home>/network/admin/sqlnet.ora] : Oracle Net Services の設定ファイル 84 TRACE_LEVEL_SERVER=16 TRACE_TIMESTAMP_SERVER=ON TRACE_DIRECTORY_SERVER= <oracle-home>/network/trace DIAG_ADR_ENABLED=OFF ※ 参考情報 SQL*Net/Net8/Oracle Net Servicesのトレースの取得方法(KROWN:13481) (Doc ID 1703086.1) sqlnet.oraファイルのトレース・パラメータ http://docs.oracle.com/cd/E16338_01/network.112/b56288/trouble.htm#i435776 ※ 設定後に新規に作られたデータベース接続から Net Trace が開始されます
  85. 85. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | Database が処理するデータを確認 85 WLS Managed Server (Server-0) HTTP Server (Embedded) Web Service (Servlet + JAX-WS) Database Web Container EJB (Stateless Session Bean) JTA (Javax.transaction.TransactionManager) Data Source SOAP Client (soapUI) EJB Container Transaction Manager JDBC Driver (Thin XA) JPA (EclipseLink)
  86. 86. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | Oracle SQL Trace を確認 (1) [orcl_ora_4432_SCOTT.trc (<SID>_ora_<SPID>_<scheme-name>.trc)] : SQL のパース 86 ===================== PARSING IN CURSOR #140122095372064 len=117 dep=0 uid=83 oct=2 lid=83 tim=1466996369185199 hv=3728398626 ad='63f76b50' sqlid='1bkaadbg3pq92' INSERT INTO EMP (EMPNO, COMM, DEPTNO, ENAME, HIREDATE, JOB, MGR, SAL) VALUES (:1 , :2 , :3 , :4 , :5 , :6 , :7 , :8 ) END OF STMT PARSE #140122095372064:c=1000,e=614,p=0,cr=0,cu=0,mis=1,r=0,dep=0,og=1,plh=0,tim=1466996369185198 ===================== ... (続く) ※ 参考情報 TKPROFにかける前のSQLトレースのファイルの解析(KROWN:53665) (Doc ID 1718603.1) Interpreting Raw SQL_TRACE output (Doc ID 39817.1) 1466996369185198 = 2016/06/27 11:59:29.185198 (エポック (1970/01/01) からのマイクロミリ秒)
  87. 87. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | Oracle SQL Trace を確認 (2) [orcl_ora_4432_SCOTT.trc (<SID>_ora_<SPID>_<scheme-name>.trc)] : 変数のバインド 87 BINDS #140122095372064: Bind#0 oacdty=02 mxl=22(22) mxlc=00 mal=00 scl=00 pre=00 oacflg=03 fl2=1000000 frm=01 csi=873 siz=192 off=0 kxsbbbfp=7f70b7f5ca70 bln=22 avl=03 flg=05 value=9999 ... Bind#3 oacdty=01 mxl=32(24) mxlc=00 mal=00 scl=00 pre=00 oacflg=03 fl2=1000010 frm=01 csi=873 siz=0 off=72 kxsbbbfp=7f70b7f5cab8 bln=32 avl=06 flg=01 value="SHERYL" ... (続く) oacdtv=02 : NUMBER 型 ※ 参考情報 Oracleの組込みデータ型 http://docs.oracle.com/cd/E16338_01/server.112/b56299/sql_elements001.htm#i54330 oacdtv=01 : VARCHAR2 型
  88. 88. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | Oracle SQL Trace を確認 (3). [orcl_ora_4432_SCOTT.trc (<SID>_ora_<SPID>_<scheme-name>.trc)] : トランザクションのコミット 88 XCTEND rlbk=0, rd_only=0, tim=1466996389252541 ※ 参考情報 COMMITやROLLBACKが行われたタイミングについて(KROWN:22776) (Doc ID 1706879.1) XCTEND はトランザクションの終了を表す rlbk=0 : コミット rlbk=1 : ロールバック 1466996389252541 = 2016/06/27 11:59:49.252541 (エポック (1970/01/01) からのマイクロミリ秒)
  89. 89. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | Oracle SQL Trace の設定 (1) • データベース・接続レベルでの設定 • データベース・インスタンスレベルでの設定 89 ※ 参考情報 event 10046 と sql_trace の関係 (alter文で動的に設定した場合の動作)(KROWN:27357) (Doc ID 1708940.1) ※ 設定後のデータベース接続でその後すぐに SQL Trace が開始されます 設定 : SQL> alter session set events '10046 trace name context forever, level 12' 設定解除 : SQL> alter session set events '10046 trace name context off' ※ 設定後に新規に作られたデータベース接続から SQL Trace が開始されます 設定 : SQL> alter system set events '10046 trace name context forever, level 12' 設定解除 : SQL> alter system set events '10046 trace name context off‘
  90. 90. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | Oracle SQL Trace の設定 (2) • event 10046 の level による違い 90 ※ 参考情報 event 10046 と sql_trace の関係 (alter文で動的に設定した場合の動作)(KROWN:27357) (Doc ID 1708940.1) level 1 : 通常の SQL Trace level 4 : level 1 の内容 + バインド変数の情報 level 8 : level 1 の内容 + WAIT event の情報 level 12 : level 1 の内容 + バインド変数の情報 + WAIT event の情報 ※ デバッグ目的であれば、通常は level 12 を設定して下さい
  91. 91. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | Oracle SQL Trace の設定 (3).. • トリガーの設定 • トリガーの設定解除 ログオントリガーを使用した特定スキーマの SQL Trace の取得 91 SQL> CREATE OR REPLACE TRIGGER logontrig AFTER logon ON database 2 begin 3 if ora_login_user = 'SCOTT' then 4 execute immediate 'alter session set tracefile_identifier = '||'SCOTT'; 5 execute immediate 'alter session set events ''10046 trace name context forever, level 12'''; 6 end if; 7 end; 8 / ※ 参考情報 LOGON トリガーを使用して SOA Suite が実行する SQL をトレースする方法(KROWN:156209) (Doc ID 1758802.1) SQL> DROP TRIGGER logontrig; データベース・接続レベルでの SQL Trace 取得を有効化 SQL Trace ファイル名に含める文字列を設定
  92. 92. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | Program Agenda はじめに 検証アプリケーションの動作シナリオ説明 各ポイントでの見える化実践 Java Flight Recorder からの見える化 まとめ 1 2 3 4 5 92
  93. 93. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | 前章の見える化アプローチと比較したときのメリット • リクエストに紐づく情報を GUI で確認できる • Java アプリケーションコードの変更、再ビルド、再デプロイは必要ない • 管理コンソールなどでの設定変更は必要ない • デバッグログなどの設定は必要ない 93
  94. 94. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | 前章の見える化アプローチと比較したときのデメリット • 調査に必要な情報を必ず得られるとは限らない • 得られない情報を確認する場合は、別途詳細アプローチが必要 94
  95. 95. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | Java Flight Recorder は標準の Java SE に付属している • Java Flight Recorder を使用可能なバージョン – Oracle Java SE 7 Update 40 以降 – Oracle Java SE 8 95 ※ Java SE の他に追加インストールは必要ありません
  96. 96. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | Java Flight Recorder は商用機能です • 本番環境での商用利用の場合はライセンスが必要です – Oracle Java SE Advanced または Oracle Java SE Suite – Oracle WebLogic Server Enterprise Edition または Oracle WebLogic Server Suite 96 ※ WLS EE は Oracle Java SE Advanced を含みます ※ WLS Server Suite は WLS EE を含みます Oracle Fusion Middlewareライセンス情報ユーザー・マニュアル 2.2 Oracle WebLogic Server http://docs.oracle.com/cd/E68912_01/doc.1213/FMWLC/products2.htm#CHCJBBEG
  97. 97. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | Java Flight Recorder のフライト記録確認の流れ • Java Flight Recorder (JFR) は JVM からファイルへフライト記録を出力する • Java Mission Control (JMC) でフライト記録を開いて内容を GUI で確認する 97 フライト記録 Servlet JavaVM JDBC Java Mission ControlJava Flight Recorder JVM WLS Java アプリ
  98. 98. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | ECID に関連するイベントの確認 [WebLogic (タブ) ] – [ECID ] 98 ... 特定の ECID に紐付くイベントのみを一覧できる
  99. 99. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | ECID に関連するイベントのグラフ [イベント (タブ) ] – [グラフ ] 99 Servlet JDBC EJB Java
  100. 100. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | Servlet 実行イベントの情報 [イベント (タブ) ] – [グラフ ] 100 Servlet
  101. 101. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | EJB 実行イベントの情報 [イベント (タブ) ] – [グラフ ] 101 EJB
  102. 102. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | JDBC 実行イベントの情報 [イベント (タブ) ] – [グラフ ] 102 JDBC
  103. 103. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | Socket Read (Java) 実行イベントの情報 (1) [イベント (タブ) ] – [グラフ ] 103 Java
  104. 104. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | Socket Read (Java) 実行イベントの情報 (2). [イベント (タブ) ] – [ログ ] 104 ... すべてのスタックを確認できる
  105. 105. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | WebLogic Server プラグインのインストール [WebLogic (タブ) ] 表示と使用のため 105
  106. 106. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | フライト記録の取得開始 (1) • フライト記録の開始ウィザードを起動 106
  107. 107. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | フライト記録の取得開始 (2) • 記録方法を設定 107
  108. 108. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | フライト記録の取得開始 (3) • 記録オプションを設定 108
  109. 109. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | フライト記録の取得開始 (4). • 記録が開始していることを確認 109
  110. 110. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | フライト記録のダンプ • 記録をダンプしてファイルへ出力 110
  111. 111. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | Java Mission Control の使い方 • Java Mission Control オンラインヘルプ 111
  112. 112. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | Java Flight Recorder についての参考情報 • 製品ドキュメント • Advisor Webcast 資料 112 Java Platform, Standard Editionトラブルシューティング・ガイド (日本語) http://docs.oracle.com/javase/jp/8/docs/technotes/guides/troubleshoot/ Java Platform, Standard Edition Troubleshooting Guide (英語) http://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/ Java Mission Control ドキュメント http://docs.oracle.com/javacomponents/jp/index.html jcmd コマンド http://docs.oracle.com/javacomponents/jp/jmc-5-5/jfr-runtime-guide/comline.htm java コマンド http://docs.oracle.com/javase/jp/8/docs/technotes/tools/windows/java.html Advisor Webcast : Java Flight Recorder でサクサクすすむ WebLogic Serverトラブルシューティン グ (Doc ID 2100914.1)
  113. 113. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | Program Agenda はじめに 検証アプリケーションの動作シナリオ説明 各ポイントでの見える化実践 Java Flight Recorder からの見える化 まとめ 1 2 3 4 5 113
  114. 114. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | まとめ • 情報の見える化によって動作の把握や問題個所の切り分けができます • 各ポイントでの詳細調査のお供に、Java Flight Recorder も役に立ちます • ぜひ今後の問題調査やトラブルシュートに役立ててください! • ありがとうございました 114
  115. 115. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. |115
  116. 116. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | 116

×