- - PR -
webアプリが数時間後に勝手におかしくなる
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2004-10-16 10:18
いつも御世話になります。j2sdk1.4.2_05,tomcat5.0.28,MYSQL4.1.5gammaです。
tomcatを起動して、問題無く動作していたwebアプリが翌日おかしくなってしまいます。tomcatを起動しなおすとまた正常に動作するのですが、エラーはsqlエラーっぽいです。情報が少な過ぎて申し訳ないです。わかり次第情報を追加しますが、この時点で考えられる原因とかはありますでしょうか?ご教示いただきたいです。 |
|
投稿日時: 2004-10-16 10:31
あいつーです。
情報が少なくてなんともいえませんが、 (SQLエラーならその文言を乗せていただいたほうが回答し易くなると思います) DB周りのコネクション開放などは正しく行っていますか? |
|
投稿日時: 2004-10-16 13:38
take さん、こんにちは。
ともかく原因を見つけない事には対処もできないでしょうから。 アプリケーションの適当な場所で Log4J などを使いログを取ってみてはどうでしょうか? それから、JDBC などの例外はちゃんと処理してますか? 私がいつもWebアプリを作るときは以下の項目のログを取っています 1) exception 2) get/post されたパラメター 3) 実行した SQL 文 4) 実行された関数の概要がわかるようなログ(Struts なら Action単位) 開発時、運用初期は このようなログを出しておくと問題が起きたときの切り分けが早く できます。 |
|
投稿日時: 2004-10-17 11:21
DBコネクションを close() しわすれて、使い尽くしているに一票。
プロファイラを使いながら、負荷テストをしてみるとよいですよ。 |
|
投稿日時: 2004-10-17 17:18
ベストな方法ではないかもしれませんが、私が以前Connectionのクローズ漏れを 調査したときは、Connectionインターフェースを実装するラッパクラスを作って、 コンストラクタと、#close()メソッド内でログを出すようにしました。 staticフィールドを使うなりして、インスタンスに一意なIDを付けてやれば、 Connection[ID:1] open. Connection[ID:2] open. Connection[ID:1] close. のような感じでログが取れるので、どの(どこで使われた)Connectionが クローズされていないかを特定できます。 |
|
投稿日時: 2004-10-18 10:59
皆様ご返答ありがとうございます。ログをとることは重要だと前々から思ってはいたのですが、いつもいきあたりばったりのやりかたばっかりしてたので成長しないのか。そろそろいきあたりばったりが通用しない段階にきたようです。(-.-)
実際わたしの頭にはログの概念が薄いものですから、なんとかログとはなんなのかがわかる位から勉強したいです。以下にソースコードを全部貼ります。(貼っていいのかな?) 貼ったうえで皆様から御指摘いただきたいのは2点です。 1.ログの取りかた 2.ソースの書き方でこのへんはこうしたほうがいいんじゃない? 長々とソースコードが続きますが、どうぞお時間があるときでも御指摘いただければ幸いです。 **** index.html **** <html> <head> <title>ようこそデータ管理ツールへ!</title> </head> <body bgcolor="#FFFFFF"> <table border='0' align='center'> <tr><td bgcolor='#00ffff' align='center'> <h1>データ管理ツール</h1> </td></tr> <tr><td bgcolor='#adff2f' align='center'> ユーザーIDとパスワードを入力してください <form action='servlet/CheckLoginSession' method='post'> <br> <table border='0'> <tr><td>ID:</td><td><input type='text' name='userid' style='ime-mode:disabled;'></td></tr> <tr><td>password:</td><td><input type='password' name='pass'></td></tr> </table> <input type='submit' name='login' value='ログイン'> </form> </td></tr> </table> </body> </html> *** loginerror.html *** <!DOCTYPE HTML PUBLIC "-//w3c//dtd html 4.0 transitional//en"> <head> <title>ログインエラー</title> </head> <body bgcolor="#FFFFFF"> <h1>IDまたはパスワードに誤りがあります</h1> <a href='../index.html'>ログインページに戻る</href> </body> </html> *** CheckLoginSession.java *** import java.io.IOException; import java.sql.ResultSet; import java.sql.SQLException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import kamiBeans.DbAccess; import kamiBeans.SessionInfo; /* * 作成日: 2004/09/27 * * この生成されたコメントの挿入されるテンプレートを変更するため * ウィンドウ > 設定 > Java > コード生成 > コードとコメント */ /** * @author root * * この生成されたコメントの挿入されるテンプレートを変更するため * ウィンドウ > 設定 > Java > コード生成 > コードとコメント */ public class CheckLoginSession extends HttpServlet { protected void doPost( HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //ローカル変数 String userId=null; String pass=null; String trueUserId=null; String truePass=null; String toUrl=null; ResultSet rs=null; HttpSession thisSession=request.getSession(); //セッション取得 response.setContentType("text/html; charset=EUC-JP");//EUC-JP userId= request.getParameter("userid"); pass=request.getParameter("pass"); String s=null; try { DbAccess db=new DbAccess(); if(userId.length()==0){ toUrl="/loginerror.html"; }else{ s="select * from syainmasta where syainid="+userId;//後にはsyainid→ninsyoId rs= db.selDb(s); if(rs.next()){ trueUserId=rs.getString("syainid"); truePass=rs.getString("keitai_tel"); } if(userId.equals(trueUserId)/* && pass.equals(truePass)*/){//のちにはちゃんとした認証用IDを作成 SessionInfo se=new SessionInfo(userId,rs.getString("busyoid"),null,null,rs.getString("simei")); thisSession.setAttribute("sessionInfo",se); toUrl="/jsp/welcome.jsp"; }else{ toUrl="/loginerror.html"; } } getServletContext().getRequestDispatcher(toUrl).forward(request,response); } catch (ClassNotFoundException e) { request.setAttribute("msg","class"); toUrl="/jsp/error.jsp"; getServletContext().getRequestDispatcher(toUrl).forward(request,response); } catch (SQLException e) { request.setAttribute("msg","sql"); request.setAttribute("msg2",s); toUrl="/jsp/error.jsp"; getServletContext().getRequestDispatcher(toUrl).forward(request,response); } catch (Exception e) { request.setAttribute("msg","exep"); toUrl="/jsp/error.jsp"; getServletContext().getRequestDispatcher(toUrl).forward(request,response); } } } *** ConnectionPool.java *** /* * 作成日: 2004/10/02 * * この生成されたコメントの挿入されるテンプレートを変更するため * ウィンドウ > 設定 > Java > コード生成 > コードとコメント */ package kamiBeans; import java.sql.*; import java.util.Vector; /*コネクションを保持し管理するクラス */ public class ConnectionPool { //唯一のインスタンス private static ConnectionPool connectionPool=null; //同時にデータベースに接続可能なコネクション数 private int maxConp=5; //コネクションを保持するベクトル private Vector connections=null; //データベースへのアクセスに必要な値達 private String driver="com.mysql.jdbc.Driver"; private String url="jdbc:mysql://localhost/****?useUnicode=true&characterEncoding=ujis";//EUC=JPから変更 private String user="root"; private String pass="******"; //ConnectionPoolのインスタンスを取得する public static ConnectionPool getInstance() throws Exception{ if(ConnectionPool.connectionPool==null){ ConnectionPool.connectionPool=new ConnectionPool(); } return ConnectionPool.connectionPool; } //インスタンスの生成。privateなので外部からnewできない。 private ConnectionPool() throws Exception{ Class.forName(driver); connections=new Vector(); for(int i=0;i<maxConp;i++){ Connection connection=DriverManager.getConnection(url,user,pass); connections.add(connection); } } /*コネクションを取得する。取得できない場合は引数で与えられた * 回数だけ100ミリ秒おきにトライする。それでも取得できなかった * 場合はnullを返す。 * @param count 残りの試行回数 * @returns コネクション * */ public synchronized Connection getConnection(int count){ //もし残りの試行回数が1以下だったらnullを返す。 if(count<1){ return null; } //コネクションが残っていればプールから1つ取り出して提供 if(connections.size()>0){ Connection connection=(Connection)connections.get(0); connections.remove(0); return connection; }else{//コネクションが残っていなければ100ミリ秒待機 try { wait(100); } catch (InterruptedException e) { //試行回数を1つ減らして再度取得を実行 return getConnection(count-1); } } return null; } /** * コネクションを返却する */ public synchronized void releaseConnection(Connection connection){ //プールに返されたコネクションを追加 connections.add(connection); } } *** DbAccess.java *** /* * 作成日: 2004/10/02 * * この生成されたコメントの挿入されるテンプレートを変更するため * ウィンドウ > 設定 > Java > コード生成 > コードとコメント */ package kamiBeans; import java.sql.*; /** * @author root * * この生成されたコメントの挿入されるテンプレートを変更するため * ウィンドウ > 設定 > Java > コード生成 > コードとコメント */ public class DbAccess { final static int connection_try_count=10; private Connection connection=null; private ConnectionPool connectionPool; /** * デフォルトのコンストラクタ * ConnectionPoolのインスタンスを取得する * */ public DbAccess() throws Exception{ connection=null; connectionPool=ConnectionPool.getInstance(); } /** * SQL文を実行した結果のResultSetを返す */ public ResultSet selDb(String sql)throws Exception{ getConnection(); ResultSet resultSet; try{ Statement statement=connection.createStatement(); resultSet=statement.executeQuery(sql); //statement.close();//この処理を書くとResultSetをリターンできない }catch(Exception e){ releaseConnection(); throw e; } releaseConnection(); return resultSet; } /** * SQL文実行(実行クエリ) * */ public void exeDb(String sql)throws Exception{ getConnection(); try{ Statement statement=connection.createStatement(); statement.execute(sql); statement.close(); }catch(Exception e){ releaseConnection(); throw e; } releaseConnection(); } /** * コネクションをプールから取得する * */ private void getConnection()throws Exception{ connection=connectionPool.getConnection(connection_try_count); if(connection==null){ throw new Exception("Can't get DB Connection"); } } /** * コネクションをプールに返却する */ private void releaseConnection(){ if(connection!=null){ connectionPool.releaseConnection(connection); } } /** * なんらかの理由でコネクションの返却洩れが発生しないように * デストラクトされる前にreleaseConnection を実行するようにする */ protected void finalize(){ releaseConnection(); } } *** MyRs.java *** /* * 作成日: 2004/10/06 */ package kamiBeans; import java.sql.Date; import java.sql.ResultSet; import java.sql.SQLException; import java.text.SimpleDateFormat; /** */ public class MyRs { private ResultSet rs; public MyRs(ResultSet r){ rs=r; } public String getString(String columnname) throws SQLException{ String s=null; String returnString=null; s=rs.getString(columnname); if(s==null || s.length()==0){ returnString="情報なし"; }else{ returnString=s; } return returnString; } public void beforeFirst() throws SQLException{ rs.beforeFirst(); } public boolean next() throws SQLException{ return rs.next(); } public String getMyDate(String columnname) throws SQLException{ Date date=null; SimpleDateFormat si=new SimpleDateFormat("yyyy'年'MM'月'dd'日'"); date=rs.getDate(columnname); return si.format(date); } public int getInt(String columnname) throws SQLException{ return rs.getInt(columnname); } public int getDateDistance(String columnname) throws Exception{ String s= rs.getString(columnname); String sql="select datediff(now(),'"+s+"') diff"; DbAccess db=new DbAccess(); ResultSet rsdate; rsdate =db.selDb(sql); int returnint; if(rsdate.next()){ returnint=rsdate.getInt("diff"); }else{ returnint=0; } return returnint; } } *** SessionInfo.java *** /* * 作成日: 2004/09/20 * * この生成されたコメントの挿入されるテンプレートを変更するため * ウィンドウ > 設定 > Java > コード生成 > コードとコメント */ package kamiBeans; /** * @author root * * この生成されたコメントの挿入されるテンプレートを変更するため * ウィンドウ > 設定 > Java > コード生成 > コードとコメント */ public class SessionInfo { //グローバル変数 private String userId; //担当者 private String busyoId; //部署ID private String other1; //予備変数1 private String other2; //予備変数2 private String userName; //社員名 //コンストラクタ public SessionInfo(){ } public SessionInfo(String ui,String bi,String o1,String o2,String uname){ this.userId=ui; this.busyoId=bi; this.other1=o1; this.other2=o2; this.userName=uname; } //各セッター、ゲッターメソッド public void setUserId(String s){ this.userId=s; } public String getUserId(){ return userId; } public void setBusyoId(String s){ this.busyoId=s; } public String getBusyoId(){ return busyoId; } public void setOther1(String s){ this.other1=s; } public String getOther1(){ return other1; } public void setOther2(String s){ this.other2=s; } public String getOther2(){ return other2; } public void setUserName(String s){ this.userName=s; } public String getUserName(){ return userName; } } *** ここからはjsp *** *** welcome.jsp *** <%@ page language="java" pageEncoding="EUC-JP" import="kamiBeans.*,java.sql.*"%> <html> <head> <title>業務内容選択</title> </head> <body bgcolor="#FFFFFF"> <table border='0' align='center'><tr bgcolor='#e0ffff'><td> <%SessionInfo se=(SessionInfo)session.getAttribute("sessionInfo");%> <h3>ようこそ、<%=se.getUserName()%>さん!</h3> <h3>表示させたい情報を選択して下さい。</h3><br></td></tr> <tr><td> <%DbAccess db=new DbAccess(); ResultSet rs=null; String s="select * from jspfileinfo"; rs=db.selDb(s); //request.setAttribute("sessionInfo",se); while(rs.next()){%> <a href='/web<%=rs.getString("tolink")%>'><%=rs.getString("title")%></a><br> <%}%> </td></tr></table> </body> </html> *** error.jsp *** <%@ page language="java" pageEncoding="EUC-JP" isErrorPage="true" %> <!DOCTYPE HTML PUBLIC "-//w3c//dtd html 4.0 transitional//en"> <html> <head> <title>エラーページ</title> </head> <body bgcolor="#FFFFFF"> <%String msg = (String)request.getAttribute("msg");%> <%=msg%> <%String msg2 = (String)request.getAttribute("msg2");%> <%=msg2%><br> <h2>エラーが発生しました</h2> <a href='../index.html'>ログインページに戻る</a> </body> </html> *** eigyousaki.jsp *** <%@ page language="java" pageEncoding="EUC-JP" import="kamiBeans.*,java.sql.*"%> <!DOCTYPE HTML PUBLIC "-//w3c//dtd html 4.0 transitional//en"> <html> <head> <title>営業先一覧</title> </head> <body bgcolor="#FFFFFF"> <table border='1' align='center'> <tr><td colspan='4'><a name='0'></a> <% MyRs rors; MyRs gyors; MyRs rsSaisyu; String sql=null; String gyoinf2=null; String gyoinf="select * from gyousyainfo gyoi right join eigyousaki"+ " ei on gyoi.gyousyaid=ei.gyousyaid left join gyousyasyurui gyos on "+ "gyoi.gyousyasyuruiid=gyos.gyousyasyuruiid where ei.rootid="; DbAccess db=new DbAccess(); sql="select * from roots"; rors=new MyRs(db.selDb(sql)); while(rors.next()){%> <a href='#<%=rors.getString("rootid")%>'><%=rors.getString("root")%></a>, <%} rors.beforeFirst();%> </td></tr> <tr align='center'><td>営業先</td><td>住所</td><td>代表者氏名</td><td>電話</td></tr> <%while(rors.next()){%> <tr><td colspan='4' bgcolor='#ccff99'> <a name='<%=rors.getString("rootid")%>'><h3 align='center'><%=rors.getString("root")%></h3></a></td></tr> <tr><td colspan='4' align='center'><a href='#0'>トップへ戻る</a></td></tr> <%gyoinf2=gyoinf+rors.getString("rootid"); gyors=new MyRs(db.selDb(gyoinf2)); while(gyors.next()){%> <tr> <td><a href='/web/jsp/eigyou/eigyousakisyousai.jsp?gid=<%=gyors.getString("gyousyaid")%>'><%=gyors.getString("syamei")%></a></td> <td><%=gyors.getString("juusyo")%></td> <td><%=gyors.getString("daihyousyasimei")%></td> <td><%=gyors.getString("tel")%></td> </tr> <!--今の業者の営業状況IDのMAXを抜き出す--> <%sql="select max(joukyouid) joukyouid from eigyoujoukyou"+ " where gyousyaid="+gyors.getString("gyousyaid"); ResultSet rsMax=db.selDb(sql); if(rsMax.next()){ //状況IDMAXから最終状況 sql="select * from eigyoujoukyou ej left join syainmasta sy on"+ " ej.syainid=sy.syainid left join eigyousakitaiou et on"+ " ej.taiouid=et.taiouid left join eigyoujikantai ejk on"+ " ej.jikantaiid=ejk.jikantaiid"+ " where gyousyaid="+ gyors.getString("gyousyaid")+" and joukyouid="+rsMax.getString("joukyouid"); } rsSaisyu=new MyRs(db.selDb(sql)); if(rsSaisyu.next()){%> <tr><td colspan='4' bgcolor='#c4ffc4'> 最終情報(日付:<%=rsSaisyu.getMyDate("eigyoubi")%>):<%=rsSaisyu.getString("memo")%><br> この日から<%=rsSaisyu.getDateDistance("eigyoubi")%>日過ぎています<br> 時間帯:<%=rsSaisyu.getString("jikantai")%><br>アクション:<%=rsSaisyu.getString("taiou")%><br> 担当:<%=rsSaisyu.getString("simei")%> </td></tr> <%}else{%> <tr><td colspan='4' bgcolor='#c4ffc4'>まだ営業情報がありません</td></tr> <%}%> <%}%> <%}%> </table> </body> </html> *** eigyousakisyousai.jsp *** <%@ page language="java" pageEncoding="EUC-JP" import="kamiBeans.*,java.text.*,java.util.*"%> <!DOCTYPE HTML PUBLIC "-//w3c//dtd html 4.0 transitional//en"> <html> <head> <% String sql=null; MyRs rs2=null; MyRs rsJikan=null; MyRs rstaiou=null; String gid=null; MyRs rs=null; if(request.getParameter("gid") != null){ gid=request.getParameter("gid"); } if(gid==null){ gid=(String)session.getAttribute("gid"); } DbAccess db=new DbAccess(); String s="select * from gyousyainfo where gyousyaid="+gid; rs=new MyRs(db.selDb(s)); if(rs != null){ rs.next(); } String syamei= rs.getString("syamei"); session.setAttribute("syamei",syamei);%> <title><%=syamei%></title> </head> <body bgcolor="#FFFFFF"> <table align='center' border='1'> <tr><td colspan='6' bgcolor='#e0ffff'> <table border='0' align='center'> <!--内側のテーブル--> <tr><td><h2>社名:</h2></td><td><h2><%=rs.getString("syamei")%></h2></td></tr> <tr><td><h2>住所:</h2></td><td><h2><%=rs.getString("juusyo")%></h2></td></tr> <tr><td><h2>代表者:</h2></td><td><h2><%=rs.getString("daihyousyasimei")%></h2></td></tr> <tr><td><h2>電話:</h2></td><td><h2><%=rs.getString("tel")%></h2></td></tr> </table> </td></tr> <tr align='center' bgcolor='#ccff99'> <td>時間帯</td> <td>対応</td> <td>担当</td> <td>メモ</td> <td>営業した日</td> <td>削除</td> </tr> <%sql="select eig.joukyouid, eig.memo, ti.taiou, ti.taiouid, ji.jikantai,"+ " eig.eigyoubi, sy.simei, sy.syainid, eig.gyousyaid"+ " from eigyoujoukyou eig"+ " left join eigyousakitaiou ti on eig.taiouid=ti.taiouid"+ " left join eigyoujikantai ji on eig.jikantaiid=ji.jikantaiid"+ " left join syainmasta sy on eig.syainid=sy.syainid"+ " where gyousyaid="+gid+" order by joukyouid"; rs2=new MyRs(db.selDb(sql)); SessionInfo se=(SessionInfo)session.getAttribute("sessionInfo"); int a=0; while(rs2.next()){ a++;%> <tr> <td><%=rs2.getString("jikantai")%></td> <td><%=rs2.getString("taiou")%></td> <td><%=rs2.getString("simei")%></td> <td><%=rs2.getString("memo")%></td> <td><%=rs2.getMyDate("eigyoubi")%></td> <%if(se.getUserId().equals(rs2.getString("syainid"))){%> <td align='center'> <!--削除ボタン--> <form action='/web/servlet/Eigyoujoukyousakujo' method='post'> <input type='hidden' name='gid' value='<%=rs2.getString("gyousyaid")%>'></input> <input type='hidden' name='jid' value='<%=rs2.getString("joukyouid")%>'></input> <input type='submit' value='削除'></input> </form> </td> <%}else{%> <td></td> <%}%> </tr> <%}%><!--rs2で使うwhileループの閉括弧--> <%if(a==0){%> <tr><td colspan='6'> <%=syamei%>に対する営業情報はありません </td></tr> <%}%> <!--ここから下は追加用画面--> <tr><td colspan='6'><hr></td></tr><!--分ける線--> <tr><td colspan='6' align='center'> <h3>情報追加 ![]() </td></tr> <tr align='center' bgcolor='#ccff99'> <td>時間帯</td> <td>対応</td> <td>担当</td> <td>メモ</td> <td colspan='2'>営業した日</td> </tr> <form action='/web/servlet/Eigyoujouhoutuika' method='post'> <tr> <!--時間帯--> <td> <select name='jikantai'> <%sql="select * from eigyoujikantai"; rsJikan=new MyRs(db.selDb(sql)); while(rsJikan.next()){%> <option value='<%=rsJikan.getInt("jikantaiid")%>'><%=rsJikan.getString("jikantai")%> <%}%> </select> </td> <!--対応--> <td> <select name='taiou'> <%sql="select * from eigyousakitaiou"; rstaiou=new MyRs(db.selDb(sql)); while(rstaiou.next()){%> <option value='<%=rstaiou.getInt("taiouid")%>'><%=rstaiou.getString("taiou")%> <%}%> </select> </td> <!--担当--> <td><%=se.getUserName()%></td> <!--メモ--> <td><textarea name='memo' cols='20' rows='3'></textarea></td> <!--営業した日--> <td colspan='2'> <select name='e_year'> <!--年--> <%SimpleDateFormat todayy=new SimpleDateFormat("yyyy"); String thisy=todayy.format(Calendar.getInstance().getTime()); int int_y=Integer.parseInt(thisy); int i=0; for(i=int_y-1;i<int_y+2;i++){%> <%if(thisy.equals(Integer.toString(i))){%><!--今年を選択しておく--> <option value='<%=i%>' selected><%=i%></option> <%}else{%> <option value='<%=i%>'><%=i%></option> <%}%> <%}%> </select> <select name='e_month'> <!--月--> <%SimpleDateFormat todayM=new SimpleDateFormat("M"); String thisM=todayM.format(Calendar.getInstance().getTime()); i=0; for(i=1;i<13;i++){%> <%if(thisM.equals(Integer.toString(i))){%><!--今月を選択しておく--> <option value='<%=i%>' selected><%=i%></option> <%}else{%> <option value='<%=i%>'><%=i%></option> <%}%> <%}%> </select> <select name='e_day'> <!--日--> <%SimpleDateFormat todayd=new SimpleDateFormat("d"); String thisd=todayd.format(Calendar.getInstance().getTime()); i=0; for(i=1;i<32;i++){%> <%if(thisd.equals(Integer.toString(i))){%><!--今日を選択しておく--> <option value='<%=i%>' selected><%=i%></option> <%}else{%> <option value='<%=i%>'><%=i%></option> <%}%> <%}%> </select> <input type='hidden' value='<%=gid%>'> </td> </tr> <!--業者IDをセッションにバインド--> <%session.setAttribute("gid",gid);%> <tr> <td colspan='6' align='right'><input type='submit' value='情報をデータベースに追加'></input></td> </tr> <tr> <td colspan='6' align='right'> <a href='/web/jsp/eigyou/eigyousaki.jsp'>営業先一覧へ戻る</a><br> <a href='/web/index.html'>ログインページ</a> </td> </tr> </form> </table> </body> </html> よろしくお願いします。 |
|
投稿日時: 2004-10-18 13:08
要するに、コネクションのクローズをしていないようですね。
コネクションプールを自前で実装しているのはなぜかわかりませんが、自前で実装する必要が あるのかどうか、まずよく考えてみてください。正直いってコネクションプールのような仕組みを 自前でやるには力量不足だと思います。いくつも「コネクションがクローズされていないのでは?」 と回答がついているのに、それすら確認していないんですよね? |
|
投稿日時: 2004-10-18 14:27
ukさん、ご返答ありがとうございます。初心者が無理矢理に作ろうとしているのは既にお気付きかとおもいます。webで調べて、複数のアクセスがある場合はコネクションプールのしくみを作ったほうが実効速度が飛躍的にあがるとありましたのでついつい手をだしてしまいました。コネクションのしくみはほとんど知らないまま使っています。だからコネクションをクローズする方法も思い浮かびません。まずかったですね。元もと使っていたのはコネクションプールではなく、
*** DbConnect.java *** package kamiBeans; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class DbConnect { private Connection con; private Statement st; public DbConnect() throws SQLException{ String driver="com.mysql.jdbc.Driver"; String url="jdbc:mysql://localhost/****?useUnicode=true&characterEncoding=ujis";//EUC=JPから変更 String user="root"; String pass="******"; con=DriverManager.getConnection(url,user,pass); st=con.createStatement(); } public synchronized ResultSet selDb(String sql) throws SQLException{ return st.executeQuery(sql); } public synchronized int exeDb(String sql) throws SQLException{ return st.executeUpdate(sql); } public void close() throws SQLException{ st.close(); con.close(); } } をつかっていました。そして、持っている入門書に書いてあったように、jspの最後の方にクローズ処理を書いていました。結局のところ、それに戻した方がいまのところ無難ということでしょうか。コネクションプールはもうちょっとわかってきてから使ってみたいと思います。 今後のためにもログを取るしくみを作りたいのですが、上記のクラスを使うとして、YOU@ITさんのおっしゃるような方法を取ることは可能でしょうか? |