2

サーブレット エンジン (この場合は Tomcat) 内で実行される一連のメソッドがあり、接続プールを使用して次のように記述されたデータベースにアクセスします。

// Gets an RSS_Feed.
public static RSS_Feed get(int rssFeedNo) {
    ConnectionPool_DB pool = ConnectionPool_DB.getInstance();
    Connection connection = pool.getConnection();
    PreparedStatement ps = null;
    ResultSet rs = null;

    String query = ("SELECT * " +
                    "FROM RSS_Feed " +
                    "WHERE RSSFeedNo = ?;");

    try {
        ps = connection.prepareStatement(query);
        ps.setInt(1, rssFeedNo);
        rs = ps.executeQuery();
        if (rs.next()) {
            return mapRSSFeed(rs);
        }
        else {
            return null;
        }
    }
    catch(Exception ex) {
        logger.error("Error getting RSS_Feed " + rssFeedNo + "\n", ex);
        return null;
    }
    finally {
        Database_Utils.closeResultSet(rs);
        Database_Utils.closeStatement(ps);
        pool.freeConnection(connection);
    }
}

このようなメソッドをサーブレット エンジンの外部で呼び出すことはできますか? サーブレット エンジン内ではなく、コマンド ラインから実行されるバッチ プロセスでこれを実行したいと考えています。接続プールを使用せずに単純にクエリを書き直すことができることはわかっていますが、これはプロセスに関係する多くのクエリの 1 つです。

接続プーリングは、Apache Common DBCP を介して実装されます。

ConnectionPool_DB.getInstance();読む:

private ConnectionPool_DB() {
    try {
        InitialContext ic = new InitialContext();
        dataSource = (DataSource) ic.lookup(PropertiesFile.getProperty("myApp", "DATASOURCE"));
        // dataSource = (DataSource) ic.lookup("java:/comp/env/jdbc/myApp");
    }
    catch(Exception ex) {
        logger.error("Error getting a connection pool's datasource\n", ex);
    }
}
4

3 に答える 3

1

プロジェクトに次のようなものがあります。

Context ctx = new InitialContext(); 
DataSource ds = (DataSource) ctx.lookup("DbConnection");
ConnectionPool connectionPool = new ConnectionPool(ds)

そして、コンテキストxml内で、次のようにリソースを定義します

<Resource name="DbConnection" 
auth="SERVLET" 
type="javax.sql.DataSource"  
scope="Shareable"            
driverClassName="**driverClassName**" 
url="**url**" 
username="**username**" 
password="**password**" 
maxActive="10" 
maxIdle="10" 
maxWait="1000"
/>

したがって、似たようなものがあると仮定します。そうであれば、DataSource を自分で作成するコードを記述する必要があります。

これは、その http://docs.oracle.com/javase/tutorial/jdbc/basics/sqldatasources.htmlに役立つはずです

于 2012-10-22T20:00:52.463 に答える
0

サーブレット エンジンとバッチ ジョブの間で接続プールを共有したいということですか。それとも、バッチ ジョブ内で接続プールを使用したいですか?

Tomcat とバッチ ジョブの間でプールを共有することについて: うーん、どうしたらいいのかわかりません。Tomcat とバッチ ジョブはそれぞれ、Java 仮想マシンの独自のインスタンスを持ちます。それらはメモリやクラスなどを共有していないため、そのような共通プールがどこにあるのかわかりません。

バッチ ジョブ内の場合: もちろんです。そのようなことはめったに必要ではないと思います。バッチ ジョブでは、通常、プログラムの開始時に接続を開き、最後に閉じます。接続プールを作成する価値はあまりありません。デスクトップ アプリは少しトリッキーです。アプリの起動時に接続を作成し、終了時に閉じることがよくありますが、おそらく、ユーザーが画面を盲目的に見つめているときに接続が拘束されます (昼食前の1時間ほどでよく行うように)。ユーザーが何かを発生させるキーをクリックするたびに接続を開き、それを解放してから「待機」モードに戻ります。繰り返しになりますが、デスクトップ アプリではプールを共有する他のユーザーがいないため、プーリングの意味はほとんどありません。

しかし、それはできますか?もちろん。私は、さまざまなタイミングで多くのことが発生する可能性があるデスクトップ アプリでそれを行ったので、単一の接続を渡すのは面倒でした。

于 2012-10-22T20:05:10.017 に答える
0

確かに、JNDI 接続を少し変更するだけで使用できます。しかし、Tomcat は実行されるはずです。

于 2012-10-22T20:10:19.323 に答える