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部には次のような出力がされます。