2010-09-23 276 views
7

我一直在試圖設置一個Web應用程序的DatabaseConnectionPool在過去的幾天沒有成功我已經閱讀了Tomcat文檔的相關部分和周圍的主題了大量工作,認爲我做的一切權利,但顯然不是,因爲我不斷收到以下錯誤:無法創建PoolableConnectionFactory(訪問拒絕用戶'''本地主機'

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

我沒有得到的錯誤,當我啓動Tomcat運行,但是當我嘗試運行以下servlet:

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(); 
      } 
     } 
    } 
} 

上下文對於Web應用程序是:

<?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> 

我真不明白的是爲什麼錯誤不說,訪問被拒絕「根」 @「localhost」的時候,我指定這是用戶。

我已經試過什麼:

我是否有重複的context.xml?不,我刪除了Tomcat 6.0/conf中的默認值。我嘗試在[mywebappname] /META-INF/context.xml中放置一個context.xml,但不僅這樣做不起作用,而且導致創建一個名爲TwitterSearch.xml的文件,該文件被自動生成並放入Tomcat 6.0/conf/Catalina/localhost目錄。所以現在我只是編輯那個,那是我唯一的一個。

它是Tomcat的版本嗎?那麼,我完全重新安裝了最新版本的Tomcat 6.0,所以我不認爲是這樣。

我們是否缺少一些罐子?我有tomcat-dbcp.jar,jconnector.jar以及我認爲應該在Tomcat 6.0/lib目錄中擁有的其他所有其他目錄。

當我查看MySQL數據庫中的密碼時,他們似乎已將安全目的編碼爲長字母數字字符串。這是正常的嗎?我應該在我的context.xml中還是隻有普通密碼?

我真的不知道如何解決這個問題,真的很感謝一些專家的建議。

非常感謝提前。

Joe

回答

9

你的設置看起來不錯。這看起來純粹是一個權限問題。

您需要授予該用戶在mysql中的訪問權限。雖然Java會連接到本地主機,但它會使用tcp/ip - 但是在mysql localhost和127.0.0.1中有不同的含義。發佈這個SQL應該可以做到。

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

,它假定的Java解決「本地主機」爲127.0.0.1,如果事情仍不能正常工作,你可以嘗試改變你的連接字符串爲「jdbc:mysql的://127.0.0.1:3306 /嘰嘰喳喳」

Should I have this in my context.xml or just the normal password?

正如您現在使用明文密碼。

+1

您好,非常感謝您的回覆。我玩了你提供的GRANT ALL語句。出於某種原因,唯一可行的是當我; – Joe 2010-09-24 09:07:24

+0

GRANT ALL在Twitter上。*'''localhost'IDENTIFIED BY'mypwd'; – Joe 2010-09-24 09:07:58

+0

我已經刪除了root用戶,所以唯一的用戶是''@ localhost',它的工作原理。雖然我很高興它的工作原理,但仍然有些不對,因爲我在應用程序context.xml中指定用戶是'root',所以我想知道爲什麼''會起作用,而事實上是我的錯誤信息得到先驗總是拒絕訪問''@'localhost'而不是'root'@'localhost'。你有什麼想法,爲什麼這可能是這種情況? – Joe 2010-09-24 09:10:55

1

在您的webapp配置context.xml中,您必須通過username =「root」更改user =「root」

相關問題