static field

どこかで、Javaではstaticフィールドを持つクラスでもガーベッジコレクタに回収される可能性があるという話を聞いたことがあるのだが、リファレンスがみつからない。

一般的には自作クラスローダを使ってロードされたクラスにおいては、自作クラスローダがガーベッジコレクションに含まれて回収されると、staticフィールドを持ってるクラスでも自分をロードしたクラスローダと一緒に回収されてしまうらしい。これはある程度納得できる。

ある本には自己参照的な場合はstaticフィールドを持つクラスでも回収されるという説明があって、これはどうも納得がしにくい。そういう話だとstaticフィールドを持つクラスは実質的に使い物にならないという気がする。

真偽のほどを確認することができなかったので、この部分についての調査は断念して安全策でいくことにした。とりあえず、システムローダしか使わないアプリケーションでは問題がなさそうだ。

カテゴリー: Java

Java library path

JNIなどを利用しているときに、ライブラリパスがどうなっているかチェックしたいときがあります。そんなときは、システムプロパティを表示させてみましょう。WindowsではPATHに追加しておけばいいようです。Linuxなどでは、LD_LIBRARY_PATH環境変数へ追加しておけばよいようです。コマンドラインで指定するには -Djava.library.path=/usr/local/lib のようにオプションを指定すればよいようです。

public class LibraryTest {
    public static void main(String[] args) {
        System.out.println(System.getProperty("java.library.path"));
    }
}
カテゴリー: Java

How to use PostgreSQL nextval with JDBC

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;
  }
}

カテゴリー: Java

Servlet and Velocity

普通に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/ におきます。

$name
Hello.vm

これでサーブレットへアクセスすると、BODY部には次のような出力がされます。

Velocity:Hello
Hello.vm
カテゴリー: Java