| 著作一覧 |
JDBCのAPIドキュメントはデストラクタの実装のこととか書いているが、Oracleはそんな面倒を見てくれない。
class JdbcHandler implements InvocationHandler {
private boolean closed;
Object obj;
Throwable stack;
private JdbcHandler(Object o) {
obj = o;
stack = new Throwable();
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
String name = method.getName();
if (name.equals("close")) {
closed = true;
} else if (name.equals("executeQuery")) {
return createProxy(method.invoke(obj, args));
} else if (name.equals("prepareStatement")) {
return createProxy(method.invoke(obj, args));
} else if (name.equals("createStatement")) {
return createProxy(method.invoke(obj, args));
}
try {
return method.invoke(obj, args);
} catch (Throwable t) {
throw t.getCause();
}
}
}
で、こんな風に使う。
private Object createProxy(Object o) {
JdbcHandler j = new JdbcHandler(o);
list.add(j);
Object pxy = null;
if (o instanceof ResultSet) {
pxy = Proxy.newProxyInstance(o.getClass().getClassLoader(),
new Class[] { java.sql.ResultSet.class,
oracle.jdbc.OracleResultSet.class, },
j);
} else if (o instanceof PreparedStatement) {
...
} else if (o instanceof Statement) {
...
} else if (o instanceof Connection) {
...
}
return pxy;
}
で、適当な時点でチェックする。
for (Iterator i = list.iterator(); i.hasNext();) {
JdbcHandler j = (JdbcHandler)i.next();
if (!j.closed) {
System.err.println("detect jdbc resource leaking !");
j.stack.printStackTrace();
}
}
Hybrid Tea。芳香があるTea系から異種交配によって作られた。いわゆる薔薇は、これ。
なんとなく、花びらの先端が外を向いているし、巻きが甘く感じる。なんの略かは忘れた。フロリデンとかなんとか。
ジェズイットを見習え |