web-dev-qa-db-ja.com

TomcatおよびJDBC接続プーリング

Tomcatを使用してmysqldatabeへの接続プールを設定しようとしています。私のシンプルなアプリはProjektと呼ばれ、Apache/conf/Catalina/localhostのProjekt.xmlにあります。

<Context docBase="Projekt.war" path="/Projekt">
  <Resource name="jdbc/mysqldb"
      auth="Container"
  factory="org.Apache.Tomcat.jdbc.pool.DataSourceFactory"
      type="javax.sql.DataSource"
      driverClassName="com.mysql.jdbc.Driver"
      url="jdbc:mysql://localhost:3306/Music"
      username="andrzej"
      password="qazxsw"
      maxActive="20"
      maxIdle="30"
      maxWait="5"
  />
</Context> 

私のアプリのweb.xml

<servlet>
    <servlet-name>HelloServlet</servlet-name>
    <servlet-class>org.jtp.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>HelloServlet</servlet-name>
    <url-pattern>/Hai</url-pattern>
</servlet-mapping>

<resource-ref>     
        <description>DB Connection</description>     
       <res-ref-name>jdbc/mysqldb</res-ref-name>     
       <res-type>javax.sql.DataSource</res-type>     
       <res-auth>Container</res-auth>     
 </resource-ref>

そして私のApache/libフォルダに私は持っています

mysql-connector-Java-5.1.18-bin.jar

しかし、私がこのコードを実行すると:

Context initContext  = new InitialContext();
dataSource = (DataSource)initContext.lookup("Java:comp/env/jdbc/mysqldb");
System.out.println(dataSource.getConnection().createStatement().
            execute("select * from Users"));

例外が発生します

org.Apache.Tomcat.dbcp.dbcp.SQLNestedException: Cannot create JDBC driver of class '' for connect URL 'null'

ドライバーをTomcat/libに配置していないことが原因である可能性があると読んだところもありますが、手動接続でドライバーをテストしたときに機能したため、問題はありません。

私のセットアップでは、フォローしようとしていました http://people.Apache.org/~fhanik/jdbc-pool/jdbc-pool.html

編集:ついにそれが機能するようになりました、私はファイルの1つにいくつかの左コンテキストタグを持っていたようでしたので、解析するときに彼は他の属性をオーバーライドしました、それは最後にすべて私のせいです。

11
Andna

Context envCtx = (Context) initCtx.lookup("Java:comp/env");が不足しているようです
JNDIルックアップは次のように実行する必要があります。

// Obtain our environment naming context
Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("Java:comp/env");

// Look up our data source
DataSource ds = (DataSource) envCtx.lookup("jdbc/EmployeeDB");

// Allocate and use a connection from the pool
Connection conn = ds.getConnection(); 

http://Tomcat.Apache.org/Tomcat-7.0-doc/jndi-resources-howto.html からのドキュメント。

12
drobson

TomcatでJDBC接続プールを実現するために、XMLの代替構成ファイルがあります。これらのContextタグとresource-refタグを機能させることができませんでした。さらに、 [〜#〜] jndi [〜#〜] 機能が本当に必要ない場合、これらのタグはやり過ぎです。

別の方法は、構成するJavaコード TomcatのJDBC接続プールを使用することです。 Tomcat 7ドキュメントページのPlain Ol'Javaセクションのサンプルコードを参照してください。 Tomcat JDBC接続プール

基本的に、あなたは:

  1. PoolProperties オブジェクトをインスタンス化して、設定(データベースへのURL、dbユーザー名、dbパスワードなど)を保存します。
  2. 上記の手順1のPoolPropertiesオブジェクトを渡しながら、Tomcat DataSource オブジェクトをインスタンス化します。

簡単なピーシー。このような…

PoolProperties p = new PoolProperties();
p.setUrl( jdbc:postgresql://localhost:5432/" + "my_database_name" );
p.setDriverClassName( "org.postgresql.Driver" );
p.setUsername( "someUserName" );
p.setPassword( "somePassword" );
…
DataSource datasource = new org.Apache.Tomcat.jdbc.pool.DataSource( p );
datasource.setPoolProperties(p);

データソースを使用するには…

Connection conn = null;
try {
    conn = datasource.getConnection();
    …

DataSourceインスタンスは次のように保存できます。

  • サーブレットのメンバーフィールドとして。
  • 別の回答のコメントで言及されているシングルトンとして。
  • 私の回答 で説明されているように、ServletContextからStringへの組み込みマッピングを使用して、Objectの「属性」として質問について Javaサーブレットコンテキスト でグローバルオブジェクトを取得および設定する方法。
16
Basil Bourque