staticフィールドを持つクラスのアンロード問題については、次の記事あたりを読むと確認用プログラムを作成できるかもしれない。
- MONITORING CLASS LOADING AND GARBAGE COLLECTION
- Formatting Messages With Variable Content and Unloading and Reloading Classes
でも、ログをある程度解析する必要がありそう。
staticフィールドを持つクラスのアンロード問題については、次の記事あたりを読むと確認用プログラムを作成できるかもしれない。
でも、ログをある程度解析する必要がありそう。
どこかで、Javaではstaticフィールドを持つクラスでもガーベッジコレクタに回収される可能性があるという話を聞いたことがあるのだが、リファレンスがみつからない。
一般的には自作クラスローダを使ってロードされたクラスにおいては、自作クラスローダがガーベッジコレクションに含まれて回収されると、staticフィールドを持ってるクラスでも自分をロードしたクラスローダと一緒に回収されてしまうらしい。これはある程度納得できる。
ある本には自己参照的な場合はstaticフィールドを持つクラスでも回収されるという説明があって、これはどうも納得がしにくい。そういう話だとstaticフィールドを持つクラスは実質的に使い物にならないという気がする。
真偽のほどを確認することができなかったので、この部分についての調査は断念して安全策でいくことにした。とりあえず、システムローダしか使わないアプリケーションでは問題がなさそうだ。
Threads and Swing という記事も見つけました。
JNIなどを利用しているときに、ライブラリパスがどうなっているかチェックしたいときがあります。そんなときは、システムプロパティを表示させてみましょう。WindowsではPATHに追加しておけばいいようです。Linuxなどでは、LD_LIBRARY_PATH環境変数へ追加しておけばよいようです。コマンドラインで指定するには -Djava.library.path=/usr/local/lib のようにオプションを指定すればよいようです。
public
class
LibraryTest {public
static
void
main(String[] args) {"java.library.path"
));PostgreSQLにあるnextvalの値をJavaで取得する方法を調べた。ResultSetでは結果がとれないので、Arrayを使用した。
import
java.sql.Array;import
java.sql.ResultSet;import
java.sql.Statement;
public
class
Util {
public
static
int
getNextVal(Statement st) throws
Exception {
int
id = –1
;
ResultSet rs = st.executeQuery("select nextval('SequenceName')"
);
if
(rs.next()) {
Array os = rs.getArray(1
);
String sId = os.toString();
id = Integer.parseInt(sId);
}
return
id;
}
}
TomcatがいつのまにかApacheに昇格していました。http://tomcat.apache.org/
普通にVelocityをServletの中で使うときは、WEB-INF/classes/ にテンプレートファイルをおけばいいらしい。
WEB-INF/classes/jp/Hello.class を、次のファイルから作成した場合、
package
jp;
import
java.io.BufferedWriter;import
java.io.IOException;import
java.io.PrintWriter;import
java.io.StringWriter;
import
javax.servlet.ServletException;import
javax.servlet.http.HttpServlet;import
javax.servlet.http.HttpServletRequest;import
javax.servlet.http.HttpServletResponse;
import
org.apache.velocity.Template;import
org.apache.velocity.VelocityContext;import
org.apache.velocity.app.VelocityEngine;
public
class
Hello extends
HttpServlet {
public
void
doGet(HttpServletRequest request, HttpServletResponse response)
throws
IOException, ServletException {
response.setContentType("text/html"
);
PrintWriter out = response.getWriter();
out.println("<html><head><title>test</title></head>"
);
out.println("<body bgcolor="
white">"
);
StringWriter buf = new
StringWriter();
BufferedWriter writer = new
BufferedWriter(buf);
try
{
VelocityEngine ve = new
VelocityEngine();
ve.init();
VelocityContext ctx = new
VelocityContext();
Template template = ve.getTemplate("hello.vm"
, "UTF-8"
);
ctx.put("name"
, "Hello"
);
template.merge(ctx, writer);
writer.flush();
out.println("Velocity:"
+ buf.toString());
} catch
(Exception e) {
e.printStackTrace();
} finally
{
writer.close();
}
out.println("</body>"
);
out.println("</html>"
);
}
}
次のようなhello.vmを WEB-INF/classes/ におきます。
これでサーブレットへアクセスすると、BODY部には次のような出力がされます。