超キレやすいプログラマのブログ

超キレやすいプログラマのブログ

キレてキレてキレまくる

Amebaでブログを始めよう!
Seasar2でシステム作ってて、JdbcManagerからjava.sql.Connectionを取得しようとして何時間も試行錯誤したので、その結果をここに記録しておくことにする。
色々ネット調べたけど、クリティカルな情報が全然見当たらなかった。
当たり前すぎてネットに落ちていないのかこの情報は?!
それとも、俺の探し方が悪くて、もっと簡単な方法があるのだろうか?


もっと簡単な方法を知っているお兄さん!
コメント宜しく頼むぜ!!




さて、まずは結論から書くことにする。
成功ソースは以下。



import org.seasar.extension.dbcp.impl.ConnectionWrapperImpl;
import org.seasar.extension.jdbc.JdbcManager;
import org.seasar.extension.jdbc.manager.JdbcManagerImplementor;

/**
* JdbcManagerからjava.sql.Connection取得
*/
public class Test {

public java.sql.Connection getConnection(JdbcManager jdbcManager) throws SQLException {
JdbcManagerImplementor implementor = (JdbcManagerImplementor) jdbcManager;
ConnectionWrapperImpl crm = (ConnectionWrapperImpl) implementor.getDataSource().getConnection();
return crm.getPhysicalConnection();
}
}







こいつのやっかいだったところは、implementor.getDataSource().getConnection() の戻り値の型が、実際はConnectionWrapperImplであるにもかかわらず、eclipseの解釈?ではjava.sql.Connectionと扱ってしまうところだった。
試しに、メソッドの内容を以下にしてみると、キャストエラーやワーニングは出ない。



public java.sql.Connection getConnection(JdbcManager jdbcManager) throws SQLException {
JdbcManagerImplementor implementor = (JdbcManagerImplementor) jdbcManager;
java.sql.Connection conn = implementor.getDataSource().getConnection(); // ←ここでエラーもワーニングも出ないので、一見ちゃんとjava.sql.Connectionが取得できるように見えてしまう
return conn;
}







しかし、ステップ実行してconnに入っているオブジェクトを見てみると、

ConnectionWrapperImpl



と表示される。
当初ここののカラクリに気付くのに時間がかかり、結構な時間を浪費してしまった。

このConnectionWrapperImplというクラスは、java.sql.Connectionを返すgetPhysicalConnection()というメソッドを持っている。

ここまでわかれば、キャストしてやってそのメソッドを実行してやれば取得可能とわかった。









なんでこんなことしたかったかというと、PostgreSQLでラージオブジェクトを扱う為だったりする。
これもネットで色々調べて試してみたのだが、書いている通りに実装したつもりなのに動かなかったり、未知の言語で書かれていて俺の理解や読解力が低くて読めなかったりして苦労した。

このあたりの情報はまた次の記事ででも書くことにする。