Nov 08, 2008

[Tiger] Java SE のサポート終了ポリシーをメモ

2008/10/30 を以て Java SE 1.4 が EOSL を迎えた。 1 年後の 2009/10/30 には Java SE 5.0 までもが EOSL を迎える。 Java SE for Business も考慮しなくてはいけないかもしれない。

Java SE & Java SE for Business Support Road Map
http://java.sun.com/products/archive/eol.policy.html
Sun End of Service Life (EOSL) Policy
http://www.sun.com/service/eosl/index.jsp
Java SE for Business
http://www.sun.com/software/javaseforbusiness/
Java SE for Business(日本語)
http://jp.sun.com/products/software/javaseforbusiness/index.html

Posted in Tiger | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Nov 07, 2008

[AS] Apache Tomcat + DBCP で Connection のリークを確認する方法をメモ

Apache Tomcat + DBCP の環境で Connection のリークを確認する方法をメモしておく。 この設定のおかげで、リリース直前のコードに潜んでいた Connection のリークを発見できた。 Connection を自前でハンドリングするのであれば、もう少し気を使ってコーディングして欲しいものだ。 とは言え、コーディングするのも人間。 ミスすることを前提として、開発環境では必ずこの設定をしておきたい。 そのうち自分でやらかして怒られるかもしれないし(^^;

Apache Tomcat 6.0 - JNDI Datasource HOW-TO : Preventing dB connection pool leaks
http://tomcat.apache.org/tomcat-6.0-doc/jndi-datasource-examples-howto.html#Preventing%20dB%20connection%20pool%20leaks

context.xml の設定

Apache Tomcat にディプロイする Web アプリケーションの context.xml に以下の設定を追加する。

<Context ...>
  <Resource ...
        factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory"
        removeAbandoned="true"
        removeAbandonedTimeout="300"
        logAbandoned="true" />
</Context>

各設定の意味は以下の通り(Commons DBCP - Configurationより抜粋)。
Parameter Default Description
removeAbandoned false Flag to remove abandoned connections if they exceed the removeAbandonedTimout. If set to true a connection is considered abandoned and eligible for removal if it has been idle longer than the removeAbandonedTimeout. Setting this to true can recover db connections from poorly written applications which fail to close a connection.
removeAbandonedTimeout 300 Timeout in seconds before an abandoned connection can be removed.
logAbandoned false Flag to log stack traces for application code which abandoned a Statement or Connection. Logging of abandoned Statements and Connections adds overhead for every Connection open or new Statement because a stack trace has to be generated.

設定の確認

設定が有効な状態で Apache Tomcat を起動すると、起動時に下記の様なメッセージがコンソールに出力される。

AbandonedObjectPool is used (org.apache.tomcat.dbcp.dbcp.AbandonedObjectPool@5f8bae)
   LogAbandoned: true
   RemoveAbandoned: true
   RemoveAbandonedTimeout: 300

コネクションのリーク検知

コネクションのリークが検知されると、以下の様なログが出力される。

DBCP object created 2008-11-06 12:01:25 by the following code was never closed:
java.lang.Exception
  at org.apache.tomcat.dbcp.dbcp.AbandonedTrace.setStackTrace(AbandonedTrace.java:157)
  at org.apache.tomcat.dbcp.dbcp.AbandonedObjectPool.borrowObject(AbandonedObjectPool.java:76)
  at org.apache.tomcat.dbcp.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:95)
  at org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:540)
  at jp.in_vitro.myapp.MyServlet.doGet(MyServlet.java:10)
  at javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
  at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
  at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
  at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
  at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
  at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
  at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
  at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
  at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
  at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
  at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:833)
  at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:639)
  at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1285)
  at java.lang.Thread.run(Thread.java:595)

Posted in AS | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Nov 05, 2008