- PR -

更新4回でロック

投稿者投稿内容
ぱあ
会議室デビュー日: 2005/05/27
投稿数: 18
投稿日時: 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 ]
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2005-06-19 23:58
アプリケーションがフリーズしたらスレッドダンプをとって解析してみましょう。
どこの行で処理が固まったいる/ループしているかわかります。
Anthyhime
ぬし
会議室デビュー日: 2002/09/10
投稿数: 437
投稿日時: 2005-06-20 06:12
(2) conを使ってupdate;
(2)conを使ってselect;

の内容が知りたいです。
ぱあ
会議室デビュー日: 2005/05/27
投稿数: 18
投稿日時: 2005-06-20 09:49
引用:

インギさんの書き込み (2005-06-19 23:58) より:
アプリケーションがフリーズしたらスレッドダンプをとって解析してみましょう。
どこの行で処理が固まったいる/ループしているかわかります。



スレッドダンプの該当箇所と思われる部分です。
スレッドダンプの情報としてはこれでいいのでしょうか?

"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/05/27
投稿数: 18
投稿日時: 2005-06-20 09:51
引用:

Anthyhimeさんの書き込み (2005-06-20 06:12) より:
(2) conを使ってupdate;
(2)conを使ってselect;

の内容が知りたいです。



処理の部分を抜粋しました。

<更新>

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/05/27
投稿数: 18
投稿日時: 2005-06-20 11:00
上記のURLで
「DataSource#getConnection() の前にBasicDataSource#getNumActive()、BasicDataSource#getNumIdle() を出力してみる」
と書いてあったのですが具体的にはどうやるのでしょうか?

試しにやってみたのですが、org.apache.commons.dbcp.BasicDataSourceのimportで
「パッケージ org.apache.commons.dbcp は存在しません。」となってしまいました。

なんか根本からはずしているような気になってきました。。。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2005-06-20 20:26
コネクションプールが空になって、
取得側のスレッドが開放待ちになっているような感じですね。
更新時に例外が発生して、コネクションのクローズの処理が
行われていないって事はないですか?

ソースを見た限りではちょっとわからないですが、
業務ロジックで発生した例外をコントローラで握りつぶしているって事も
あり得ない訳ではないので。

ぱあ
会議室デビュー日: 2005/05/27
投稿数: 18
投稿日時: 2005-06-20 23:18
引用:

コネクションプールが空になって、
取得側のスレッドが開放待ちになっているような感じですね。
更新時に例外が発生して、コネクションのクローズの処理が
行われていないって事はないですか?



updateを発行する処理とコネクションのクローズは別のオブジェクトになっていてupdateが失敗してもcloseできるようにしています。
(updateの処理から返ってきたらcloseするようにしてます)
一応ログ(isClosed())も取得してみましたがtrueでしたのでcloseが発行されていることは間違いないと思います。


[ メッセージ編集済み 編集者: ぱあ 編集日時 2005-06-20 23:30 ]

スキルアップ/キャリアアップ(JOB@IT)