2

jsp で接続プール操作を実行しています。MCE_Server.javaという特定のクラスに静的関数を作成し、以下を含めました。

 public static void makeConnectionPool()
 {
    try
    {
        cpds = new ComboPooledDataSource();
        cpds.setDriverClass("com.mysql.jdbc.Driver");
        cpds.setJdbcUrl("jdbc:mysql://localhost:3306/mce_db");
        cpds.setUser("root");
        cpds.setPassword("xxxxxx");
        cpds.setMaxPoolSize(100);
        cpds.setMinPoolSize(10);
        cpds.setAcquireIncrement(20);
    } 
    catch (PropertyVetoException ex) 
    {

        Logger.getLogger(MCE_Server.class.getName()).log(Level.SEVERE, null, ex);
    }

 }

次の静的関数はjspページから呼び出されます

http://................/dbActivatePage.jsp

関数を含めた場所

      <%@page import="xxxxx.MCE_Server"%>
      <html>
      .
      .
      .
      <body>
      <%
              MCE_Server.makeConnectionPool();
      %>
      .
      .
      .
      </body>
      </html>

次のように、 MCE_Server.javaに含まれる静的関数に従って、必要な接続を取得する予定です。

       public static Connection getConnectionfromPool() throws SQLException
       {
             return cpds.getConnection();
       }

つまり、接続を取得する必要があるときはいつでも。含めますMCE_Server.getConnectionfromPool()

今、私が抱えている問題は、エラーを受け取ることです

java.sql.SQLException: Connections could not be acquired from the underlying database!

なぜ私はこれを手に入れているのですか......???

さらに試行錯誤の方法で....コードの下のステートメント cpds = new ComboPooledDataSource();が実行されていることがわかりました。

では、ここで何が問題になるのでしょうか。私のアプローチは正しいですか?

4

2 に答える 2

3

これは良い方法ではありません。JSP の <% ... %> 内のものは、クライアントがページにアクセスするたびに実行されます。接続プールは、ユーザー リクエストごとに 1 回ではなく、Web アプリケーションごとに 1 回だけ作成する必要があります。

Web アプリで接続プールを設定する私のお気に入りの方法は、contextInitialized(ServletContextEvent sce) でプールを作成し、それをアプリケーション スコープの名前にバインドする ServletContextListener を設定することです (つまり、ServletContext 属性を設定します)。 . プールは、ServletContextListener の contextDestroyed メソッドで close() する必要があります。

それが面倒だと思われる場合は、makeConnectionPool() をプライベート メソッドに変更し、静的初期化ブロック内からのみ呼び出してください。<% MCE_Server.makeConnectionPool(); を取り除きます。%> 完全に。その後、makeConnectionPool() は、MCE_Server クラスがロードされるときに 1 回だけ呼び出されます。ただし、プールを破棄することはないため、アプリケーションをアンロードしてホット再デプロイすると (つまり、サーブレット コンテナーの JVM を終了せずに war ファイルを変更して再ロードすると)、スレッドやその他のリソースのリークが見つかります。

于 2013-02-06T10:43:04.110 に答える
1

表示されているエラーをよく見てください。

java.sql.SQLException: Connections could not be acquired from the underlying database!.

ServletContextListener を使用するという Waldman の考えには同意しますが、c3p0 の構成は正しいようです。あなたの場合、問題はmysqlクラスパスで何かをしなければならないと強く信じています。mysql コネクタが正しく含まれているかどうかを確認してください。

于 2013-02-11T08:43:07.997 に答える