著作一覧 |
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系から異種交配によって作られた。いわゆる薔薇は、これ。
なんとなく、花びらの先端が外を向いているし、巻きが甘く感じる。なんの略かは忘れた。フロリデンとかなんとか。
ジェズイットを見習え |