web-dev-qa-db-ja.com

サーブレットベースのアプリケーションでJDBCデータベース/データソースに接続するにはどうすればよいですか?

外部MySQLサーバーがセットアップされ、正常に動作しています。私はEclipseでデータベース接続を作成し、[データソースエクスプローラー]タブでデータベースを表示できます。

これで、そのデータベースにアクセスする必要があるサーブレットができました。どうすればいいのですか?データソースエクスプローラーで作成されたデータベース接続を参照する方法はありますか、それともすべてを2回定義する必要がありますか?

また、接続を開くための最良の方法は何ですか? mysql-connector-Java-5.1.11-bin.jarファイルが含まれていて、機能する2つの方法を見つけました。

MysqlDataSource d = new MysqlDataSource();
d.setUser("user");
d.setPassword("pass");
d.setServerName("hostname.com");
d.setDatabaseName("db");
Connection c = d.getConnection();

そして

Connection c = DriverManager.getConnection("jdbc:mysql://hostname.com/db","user","pass");

まず、どちらもハードコードされた文字列をすべてに使用するため、どちらも最適ではありません。これはJava EE Webアプリプロジェクトです。接続データを配置するのに適した場所はありますか?それともすべてを無視してデータソースエクスプローラーで接続を使用する方法はありますか?

20
Ed Marty

一般的な方法は、問題の サーブレットコンテナー でこれを DataSource として構成することです。パフォーマンスを大幅に向上させる接続プール機能を提供します。また、一般的な方法は、クラスパスに配置された構成ファイルの未加工設定を外部化することです。

Tomcat をservletcontainerとして使用している場合は、 JNDIドキュメント に従ってデータソースを設定する必要があります。いくつかの方法があることがわかります。最も簡単な方法は、動的Webプロジェクトのwebcontentに_/META-INF/context.xml_を作成することです(明確に言うと、_/META-INF_はwebappの_/WEB-INF_と同じレベルです)。何かのようなもの:

_<?xml version="1.0" encoding="UTF-8"?>

<Context>
    <Resource
        name="jdbc/db" type="javax.sql.DataSource"
        maxActive="100" maxIdle="30" maxWait="10000" 
        url="jdbc:mysql://hostname.com/db"
        driverClassName="com.mysql.jdbc.Driver"
        username="user" password="pass"
    />
</Context>
_

これはおおよそ、Tomcatサーバーが最大100のアクティブな接続、最大30のアイドルのJNDI名_jdbc/db_のデータソースをcreateする必要があることを意味します接続と、アプリケーションから接続が返されるまでの最大待機時間10000ミリ秒(実際には、アプリケーションによって閉じられるため、アプリケーションは接続を取得してから接続を閉じるまでに10秒の時間があります)。設定の残りはよく知っていて、あなたには十分に自己説明的であるはずです。これらはJDBC設定です。

最後にWebプロジェクトで、ファイル_/WEB-INF/web.xml_を編集して次のエントリを追加します。

_<resource-env-ref>
    <resource-env-ref-name>jdbc/db</resource-env-ref-name>
    <resource-env-ref-type>javax.sql.DataSource</resource-env-ref-type>
</resource-env-ref>
_

これは、おおよそ、Webアプリケーションが_jdbc/db_という名前のサーバー提供のデータソースをuse使用する必要があることを意味します。

次に、接続マネージャーを次のように変更します。

_private DataSource dataSource;

public Database(String jndiname) {
    try {
        dataSource = (DataSource) new InitialContext().lookup("Java:comp/env/" + jndiname);
    } catch (NamingException e) {
        // Handle error that it's not configured in JNDI.
        throw new IllegalStateException(jndiname + " is missing in JNDI!", e);
    }
}

public Connection getConnection() {
    return dataSource.getConnection();
}
_

..そして、すべてのClass.forName(driver)呼び出しをnew Database("jdbc/db")で置き換え、すべてのDriverManager.getConnection()呼び出しをdatabase.getConnection()で置き換えます。必要に応じて、いくつかの構成ファイル( プロパティファイル? )から値_jdbc/db_を取得できます。

または、 _@Resource_ サーブレットクラスなどのコンテナ管理のアーティファクト内に _@WebServlet_ アノテーションを介してDataSourceを挿入します。

_@Resource(name="jdbc/db")
private DataSource dataSource;
_

それはそれであるはずです。上記の変更を加えたWebアプリケーションをデプロイして実行するだけです。データベースJDBCドライバーを_Tomcat/lib_に配置するか、そのパスを_shared.loader_の_Tomcat/conf/catalina.properties_プロパティに追加することを忘れないでください。これにより、JDBCドライバーのロードの責任は、サーバーへのWebアプリケーション。その他のヒントやその他の基本的なJDBC/JNDIの例については、 この記事 も役立つかもしれません。

以下も参照してください。

42
BalusC

WARをデプロイするアプリケーションサーバーにデータソースを設定し、JNDIを使用してそれへの参照をフェッチできます。または、WARをEARにパッケージ化し、EARのdata-sources.xmlファイルでデータソースを定義する(そしてJNDIを使用してそれへの参照をフェッチする)ことができます。

3
Voytek Jarnot