9

過去数日間、Web アプリの DatabaseConnectionPool をセットアップしようとしましたが、成功しませんでした。私はTomcatのドキュメントの関連セクションと主題に関する多くのことを読み、すべてを正しく行っていると思いますが、次のエラーが発生し続けているため、明らかにそうではありません:

Cannot create PoolableConnectionFactory (Access denied for user ''@'localhost' (using password: YES))

Tomcat の実行を開始するとエラーが発生しませんが、次のサーブレットを実行しようとすると:

package twittersearch.web;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
import java.sql.*;
import javax.sql.*;
import javax.naming.*;
import twittersearch.model.*;
public class ConPoolTest extends HttpServlet {

    public void doGet(HttpServletRequest request,
                  HttpServletResponse response) 
                  throws IOException, ServletException {
        Context ctx = null;
        DataSource ds = null;
        Connection conn = null;
        try {
            ctx = new InitialContext();
            ds = (DataSource)ctx.lookup("java:comp/env/jdbc/twittersearchdb");
            conn = ds.getConnection();
            if(conn != null) {
                System.out.println("have a connection from the pool");
            }
        } catch(SQLException e) {
            e.printStackTrace();
        } catch(NamingException e) {
            e.printStackTrace();
        } finally {
            try {
                if(conn!=null) {
                    conn.close();
                }
            } catch(SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

webapp のコンテキストは次のとおりです。

<?xml version='1.0' encoding='utf-8'?>
<Context>

    <!-- Configure a JDBC DataSource for the user database -->
 <Resource name="jdbc/twittersearchdb" 
           type="javax.sql.DataSource" 
     auth="Container" 
     user="root" 
     password="mypwd" 
     driverClassName="com.mysql.jdbc.Driver" 
     url="jdbc:mysql://localhost:3306/twitter" 
     maxActive="8" 
     maxIdle="4"/>


</Context>

私が本当に理解していないのは、それがユーザーであることを指定したときに、'root'@'localhost' へのアクセスが拒否されたというエラーが表示されない理由です。

私が試したこと:

context.xml が重複していますか? いいえ。Tomcat 6.0/conf のデフォルト on を削除しました。[mywebappname]/META-INF/context.xml に context.xml を入れようとしましたが、うまくいかなかっただけでなく、自動生成されて Tomcat 6.0/conf に入れられた TwitterSearch.xml という名前のファイルが作成されました。 /Catalina/localhost ディレクトリ。だから今、私はそれを編集しているだけで、それが私が持っている唯一のものです。

Tomcatのバージョンですか?まあ、Tomcat 6.0の最新バージョンを完全に再インストールしたので、そうではないと思います。

いくつかの瓶がありませんか?tomcat-dbcp.jar、jconnector.jar、および Tomcat 6.0/lib ディレクトリにあると思われる他のすべてのものがあります。

MySQL データベースのパスワードを見ると、セキュリティ上の目的で長い英数字の文字列にコード化されているようです。これは正常ですか?これを context.xml に含める必要がありますか、それとも通常のパスワードだけにする必要がありますか?

これをどのように整理すればよいか本当にわかりません。専門家のアドバイスをいただければ幸いです。

よろしくお願いします。

ジョー

4

3 に答える 3

14

セットアップは問題ないようです。これは完全にパーミッションの問題のようです。

mysql でそのユーザー アクセスを許可する必要があります。Java は localhost に接続しますが、tcp/ip を使用して接続しますが、mysql では localhost と 127.0.0.1 の意味が異なります。この SQL を発行するとうまくいくはずです。

grant all on twitter.* to 'root'@'127.0.0.1' identified by 'mypwd';

これは、Java が「localhost」を 127.0.0.1 に解決することを前提としています。それでもうまくいかない場合は、接続文字列を「jdbc:mysql://127.0.0.1:3306/twitter」に変更してみてください。

これを context.xml に含める必要がありますか、それとも通常のパスワードだけにする必要がありますか?

あなたが今持っているように、平文のパスワードです。

于 2010-09-23T20:39:19.767 に答える