- - PR -
更新4回でロック
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2005-06-19 23:23
StrutsでDBと連携するシステムを開発しています。
ORACLEのDBを4回更新するとその後ページがロックされたように動かなくなります。 3回目までは参照系の処理は動きます。 調べたら Connection con = getDataSource(request).getConnection(); の部分で固まってしまうようです。 更新の処理では毎回 (1)Connection con = getDataSource(request).getConnection(); (2) conを使ってupdate; (3)con.commit(); (4)con.close(); としていますが、これではコネクションは解放されないのでしょうか? 参照の処理では毎回 (1)Connection con = getDataSource(request).getConnection(); (2)conを使ってselect; (3)con.close(); としています。 [ メッセージ編集済み 編集者: ぱあ 編集日時 2005-06-19 23:29 ] | ||||
|
投稿日時: 2005-06-19 23:58
アプリケーションがフリーズしたらスレッドダンプをとって解析してみましょう。
どこの行で処理が固まったいる/ループしているかわかります。 | ||||
|
投稿日時: 2005-06-20 06:12
(2) conを使ってupdate;
(2)conを使ってselect; の内容が知りたいです。 | ||||
|
投稿日時: 2005-06-20 09:49
スレッドダンプの該当箇所と思われる部分です。 スレッドダンプの情報としてはこれでいいのでしょうか? "TP-Processor3" daemon prio=1 tid=0x0830b7e0 nid=0x1310 in Object.wait() [a86ee000..a86efcd0] at java.lang.Object.wait(Native Method) - waiting on <0xab4b4020> (a org.apache.commons.pool.impl.GenericObjectPool) at java.lang.Object.wait(Object.java:429) at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:748) - locked <0xab4b4020> (a org.apache.commons.pool.impl.GenericObjectPool) at org.apache.commons.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:95) at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:540) at action.catalog.CatalogDetailShowAction.newData(CatalogDetailShowAction.java:252) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:324) at org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:276) at org.apache.struts.actions.LookupDispatchAction.execute(LookupDispatchAction.java:162) at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:421) at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:226) at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1164) at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:415) at javax.servlet.http.HttpServlet.service(HttpServlet.java:709) at javax.servlet.http.HttpServlet.service(HttpServlet.java:802) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157) at filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:122) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214) at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520) at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152) at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:540) at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137) at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:118) at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929) at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160) at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:300) at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:374) at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:743) at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:675) at org.apache.jk.common.SocketConnection.runIt(ChannelSocket.java:866) at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683) at java.lang.Thread.run(Thread.java:534) "TP-Processor2" daemon prio=1 tid=0x0830a578 nid=0x130f in Object.wait() [a876f000..a8770cd0] at java.lang.Object.wait(Native Method) - waiting on <0xac10edc8> (a org.apache.commons.pool.impl.GenericObjectPool) at java.lang.Object.wait(Object.java:429) at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:748) - locked <0xac10edc8> (a org.apache.commons.pool.impl.GenericObjectPool) at org.apache.commons.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:95) at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:540) at action.catalog.CatalogDetailShowAction.newData(CatalogDetailShowAction.java:252) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:324) at org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:276) at org.apache.struts.actions.LookupDispatchAction.execute(LookupDispatchAction.java:162) at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:421) at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:226) at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1164) at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:415) at javax.servlet.http.HttpServlet.service(HttpServlet.java:709) at javax.servlet.http.HttpServlet.service(HttpServlet.java:802) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157) at filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:122) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214) at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520) at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152) at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:540) at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137) at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:118) at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929) at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160) at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:300) at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:374) at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:743) at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:675) at org.apache.jk.common.SocketConnection.runIt(ChannelSocket.java:866) at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683) at java.lang.Thread.run(Thread.java:534) | ||||
|
投稿日時: 2005-06-20 09:51
処理の部分を抜粋しました。 <更新> private static final String UPDATESTATUS = "update catalog set STATUS=? where id = ?"; PreparedStatement pStmt = null; try{ pStmt = con.prepareStatement(UPDATESTATUS); pStmt.setString(1,status); pStmt.setString(2,id); pStmt.executeUpdate(); }catch(SQLException ex){ throw ex; }finally{ pStmt.close(); } <参照> PreparedStatement pStmt = null; ResultSet rs = null; try{ pStmt = con.prepareStatement(SELECTDETAIL); pStmt.setString(1,id); rs = pStmt.executeQuery(); if(rs.next()){ return getProduct(rs); } }catch(SQLException ex){ throw ex; }finally{ if(rs != null){ rs.close(); } pStmt.close(); } 私の現象と似たような書き込み(http://www.jajakarta.org/kvasir/bbs/technical/855?msg=3#msg2925)を見つけたのですが、私のほうでは共有サーバーの設定をしていないので該当しないものと思われます。 | ||||
|
投稿日時: 2005-06-20 11:00
上記のURLで
「DataSource#getConnection() の前にBasicDataSource#getNumActive()、BasicDataSource#getNumIdle() を出力してみる」 と書いてあったのですが具体的にはどうやるのでしょうか? 試しにやってみたのですが、org.apache.commons.dbcp.BasicDataSourceのimportで 「パッケージ org.apache.commons.dbcp は存在しません。」となってしまいました。 なんか根本からはずしているような気になってきました。。。 | ||||
|
投稿日時: 2005-06-20 20:26
コネクションプールが空になって、
取得側のスレッドが開放待ちになっているような感じですね。 更新時に例外が発生して、コネクションのクローズの処理が 行われていないって事はないですか? ソースを見た限りではちょっとわからないですが、 業務ロジックで発生した例外をコントローラで握りつぶしているって事も あり得ない訳ではないので。 | ||||
|
投稿日時: 2005-06-20 23:18
updateを発行する処理とコネクションのクローズは別のオブジェクトになっていてupdateが失敗してもcloseできるようにしています。 (updateの処理から返ってきたらcloseするようにしてます) 一応ログ(isClosed())も取得してみましたがtrueでしたのでcloseが発行されていることは間違いないと思います。 [ メッセージ編集済み 編集者: ぱあ 編集日時 2005-06-20 23:30 ] |