戯言

つらつらと気づいたことを書いていきます。人狼とか。

スポンサーサイト


上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

tomcatの起動に時間がかかる


tomcatの起動に、数分かかるようになったのでcatalinaのログを見てみたところ、

INFO: Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [213,276] milliseconds.

と、SecureRandom インスタンスを生成している箇所で、3分半くらいかかっていた。

これは、Javaのバグらしく、tomcatの起動オプションに、
-Djava.security.egd=file:/dev/./urandom
を加えることで解決しました。

デフォルトでは、/dev/random を使うけど、/dev/./urandomに変更することで回避できるみたい。

参考URL:http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6202721

変更後は、tomcatの起動処理はすぐに終わるようになって、上記のログは出力されなくなりました。



スポンサーサイト

デバッグ用設定の戻し忘れで、Connection has already been closed.


こんなログが出てました。

catalina.out にはこんなログ
2015/02/08 19:46:39 org.apache.tomcat.jdbc.pool.ConnectionPool abandon
警告: Connection has been abandoned PooledConnection[org.apache.derby.impl.jdbc.EmbedConnection40@1059970 (XID = 1881168832), (SESSIONID = 131), (DATABASE = /javadb/werewolf), (DRDAID = null) ]:java.lang.Exception
	at org.apache.tomcat.jdbc.pool.ConnectionPool.getThreadDump(ConnectionPool.java:1063)
	at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:780)
	at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:619)
	at org.apache.tomcat.jdbc.pool.ConnectionPool.getConnection(ConnectionPool.java:188)
	at org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection(DataSourceProxy.java:128)
	:
	:

例外発生時のスタックトレースはこんなログ

java.sql.SQLException: Connection has already been closed.
	at org.apache.tomcat.jdbc.pool.ProxyConnection.invoke(ProxyConnection.java:117)
	at org.apache.tomcat.jdbc.pool.JdbcInterceptor.invoke(JdbcInterceptor.java:109)
	at org.apache.tomcat.jdbc.pool.DisposableConnectionFacade.invoke(DisposableConnectionFacade.java:80)
	at com.sun.proxy.$Proxy6.commit(Unknown Source)
	at jp.werewolf.db.DBAccess.reDropInsertAndCreateIndexRecord(DBAccess.java:4334)
	:
	:

close漏れ発見のために、DBCP のコネクションの追跡機能で removeAbandoned=true、
logAbandoned=trueで運用していて、
close漏れの対応完了後もそのままにしていたところ、
裏で回しておくだけの長時間かかるトランザクションが、
タイムアウト時間以上かかってしまって、これらのエラーとなりました。

クエリがまだ実行中にもかかわらず、タイムアウト時間がきて
コネクションが回収されてしまうと、 abandon の警告ログが出ます。
で、さらに回収後にクエリを実行して Connection has already been closed. と
なったようです。

タイムアウト時間を延ばそうかとも思ったのですが、
abandon の機能自体を無効にしました。

調査後もデバッグ用の設定のままにしていた凡ミスです。




tomcatの起動時にjavaDB関連のクラスでClassNotFoundExceptionが発生する


tomcatのバージョンが上がり、DBCPの仕組みが変わったらしく、

  [アプリ名]/WEB-INF/lib

ではなく、

  [tomcatインストールディレクトリ]/lib

配下にJDBCドライバのjarファイルを置いておかないといけなくなったようです。

derby関連のjarファイルを、移動して解決しました。


DBCPの設定は

   [tomcatインストールディレクトリ]/conf/Catalina/localhost/[アプリ名].xml

で Resource 定義していたんですが、
設定中のJDBCドライバのクラスを探せなくて、
ClassNotFoundExceptionになったっぽいです。

tomcat7のマイナーバージョンを上げただけなんですが、
急に使えなくなったりするのね。

以前から、[tomcatインストールディレクトリ]/lib に置くのが正当だったようで。



2月1日のメンテでは、この問題を解決してトラブル終了と笑みを浮かべていたら、更なる問題が発生したわけですが・・・。

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。