- PR -

Tomcatのコネクションプーリングを別のプログラムから利用

投稿者投稿内容
どんたくお
ベテラン
会議室デビュー日: 2005/08/29
投稿数: 88
投稿日時: 2006-01-13 18:58
みなさん、こんばんは。
どんたくおです。

現在、Tomcat5を使ってWEBアプリケーションを運用しております。
Tomcat5からのデータベース接続はTomcatのコネクションプーリン
グを使用しております。
server.xml
<Resource auth="Container"
name="jdbc/hoge"
type="javax.sql.DataSource"/>

のようにしています。
実は、JAVAのスタンドアローンなプログラムからもデータベースへ
の接続を行う必要がでてきました。
そこで、ご質問なのですが、やはりTomcatで使用しているコネクシ
ョンプーリングを、別のJAVAのプログラムから使用することは可能
でしょうか。
おそらく、無理だと思うのですが、もし、そのような方法をしって
おられる方がおいでましたら、ご教授いただけると幸いです。
つばさ
ベテラン
会議室デビュー日: 2005/02/05
投稿数: 54
投稿日時: 2006-01-13 21:16
Tomcatで使用しているものをスタンドアロンのPGから直接利用する
方法はわかりません。

が、そのスタンドアロンのプログラムでcommons dbcpで自前でコネクション
プールを実装すればよいと思います。

簡単な例だと初期化処理で
Properties prop = new Properties();
prop.put("driverClassName", "org.postgresql.Driver");
prop.put("url","jdbc:postgresql://localhost/ss");
prop.put("username", "postgres");
prop.put("password", "postgres");

DataSource ds = BasicDataSourceFactory.createDataSource(prop);
Connection con = ds.getConnection();

DataSourceをどこかに保存すればよいと思います。
後始末としては、
((BasicDataSource)ds).close();
が必要かと思います。
はしもと
大ベテラン
会議室デビュー日: 2003/02/05
投稿数: 182
投稿日時: 2006-01-14 19:08
起動している Tomcat が持っている JNDI DataSource を
外部のプログラムから lookup する事は出来ないと思いますが、
Tomcat 自体を自分のプログラムに組み込む事は出来るので、
この場合は lookup 可能なのかもしれません。

単に Tomcat と同様 Commons DBCP を利用するなら、
ここ (http://jakarta.apache.org/commons/dbcp/) の
Examples や Depelopers Guide > JNDI Howto を見てみると
良いと思います。
どんたくお
ベテラン
会議室デビュー日: 2005/08/29
投稿数: 88
投稿日時: 2006-01-14 21:07
つばささん、はしもとさん、ご返信いただきまして、ありがとうございます。m(_|_)m

やはり、Tomcatが持っているDataSourceを外部からは利用できないのですね。
なるほどなるほど。
今回のスタンドアローンプログラムからデータベースへの接続は、多くても2回程度なのですが、もし可能ならTomcatのプーリングを使えればと思っていました。


みなさま、ご教授いただきまして、ありがとうございました。
flatline
大ベテラン
会議室デビュー日: 2005/09/22
投稿数: 102
投稿日時: 2006-01-16 13:36
ちょっと変則的ですが、cactus を使うという方法が可能かもしれません。
テスティングフレームワークなので、JUnit 経由で使用しなければなりませんが、
JUnit もスタンドアローンプログラムであることには変わりがないので。
問題なければ、JUnit として実行してしまってもいいし、JUnit のソースを
解析して、自前のスタンドアローンアプリケーションから起動する、という
手段も可能だと思います(たぶん)。
koe
大ベテラン
会議室デビュー日: 2003/07/13
投稿数: 198
投稿日時: 2006-01-16 15:13
引用:

flatlineさんの書き込み (2006-01-16 13:36) より:
ちょっと変則的ですが、cactus を使うという方法が可能かもしれません。



Cactusの仕組みを理解していればわかりますが、それってTomcatのVM上でスタンドアロンプログラムを実行させることになりますよね。

それなら適当なJSPを作り、そこに以下のようなスクリプトレットを書いた方がお手軽だと思います。

コード:
<%
  String[] args = {}; // 必要なら任意のパラメータを指定。
  foo.bar.HogeApp.main(args); // スタンドアロンプログラムのメインクラス
%>


で、このJSPにリクエストを送るプログラムを実行します。ブラウザでもwgetでもいいですが。

ただしこの場合、スタンドアロンプログラムで使用するclassファイルがWebアプリケーションから使用できる必要があります。

Cactusの導入は、web.xmlを修正したり、Cactusのjarファイルやcactus.propertiesを置いたりといろいろ手間がかかった覚えがあるので、これだけのためにCactusを導入するのは無駄かな、と思います。

そもそもこんなことをしてしまっていいのか、という問題もありますけどね。
flatline
大ベテラン
会議室デビュー日: 2005/09/22
投稿数: 102
投稿日時: 2006-01-16 15:52
引用:
Cactusの仕組みを理解していればわかりますが、それってTomcatのVM上でスタンドアロンプログラムを実行させることになりますよね。



 そうです。あくまでも、そのあたりが問題なければ、ということです。

 JSP にスクリプトレットを記述する方法でも、もちろんいいのですが、
「スタンドアローンプログラム」から、という点にこだわるのであれば、
cactus もありかな、と思います。
 そもそも、JSP にスクリプトレット書けるぐらいなら、普通に、
Servlet なり、JavaBean なりに記述すればいいわけなので。

引用:
Cactusの導入は、web.xmlを修正したり、Cactusのjarファイルやcactus.propertiesを置いたりといろいろ手間がかかった覚えがあるので、これだけのためにCactusを導入するのは無駄かな、と思います。



 確かに面倒ですが、それらの設定は最初に1回書けばいいので、たとえば
問題のスタンドアロンプログラムが、数十個あるのであれば、無駄にはなら
ないかもしれません。

 と、書いていますが、別に、cactus を推奨しているわけではないです。
ひとつの可能性を提示しているだけです。

はしもと
大ベテラン
会議室デビュー日: 2003/02/05
投稿数: 182
投稿日時: 2006-01-16 19:32
引用:
koeさんの書き込み (2006-01-16 15:13) より:
コード:

<%
String[] args = {}; // 必要なら任意のパラメータを指定。
foo.bar.HogeApp.main(args); // スタンドアロンプログラムのメインクラス
%>





これで良いなら

コード:

Embedded tomcat = new org.apache.catalina.startup.Embedded(); // Tomcat 作成
// ここで Tomcat 初期化
tomcat.start(); // Tomcat スタート
foo.bar.HogeApp.main(args); // スタンドアロンプログラムのメインクラス



でも良いと思う。
これだと同一 VM 上にならないのかな ?


[ メッセージ編集済み 編集者: はしもと 編集日時 2006-01-16 19:34 ]

スキルアップ/キャリアアップ(JOB@IT)