はじめに
業務経験で遭遇したTomcatの対処法を述べます。
EL式のパースエラー
Tomcatのversionを6.0.20から6.0.45にマイグレーションを行った時に、
JSPファイルへのアクセスで発生した。
背景として「java6からjava7」への対応も同時期に行った。
ログファイルから解析するに、JSPをコンパイルしたときのjavaファイルで発生していた。
問題箇所は、4桁以上の数値をカンマ区切りに成形した文字列と「0」のイコール比較をEL式内で行っている箇所でした。
暫定対応として、EL式内の「0」を「''」でくくってみると、うまく動作しました。
<c:if test="${human.count eq '0'}">
</c:if>
マイグレーション前では何故動作していたかは正直不明です。
パッケージ管理下でない状況のTomcatマイグレーション
(1)シンボリックリンクを活用し、運用中のTomcatと同一ディレクトリにあるかのようにふるまう。
(2)古いTomcatはバックアップを残して置き、リリース不備時に切り戻しを行えるようにする。
*あくまで一例です。
スタート、シャットダウンを素早く行いたい
エイリアスを張る。エイリアスはシンボリックリンクを参照する。
パフォーマンスダウン
tomcat起動時からしばらく経つとCPU利用率が跳ね上がる事象。
背景として「java6からjava7」への対応も同時期に行った。
下記URLの解決策をtomcatのstartup.shに適応するとパフォーマンス劣化を確認しなくなった。
参考)http://blog.cybozu.io/entry/2016/04/13/080000
web.xml
JDKマイグレーション時に動作しない
「java6からjava7」への対応時にtomcatのweb.xmlの下記要素を書き換えることにより対応。
compilerSourceVM
compilerTargetVM
jsp 65535 bytes limit
mappedfile
1メソッドのサイズが64KBを超えた場合に発生するようです。
tomcat起動時にjspをコンパイルした時に発生したため、antやjenkinsで検知できそうもない。
tomcatのweb.xmlのmappedfile属性をfalseにすることでとりあえずの処置ができました。
(そもそもそんなサイズにしないようにリファクタリングするのがベストです)
<init-param>
<param-name>mappedfile</param-name>
<param-value>false</param-value>
</init-param>
genStringAsCharArray
genStringAsCharArrayをtrueにすることでもとりあえずの処置を行えます。
ただ、効かないことを確認したため調べてみたら変数名がバージョンで異なる模様。
6.0.38以前:genStrAsCharArray
6.0.38以降:genStringAsCharArray
パラメータが異なる
<!-- isVirtualWebappRelative -->
<!-- Should "virtual" paths be interpreted as -->
<!-- relative to the context root, instead of -->
<!-- the server root? (0=false, 1=true) [0] -->
<!-- isVirtualWebappRelative -->
<!-- Should "virtual" paths be interpreted as -->
<!-- relative to the context root, instead of -->
<!-- the server root? [false] -->