1

私はJavaが初めてです。jdbcを介してデータベースにアクセスするJavaクラスがあります。このクラスの各メソッドで、接続を開いたり閉じたりしているため、パフォーマンスが低下しているようです。jdbc 接続プールを使用してみましたが、同じことを進める方法がわかりません。以下のように Server.xml と Context.xml ファイルを作成しました。

サーバー.xml

<GlobalNamingResources>
  <Resource type="javax.sql.DataSource"
            name="jdbc/TestDB"
            factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
            driverClassName="com.mysql.jdbc.Driver"
            url=""
            username=""
            password=""
/>
 </GlobalNamingResources>

Context.xml

<Context>
  <ResourceLink type="javax.sql.DataSource"
                name="jdbc/LocalTestDB"
                global="jdbc/TestDB"
/>
 </Context>

以下のようにテストJavaクラスを作成しました。

import java.sql.Connection;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;

public class TestDBConnections {

    Context initContext = new InitialContext();
    Context envContext = (Context) initContext.lookup("java:/comp/env");
    DataSource datasource = (DataSource) envContext.lookup("jdbc/LocalTestDB");
    Connection con = datasource.getConnection();

}    

以下のエラーが表示されます:

デフォルト コンストラクターは、暗黙的なスーパー コンストラクターによってスローされた例外の種類 NamingException を処理できません。明示的なコンストラクターを定義する必要があります。

それを手伝ってください。

4

4 に答える 4

1

server.xml では、グローバル データソースを定義します。ただし、このデータソースはどのコンテキストでも使用できません。そのグローバル データソースの context.xml でリソース リンクが定義されていない限り。したがって、server.xml の「name」属性の値と同等の「global」属性値を持つリソース リンクが必要です。

Auth 属性 :- Web アプリケーション コードが対応するリソース マネージャーにプログラムでサインオンするか、コンテナーがアプリケーションに代わってリソース マネージャーにサインオンするかを指定します。この属性の値は、Application または Container である必要があります。この属性は、Web アプリケーションが Web アプリケーション デプロイメント記述子の要素を使用する場合は必須ですが、アプリケーションが代わりに を使用する場合はオプションです。

Tomcat を起動すると、このデータソースが作成され、接続がプールに存在します。リソースリンクを定義したコンテキスト内で特定のコードスニペットを使用するだけです。そして、そこから必要なデータソースとデータベース接続を取得します。

于 2013-06-14T11:06:02.273 に答える
1

私は自分の構成をコピーしていますが、それは私のために働いています。構成を同じに変更できますが、うまくいくと思います...

context.xml

<ResourceLink
        global="jdbc/ManagerDB"
        name="jdbc/ManagerDB"
        type="javax.sql.DataSource"/>

サーバー.xml

<Resource name="jdbc/ManagerDB"
              auth="Container"
              type="com.mchange.v2.c3p0.ComboPooledDataSource"
              factory="org.apache.naming.factory.BeanFactory"
              user="MQG7qJMthHrAYL1eoLkJlg=="
              password="Y3XTGQyJCRs9xY1/ZPvYiQ=="
              driverClass="com.microsoft.sqlserver.jdbc.SQLServerDriver"
              jdbcUrl="jdbc:sqlserver://;serverName=172.16.2.45;port=1433;DatabaseName=mgmt"
              preferredTestQuery="SELECT 1"
              testConnectionOnCheckout="false"
              maxPoolSize="75"  
              initialPoolSize="30" 
              numHelperThreads="5"
              maxStatementsPerConnection="1875"
              testConnectionOnCheckin="false"
              idleConnectionTestPeriod="300"
              checkoutTimeout="10000" /> 

以下のコード サンプルを使用して、jndi ルックアップを介してデータソースを取得できます。

Context initContext = new InitialContext();
DataSource dataSource = (DataSource)ctx.lookup("java:comp/env/jdbc/ManagerDB");

注: 1) リソース リンクでグローバル値と名前の値が同じです
。2) C3p0 データソースを使用しました。Tomcat のデフォルト データソースを使用できます。

于 2013-06-14T07:20:56.547 に答える
0

このようにして、コードの下に言及するのと同様maxActiveに接続の制限を 行います。server.xml

 <GlobalNamingResources>
 <Resource type="javax.sql.DataSource"
        name="jdbc/TestDB"
        factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
        driverClassName="com.mysql.jdbc.Driver"
        url=""
        username=""
         password=""
maxActive="100" maxIdle="30" maxWait="10000"
/>
</GlobalNamingResources>
于 2013-06-14T06:53:33.070 に答える
0

例外ハンドラを使用してください。データベース接続コードのため、try catch または Throws を使用します。このように使用します

try
{
Context initContext = new InitialContext();
    Context envContext = (Context) initContext.lookup("java:/comp/env");
    DataSource datasource = (DataSource) envContext.lookup("jdbc/LocalTestDB");
    Connection con = datasource.getConnection();
}

catch(Exception ex)
{

}
于 2013-06-14T06:44:24.210 に答える