トップページphp
984コメント425KB

■■ Servlet/JSP(EJB含む) 質問スレ ■■

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん02/06/08 11:03ID:Kkr1yl67
って無いよな?
というわけでつくたよ。
012911202/08/05 17:48ID:skGy3+Xd
>>128
安定稼動ですか。。。

確かに、Googleで検索してもTomcat3.3.1とTomcat4.0.3のヒット数が
全然違うのだし、そろそろTomcat4.0.3に移行しますか。

今回は閉じたネットワークだからこのまま納品して
Tomcat4.0.3への導入を検討します。

今までありがとうございました。
0130nobodyさん02/08/05 20:31ID:???
>>123
コンパイルに必要なのは zip ファイルの中の WEB-INF/lib に置いてある leaflet-http.jar って奴。
まずこれをクラスパスに入れる (か WEB-INF/lib を -extdirs に指定する)。コードの書き方は
WEB-INF/classes にある FileUploadServlet.java か WEB-INF/doc のパッケージドキュメントを参考に
してくれ。
0131nobodyさん02/08/06 05:28ID:???
結局俺は Linux + Tomcat 4 + mod_webapp.so の組み合わせで起動できなくて、
Tomcat 3.3 + mod_jk.so の組み合わせに戻してしまった。mod_webapp の問題って
言うより必要な glibc のバージョンを満たせなかったんだけど (アプライアンス
鯖なもんで)。
0132nobodyさん02/08/07 15:22ID:???
サーブレットを使えるようにしたいのですが、
ゼロからインストールの仕方が載っているHPってないでしょうか?
いろいろ検索してんですが、どうもよくわかりません。
JDKとApacheとTomcatはインストールしたんですが、
ぜんぜんわかりません。
よかったらお願いします。
0133nobodyさん02/08/07 18:06ID:???
>>132
http://www.ingrid.org/jajakarta/tomcat/
0134nobodyさん02/08/08 10:30ID:YE9LQNzW
Tomcat 4.0.1 って Win2k/XP のサービス起動出来なくなってね?
家の VAIO, 仕事場の ThinkPad, NetVista の 3 台とも全滅。

> C:\localhost\home>net start "Apache Tomcat"
> Apache Tomcat サービスを開始します.
> Apache Tomcat サービスを開始できませんでした。
>
> サービスはエラーを報告しませんでした。
>
> NET HELPMSG 3534 と入力すると、より詳しい説明が得られます。

イベントビューアーを見ると
> The LoadLibrary function failed for the following reason: 指定された
> モジュールが見つかりません。

どこかに PATH でも通す必要があるのか?
0135nobodyさん02/08/08 17:45ID:???
JNDIを使って、JAVAとLDAPを繋げようとしているのだが、うまくいかない。
java.lang.ClassCastException:com.sum.jndi.ldap.LdapCtx
というエラーが出る。
意味わかる人がいたら何が悪いか教えてください。
もしスレ違いでしたら、適当なスレを教えていただけると幸いです。
0136nobodyさん02/08/08 22:08ID:???
ホームページみてやるより、初めて挑戦するならごくごく初心者用の
本が最近はたくさん出てるから1冊参考に買ってみるといいですよ。
その方が必要最低限の事はザーっと見れると思うし。
0137nobodyさん02/08/09 01:07ID:???
>>135
スタックトレース出てる?
013813502/08/09 02:43ID:???
>>137
長いものは出ていません。
java.lang.ClassCastException:com.sum.jndi.ldap.LdapCtx
at ×××.main(×××.java:50)
と出ています。(×××はプログラム名です。)
0139nobodyさん02/08/09 02:50ID:???
>>138
じゃ、その ×××.java の 50 行目で Context のキャストに失敗してるだけ。
0140135と13802/08/09 13:43ID:???
>>139
ありがとうございます。
javaのプログラムは問題ないと思うので、
キャストが失敗しているということはldapの問題かな、やっぱり。
0141nobodyさん02/08/09 14:34ID:???
>>140
ちげーよ、オイ! とりあえず 50 行目のコード出してみろ。
大方↓こんなことでもやってるんじゃないのか?
InitialContext ctx = (InitialContext)hashtable.get("hoge");
014214002/08/09 16:56ID:???
>>141さん
ありがとうございます。
いろいろと試してみたのですが同じエラーが出たり、別のエラーが出たりといった状態で
相変わらず繋がりません。基本的なことがわかっていないのかも・・・。

JAVAのプログラムは
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL,"ldap://localhost:389/");
InitialContext ctx = new InitialContext(env);
topicConnectionFactory=(TopicConnectionFactory)ctx.lookup("dc=sample,dc=jp");←これが50行目
です。

ちなみにLDAPファイルの中身が下記のような形です。
dn:dc=sample,dc=jp
objectclass: dcObject
objectclass:organization
o:Factory00
dc:sample

lookupの部分はldapのどの部分を指定すれば良いのでしょうか?
わかりましたらよろしくお願いします。
0143nobodyさん02/08/09 17:17ID:uYc6rPBJ
サーブレットで呼び元を知るにはどうしたらいのでしょうか?
0144nobodyさん02/08/09 17:31ID:???
>>142
じつは LDAP は使ったことが無いので詳しくは分からないのだが、ctx.lookup()
が返しているものは Topic〜じゃなくて com.sum.jndi.ldap.LdapCtx のイン
スタンスだ。だから多分↓こう書かなきゃいけない。そこから Topic〜 の取得
方法は知らない。

Context ldapCtx = (Context)ctx.lookup("dc=sample,dc=jp");

>>143
String yobimotoURL = request.getHeader("Referer");
// ↑不明なときは null になるので注意
014514302/08/09 19:29ID:uYc6rPBJ
>>144
thanks
014614202/08/09 21:09ID:???
>>144さん
ありがとうございます。ややこしくて頭混乱気味です。一度整理しないと。
それとTopicConnectionFactoryの所得方法を知っている方がいましたら
教えてください。お願いします。

しかしよぅ、多少プログラミング言語ができるとどんなプログラムでも
作れると周りから思われるのは何とかならんかい

0147nobodyさん02/08/12 00:53ID:???
Tomcat4.0.4のWin用って、servlet.jar無いんですか?
厨房質問で申し訳ないのですが・・・
0148nobodyさん02/08/12 02:34ID:???
>>147
common/lib にないの?
0149nobodyさん02/08/15 02:30ID:???
大それた質問なのですが、お願いします。

jsp:forward って「他のサーバ」のリソースにフォワード出来たりしますか?
0150nobodyさん02/08/15 07:11ID:nluYDw9h
>>149
むり。リダイレクトしろ。
015114702/08/15 23:15ID:???
148>>
遅くなってしまった。148さんレスありがとうございます。
自宅でTomcat4.0.4をDLしてみたらありました。
今更ですが無いわけ無いですよね。すみません!
0152まつ02/08/20 02:17ID:yjCVey5W
テキストフォームに文字を入力して表示されている文字にマッチすると
赤く置換されるサンプルのJSPを作ってみた。

\を入れてもエラーを回避してヒットする方法を誰かしってる?
(\\を入れるとヒットします。)

JSPってなんで String tuka = "\"; って\を""で囲ってエラーになるんだろ?


<!-------- moji.jsp -------------------------->
<%@ page contentType="text/html; charset=SJIS"%>
<%
String inputMoji = request.getParameter("inputMoji");
String moji = "ABCDEFG\\HIJKLMN\\OPQRSTU\\VWXYZ";

//文字置換
moji = moji.replaceFirst("("+ inputMoji +")","<font color='red'><B>$1<\\/B><\\/font>");
%>
<HTML>
<FORM METHOD=POST ACTION="./moji.jsp">
<%=moji%><BR>
<input type="text" name="inputMoji">
<input type="submit">
</FORM>
</HTML>
0153v02/08/20 06:25ID:FJl0QgGS
http://muvc.net/jsweb/
0154初めてのサーバーサイドjava02/08/20 15:15ID:???
Apache1.3.26 Tomcat4.0.4 mod_jk.dll j2sdk1.4.0_01 WinXP
で組んでみました。するとHTMLファイルは問題なく表示されるのですが
JSPだとstatus500 Internal Server Error がでます。それから参照先の
フォルダの中身がリストになって表示されてしまいます。
こういう時は何処からチェックしていけばいいのでしょうか?
見よう見まねでチャレンジしてます。どなたかご助言をお願いします。
0155nobodyさん02/08/20 20:39ID:RuSa0Yqx
Apache1.3.22 Tomcat4.04 で連携させるため
mod_webapp.soをビルドしようとしていますが失敗します。
./support/buildconf.shの実行まではうまくいく
のですが次のconfigureで失敗します。
./configure --enable-docs --with-PACKAGE=yes --with-apxs=/usr/sbin/apxs --with-apr=./apr
途中で

checking for apr CC variable... error
configure: error: cannot find APRVARS file in /home/test/webapp/apr

のようになってしまいます。なにかご助言があればお願いいたします。
0156nobodyさん02/08/21 19:48ID:wTMM6SK6
PHPで言うところの、連想配列って作ること可能ですか?
0157あぼーんNGNG
あぼーん
0158nobodyさん02/08/22 03:00ID:???
>>156
可能ですよ。
0159tomcat02/08/22 23:23ID:???
>>155
cp ./apr/apr-config ./apr/APRVARS
0160nobodyさん02/08/24 00:32ID:/szaZI0N
>>154
Apacheのmod_jkの設定内容と、Tomcatのworkers.properties、server.xmlの内容。
そこらへん掲示してもらえればもうちょっと具体的にいえるかも?
0161nobodyさん02/08/24 03:20ID:utJTQwUG
JSPからの入力値をServletで受け取って、別のJSPを返す処理をやっています。

このとき、ブラウザのURL欄にServletのURLが出てしまうのですが、これを
JSPのURLにすることは可能でしょうか。。。

サーバ:Tomcat3.3.2(単体)、Solaris8
クライアント:IE、Operaともにだめでした、Windows2000
---
最初のJSPの一部
<form method="GET" action="ServletのURL">
<input type="submit" name="Submit" value="Submit">
</form>
---
Servletの一部
public void doGet( .....) throws ....{
//途中の処理
RequestDispatcher rd = context.getRequestDispatcher("次のJSP"); //この"次のJSP"のURLを出したい
rd.forward(request,response);
}
----
0162nobodyさん02/08/24 03:29ID:V0UGUmX8
JSPの勉強をし始めたところなんですが、
JSP上で「Vector ary = new Vector();」を実行すると、
Class org.apache.jsp.Vector not found.

と言われてしまいます。
何かインポートしなければいけないんでしょうか。
0163nobodyさん02/08/24 11:29ID:/szaZI0N
>162
<%@ page import="java.util.*" %>
を追加。
0164nobodyさん02/08/24 14:43ID:H7leyWd6
>>161
sendRedirectにしたらどう?
ところで、なぜそこまでしてブラウザにJSPファイル名出したいのですか?
0165初めてのサーバーサイドjava02/08/24 22:16ID:???
>>160 レスありがとうございます。

私が行ったのは
Apache\modulesにmod_jk.dllを入れる。
Apache\confの中のhttpd.confの末尾にInclude "C:\tomcat\conf\mod_jk.conf-auto"を追加。

tomcat\confのなかにmod_jk.conf-autoを入れる。
(以前tom3.2.x系で試したのをバックアップしていてそれからコピー。)
最初のJkWorkersFile・・・に"C:/tomcat/conf/jk/workers.properties"に書き換え。
mod_jk.conf-auto内のajp12をajp13に置換。

workers.propertiesもtom3系のを流用。
途中のworker.tomcat_homeとworker.java_homeにそれぞれのパスを記入。
ajp12をajp13に置換。

server.xmlは
<Server port="8005" shutdown="SHUTDOWN" debug="0">の下に
<Listener className="org.apache.ajp.tomcat4.config.ApacheConfig" modJk="C:\Apache\modules\mod_jk.dll" />
 を追記。
<Host name="localhost" debug="0" appBase="webapps" ・・・> の下に
  <Listener className="org.apache.ajp.tomcat4.config.ApacheConfig" append="true" />
 を追記しています。

ちなみにJSPは動きました。ですがリスト表示されるのは相変わらずです。
Apacheのhttpd.confのDocumentrootにtomcat\webapps内の使っているフォルダ名までパスを記述して
ブラウザ上でlocalhostでアクセスすると404エラーになり、パスを全部記述しないと
表示できない状況です。

何だかレベルの低い質問で恐縮の限りですがアドバイスをいただければ嬉しいです。
0166nobodyさん02/08/24 23:34ID:/szaZI0N
>165
>ちなみにJSPは動きました。ですがリスト表示されるのは相変わらずです。
??。JSPが動かなかったんじゃないの?>154
リスト表示?されるのは>>96ではないかと。
JSP・Servletの何れかが正常動作しないのは現在の情報ではmod_jk.conf-autoに問題があるような。。。
016716102/08/25 01:07ID:???
>>164
レスありがとうございます。
sendRedirect()ではできました。。。

>ところで、なぜそこまでしてブラウザにJSPファイル名出したいのですか?
たいした理由じゃないんですが、クライアントにとっては表示しているのは
2枚目のJSPの内容なので、URL欄もそうじゃなきゃおかしいと思ったからです。。。

JSP/Servletの開発がはじめてなので、Servletの名前がでるのが普通かどうか
判断できなかったですう。。。
0168初めてのサーバーサイドjava02/08/28 00:27ID:???
>>166
レスありがとうございます。
mod_jk.conf-autoですね、もう少し勉強して色々やってみます。
0169nobodyさん02/08/28 06:31ID:r028kWh6
神聖銀行がソフトバンクの会社更生申立を損に通告!!
又、預保に瑕疵担保条項に基づく買い戻し請求!!
神聖銀行がソフトバンクの会社更生申立を損に通告!!
又、預保に瑕疵担保条項に基づく買い戻し請求!!
神聖銀行がソフトバンクの会社更生申立を損に通告!!
又、預保に瑕疵担保条項に基づく買い戻し請求!!
神聖銀行がソフトバンクの会社更生申立を損に通告!!
又、預保に瑕疵担保条項に基づく買い戻し請求!!
0170nobodyさん02/08/28 13:29ID:tGW5fHH2
Servletかじりたてなんですが、サーバ側でイベントが発生したらリアルタイムで
情報をPushさせたい場合は、素直にAppletを勉強すべきなんでしょうか?

制御システムとWebをくっつけるものを作ってて、ふと
ユーザが手を出さないとイベントもへったくれもない気がして・・・無知ゴメソ・・・。
0171nobodyさん02/08/31 22:57ID:mJeuMnFZ
JSPはソースコンパイルしなくてイイし便利なんだけどServletっていちいちコンパイルした後にtomcat再起動しなくちゃダメじゃん
あれってどうにかならないの?
サーバが別マシンなんだけど激しくめんどくさいんだよね。特にtomcatは再起動に時間がかかる・・

classファイル変更したときにtomcat再起動せずにすむ方法ってないかな?
環境はapache+tomcatっす
0172nobodyさん02/09/01 00:01ID:???
>>171
resinにすれ
017373へ02/09/01 22:52ID:NNPDCqX6
jdkを1.4にしたらどうですかな?

私も同じ症状だったけど、いけましたぞ
0174nobodyさん02/09/02 02:15ID:2oT4bP/+
>>171
Tomcatだったらmanagerアプリが入ってるだろ?
/manager/reload?path=/YOUR_CONTEXT_PATH
を呼べばリロードできる。
tomcat-users.xmlにmanager権限を持つユーザを追加する必要があるが。
0175初期不良02/09/02 03:08ID:???
>>174
勉強になりまふ
0176nobodyさん02/09/02 21:31ID:???
上の方で話題になってたmultipart/form-dataのパースクラス、
漏れも欲しいんだけどもう1度うpしてもらえませんか?
オライリーのはいきなり保存されちゃってなんか好かん。
0177nobodyさん02/09/02 23:21ID:???
>>177
JakartaのCommonsプロジェクトに、マルチパート解析用のユーティリティ出てたよ
今後はこれがいいかも。
0178nobodyさん02/09/03 11:06ID:???
>>177
これかな?
ttp://jakarta.apache.org/commons/sandbox/fileupload/
0179nobodyさん02/09/03 12:11ID:???
>>176
はいよ。

http://tool-ya.ddo.jp/2ch/trash-box/contents.jsp?file=20020903121055000.zip
0180nobodyさん02/09/03 12:25ID:???
俺のは一時ファイルに保存しないでパート単位で (名前付き) ストリームを取り
出す感じだから、余分なオーバーヘッドが発生しない代わりにプログラマ的に
面倒かも。

↓いままでこう書いてた奴が
String value1 = request.getParameter("value1");
String value2 = request.getParameter("value2");

↓こういう感じになる。
String value1 = null;
while(true){
  FormData part = multipart.getNextFormData();
  if(part == null)  break;
  if(part.getName().equals("value1")){
    value1 = part.getValue("Shift_JIS");
  } else if(part.getName().equals("file1")){
    InputStream in = part.getInputStream();
    …
  }
}
0181ふぉ02/09/06 09:36ID:sFTL/UD4
↑一連のFileUpLoad参考にしちゃってます。
フォルダごとアップロードってできんのかな?
018218002/09/06 12:01ID:???
>>181
フォルダごとは無理かな。いくつかのファイルをまとめてってんだったら
クライアント側で ZIP か LZH に固めてもらってる。イントラ開発なら
アプレットのセキュリティレベル下げて、フォルダごと ZIP に固めて POST
するようなアプレット作る。
0183nobodyさん02/09/07 00:27ID:41V0KowW
>>177

> 今後はこれがいいかも。

オライリのとくらべて格段にメンドクセー気がすんだけど、どんなメリットがあんの?
0184nobodyさん02/09/07 02:56ID:???
>>177
オライリーのと >>180 の悪いとこ取りみたいな感じが…
オライリーのはプログラマ的に楽だし、>>180 のは完全にストリームベースで
できるので効率最優先の時に良いんだけど。
0185nobodyさん02/09/08 08:25ID:+tHMOokM

JSPと言えど、ある程度のものを書くにはそれなりのJavaの知識が必要なんだ
ね。最初、JSPにデータベースの処理書いたら、先輩にBeansで3層にしろ、っ
て言われちゃったよ。Java初心者にとってBeansはちょっと壁が高いです..


0186nobodyさん02/09/08 09:08ID:+tHMOokM
JSP書くときソフトは何使っていますか?
メモ帳は使いにくいです。

0187nobodyさん02/09/08 17:25ID:???
>>186
秀丸。マクロと強調表示をうまく作ると使いやすい。
macromedia の Ultra Developer で JSP は使いにくかったが、サイト管理系のところ
だけなら結構良い。
0188nobodyさん02/09/10 22:26ID:SB/7i5JH
JSPにはHTML::Templateみたいなクロスサイトスクリプティング脆弱性を
事前に防止するために役に立ちそうな機構はありますか?
018917702/09/10 23:47ID:???
Jakarataで作ったものなら皆結構使うからいいかなぁ、と思って脊髄反射で書き込んだだけですた
漏れだめぽ・・・
>>178
JavaDoc見てると、ストリームベースで扱えるっぽいよ。
FileItem#getInputStreamでストリームが取れそうな感じ。
019018002/09/11 01:50ID:???
>>189
ふっふっふ
俺のはメモリや一時ファイルにデータを保管してからあらためて取り出す
ようなことはやらんのだよ。でかい CSV ファイルを先頭から DB にぶち
込んだり、馬鹿でかい XML ファイルを SAX に食わせたりするときに
有利かな。
アップしてたソースがまた落ちたので、アップロードのページにリンク
貼っときますた。
0191nobodyさん02/09/11 18:40ID:KsAJ6jkE
javax.servlet.http.HttpSession を invalidate で無効化できるとどこかで見たんだけど、本当に消えるの?
0192nobodyさん02/09/11 19:27ID:???
>>191
「消える」の定義がよく分からんが、次回のリクエスト時に request.getSession(false) を
やると null が返ってくる。getSession(true) なら何も入っていないセッションが取れる。
また、invalidate() を呼び出したときに HttpSessionBindingListener#unbound() も
呼び出される。これを「消えた」というなら消える。

実を言うと鯖をクラスタ化して DB でセッション管理している時のそこらへんの動きは
禿しく微妙なんだけどね。
0193nobodyさん02/09/12 20:15ID:EiytWMDM
クッキーを使ったセッションって、通常のHTMLファイルのリンクでも
維持されるものなのでしょうか?

クッキーをブラウザが送ってるのは当たり前として、サーバー側で
そのクッキーを元に、時間カウントをリフレッシュしてるんでしょうか?

こちら、Tomcat4.04 + JDK1.4です。
0194nobodyさん02/09/12 20:40ID:EiytWMDM
すいません、アップローダ、さらにもう一度アップしていただけませんでしょうか?
数日も経たない間にお願いして申し訳ございませんが。お願いします。

オライリーのは開発チームみんなで本買ってねってのに加え、
基本的に商用利用不可って書いてるし。
0195nobodyさん02/09/12 20:41ID:???
>>193
> そのクッキーを元に、時間カウントをリフレッシュしてるんでしょうか?

普通は HTML などのような静的なファイルへのアクセスでセッションの LastAccess
は変わりません。ただし大抵の環境は FileServlet を自作版と置き換えられる
ので、アクセスごとにセッションに触るサーブレットを自作して置き換えれば良い。
フルコーディングしなくてもオーバーライドすれば楽。

import java.io.*;
import javax.servlet.http.*;
import org.apache.catalina.servlets.*;

public clas OresamaServlet extends DefaultServlet{
  protected void doGet(HttpServletRequest req, HttpServletResponse res)
    throws ServletException, IOException
  {
    request.getSession(true);
    super.doGet(req, res);
    return;
  }

}

$TOMCAT_HOME/conf/web.xml にある org.apache.catalina.servlets.DefaultServlet
というのをこのサーブレットクラスの名前に置き換えれ。

ただし HTML ファイルなどが Apache へマッピングされてたらどうしようもない。
019618002/09/12 20:43ID:???
>>194
アップロードのページの下のほうにリンク貼っといた。

http://tool-ya.ddo.jp/2ch/trash-box/
0197nobodyさん02/09/12 23:39ID:???
Beansを作る場合ってpackage化しないといけないのですか?
019819402/09/13 01:19ID:rrE5hfdS
>196
ありがとうございます。

ukのHPとかオライリーって、ソース公開しておいて商用不可かよっ!
って感じで、Javaの世界はなんだかなーと思ってたので、すごい
助かります。
0199193(=194)02/09/13 01:27ID:rrE5hfdS
>195
なるほど。そういう仕組みになってるんですねぇ。
全然Servletコンテナの仕組みしらないので参考にします。
0200nobodyさん02/09/13 02:51ID:N8mYZ7Nv
>>197
Beanに限らず、JavaプログラムはPackage化するのが普通。
無名Packageはあくまでも特殊なケース。

0201nobodyさん02/09/14 21:10ID:???
linux+tomcat+apacheでアプリ作ってると、下のような現象に陥ることがある。
・ソースを書き変えてコンパイルしてクラスを更新しても、クライアント側に反映されない。
理由がさっぱりなので誰か教えてください。
0202nobodyさん02/09/14 21:15ID:???
javamailで設定するsmtpホストのアドレスって自マシンのIPでいいの?
vine2.5+apache1.3.24+tomcat4.0でやってるんだけど、自マシンのIP設定するとメールおくれるんだよね。これってなんで?
0203nobodyさん02/09/15 13:41ID:hcAsMafz
>>202
defaultでsendmailかPostfixがたちあがっているからじゃん?
rootになってntsysvコマンドでしらべてみな。

まぁ、psで調べてもいいけどさ。
0204nobodyさん02/09/15 23:27ID:4RjfenHM
>>201
reloadable?
020520102/09/16 18:54ID:???
>>204
reloadableっていうのは、更新できるかってことですか?
エラーもなく更新はできてるよ。
0206nobodyさん02/09/16 18:59ID:Fc5JTIXQ
servletでフォーム認証する方法知ってる人いる?
ちなみにユーザーは百人前後を予定してるんだけれども。

0207nobodyさん02/09/16 19:04ID:???
>>203

立ち上がってたー。有り難う。
020817702/09/16 19:57ID:???
>>206
Servlet2.2で、Form認証に関する仕様が定められてるので、それ見れ。
0209nobodyさん02/09/16 21:47ID:2vuqixrP
Apache 1.3.26 + Tomcat 3.3.1 + PostgreSQL 7.2.1 を使っています。
あるDBのコネクションプーリングをするクラス(ConnectionPool)を作成して、
下のような感じにしているのですが、

pubilc class TheDB {
 private static TheDB instance = null;
 private ConnectionPool pool = null;

 private TheDB {
  // serverの設定読み込み
  pool = new ConnectionPool(上で読み込んだ設定);
 }

 public static TheDB getInstance() {
  if (instance == null) instance = TheDB();
  return instance;
 }
 :
}

これを使っていると、(この部分とは別の)classを変更したときに
新しいTheDBインスタンスが作られて、DBへのコネクションがどんどん増える、
という状態になってしまいました。(古いインスタンスが残っているのだと思いますが…)
仕方ないので今はTomcatを再起動しています。
Javaは始めて日が浅いのでよく分からないのですが、参照されなくなった
インスタンスはGCに回収されないのでしょうか?
0210nobodyさん02/09/16 23:26ID:???
>>209
Singletonで設計したTheDBが複数インスタンス化されてしまうこと自体、
おかしくないですか?
ひょっとして、似たようなクラスをコピペで大量生産してますか?

ちなみに上記のような設計にした場合、TheDBのインスタンスはGCに回収されません。
(TheDBのstatic属性として参照されつづけてますからね)
021120902/09/17 00:19ID:elworjfu
>>210
作ったクラスはTheDBだけです。

既存サーブレットを書き換えて、Tomcatが下記のメッセージを
吐いてリロード(?)したときに新たにインスタンス化されています。

2002-09-17 XX:XX:XX - ContextManager: Removing context DEFAULT:/hogehoge
2002-09-17 XX:XX:XX - ContextManager: Adding context DEFAULT:/hogehoge

古いインスタンスの方は、DBのコネクションが張られたままになって
いるので残っているようです。
0212nobodyさん02/09/17 00:39ID:???
>>211
それは Tomcat のオートリロードが利いてるだけ。Java の static オブジェクトは
JavaVM に一つじゃなくて Class インスタンスに一つ。Tomcat のオートリロードは
Class インスタンスの入れ替えを行うので、同じ JVM 上に複数の static オブジェ
クトができるわけ。どっかのサーブレットの destroy() に TheDB インスタンスを
クリーンアップするようなコード書いとけ。
0213nobodyさん02/09/17 00:50ID:???
>>211
すまん、クラスのオートリロード時にサーブレットの destroy() が呼び出されるかは
不明 (WebSphere だと destroy() 呼ばないで Web アプリケーションが再起動しちまう)。
まぁーそうだなぁ。$JAVA_HOME/lib/ext にその TheDB ってクラスの入った jar を放り
込んでおくか、環境系の変なトラブル出したくなかったら毎回ちゃんと再起動するかかな。
インスタンス内でサーバソケット開いて、新しいインスタンス生成する前に localhost
接続して前のに終了命令を出すってのもあるけどめんどくさい。

サーバサイドでリソースやスレッドを Singleton で管理するクラスを作った人間が大抵
ハマる罠。
021421002/09/17 01:05ID:???
>>213
Tomcatのオートリロードって、設定ファイルか何かではずせないものなんですか?

AppServerでクラスのリロードされると、はまることが多いですよね。
HttpSessionにいれたインスタンスのキャストに失敗したりしません?
0215nobodyさん02/09/17 03:28ID:???
>>214
たしか $TOMCAT_HOME/conf/server.xml と apps-xxx.xml にオートリロードの
設定があったはず (3.3.1)。触ったことが無いのでよく知らんけど。

そう、オートリロードが走ると、既にセッションに入っているオブジェクトの
Class と新しいクラスローダー上での Class のインスタンスが違うからキャ
ストに失敗したりする。まぁ今さら起きても「あ〜再起動忘れた〜」で済んでる
けど、最初の頃は謎だった。よく考えたらなるほどね〜って感じ。

>>209
GC で消えないのは、どこかにリロード前のそのオブジェクト (か参照たどった
別のオブジェクト) を見てるスレッドが生き残ってるから。まぁコネクション
プールなら内部に「監視スレッド」持ってても不思議じゃないから、多分そいつが
生き残って古い TheDB を参照してるので GC の対象にならない。

と見たがどうか。
0216nobodyさん02/09/17 03:37ID:???
ごめん、参照しているスレッドが居なくてもコンテキストが握ってれば
GC は走らないな。それから getInstance() には synchronized 修飾子
付けとけ。
021721002/09/17 23:18ID:???
>>215
調べてみた。Contextのりローダブルフラグで設定できるらしい(tomcat3.2.3)
ttp://www.ingrid.org/jajakarta/tomcat/tomcat-3.2.3/doc-ja/uguide/tomcat_ug.html

209の作りはそもそもどう七日って気も少しするけど、気にしない方向で。
0218nobodyさん02/09/18 16:56ID:???
servletから別のクラスを利用するときって、-classpathを付けなくてもコンパイルできるよね。なぜなのか誰かおせーて
0219nobodyさん02/09/18 17:07ID:???
Error: No match was found for method "addElement(long)".
Error: No match was found for method "copyInto(long[])".
022021902/09/18 17:09ID:???
途中でカキコしちまった。スマソ

Vectorて何でも良いんじゃないの?
Stringじゃないとエラー出るんですけど何故?
0221nobodyさん02/09/18 18:08ID:???
>>220
byte, int, long なんかのプリミティブ型じゃだめですな。
v.addElement(new Long(value)) みたいにせんと。
022221902/09/18 18:29ID:???
>>221
すんません。アホでした。
オブジェクトって書いてあったんで
・Longにして格納(220氏のご指摘どおり)
・l=(Long[])v.toArray();で配列化
・long=(long)l[i];
そしたら、type "Long" cannot be cast into type "long".
えーん(T_T)l[i].longValue()だと、java.lang.ClassCastException
どうやったらlongの値が取れますか?!
022321902/09/18 18:41ID:???
と、思ったら l=(Long[])v.toArray();
が、java.lang.ClassCastException でした。
ふ〜む?
022421902/09/18 18:56ID:???
http://www.asahi-net.or.jp/~dp8t-asm/java/tips/MakeArrayDynamically.html
を見て、v.copyInto(l);にすると
> null
> java.lang.ArrayStoreException
ひぇーん(p_;)
0225もうちょっと基礎を勉強せい02/09/19 01:32ID:???
Vector v = new Vector();
v.add(new Long(0));
...

Long[] longArray = (Long[])(v.toArray(new Long[0]));
for(int i=0;i<longArray.length;i++){
long l = longArray[i].longValue();
System.out.println(l);
}
0226nobodyさん02/09/19 01:49ID:???
先に解答を書かれたのでこれだけ言っとく


             板  違  い  で  つ
0227nobodyさん02/09/19 10:10ID:3f2LBbrr
ブラウザで動くActiveXクライアントと
UnixのServletでHTTPを使ってやり取りできますか?
Servletで掲示板システムを作って
ActiveXクライアントから投稿したいんですけど。
0228nobodyさん02/09/19 10:52ID:???
>>227
SOAPまたはSOAPモドキを使いたいということなのかもしれ
んが、そうでなきゃ、HTTPを扱うActiveXコントロールだけの
問題と思われ。

それなら、板違い。
■ このスレッドは過去ログ倉庫に格納されています