2010-09-23 17 views
7

Ho cercato di configurare un DatabaseConnectionPool per un'app Web per l'ultimo paio di giorni senza esito positivo. Ho letto le sezioni pertinenti dei documenti Tomcat e una grande quantità intorno al soggetto e pensare che sto facendo tutto bene, ma ovviamente non perché continuano a ottenere il seguente errore:Impossibile creare PoolableConnectionFactory (Accesso negato per l'utente '' @ 'localhost'

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

non ricevo l'errore quando inizio Tomcat in esecuzione, ma quando Provo a eseguire il seguente 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(); 
      } 
     } 
    } 
} 

Il contesto per la 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> 

Quello che davvero non capisco è perché l'errore non sta dicendo che l'accesso è negato a 'root' @ 'localhost' quando ho specificato che questo è l'utente.

Quello che ho provato:

Ho un context.xml duplicato? No. Ho eliminato il valore predefinito attivo in Tomcat 6.0/conf. Ho provato a inserire un context.xml in [mywebappname] /META-INF/context.xml ma non solo ha funzionato, ma ha portato alla creazione di un file denominato TwitterSearch.xml che è stato generato automaticamente e inserito in Tomcat 6.0/conf/Catalina/directory localhost. Quindi ora sto solo modificando quello e questo è l'unico che ho.

È la versione di Tomcat? Bene, ho completamente reinstallato l'ultima versione di Tomcat 6.0, quindi non penso che sia così.

Ci mancano alcuni vasi? Ho il tomcat-dbcp.jar, jconnector.jar e tutti gli altri che penso che io abbia intenzione di avere nella directory Tomcat 6.0/lib.

Quando guardo le password nel database MySQL, sembra che siano state codificate per motivi di sicurezza in una lunga stringa alfanumerica. È normale? Dovrei avere questo nel mio context.xml o semplicemente la normale password?

Non so davvero come sia possibile risolvere questo problema e apprezzare davvero qualche consiglio esperto.

Molte grazie in anticipo.

Joe

risposta

9

L'installazione sembra corretta. Questo sembra essere puramente un problema di autorizzazioni.

È necessario concedere l'accesso utente in mysql. Mentre Java si connetterà a localhost, lo farà usando tcp/ip - tuttavia in mysql localhost e 127.0.0.1 hanno un significato diverso. L'emissione di questo SQL dovrebbe fare il trucco.

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

che assume Java risolve 'localhost' a 127.0.0.1, se le cose ancora non funziona, si potrebbe provare a cambiare la stringa di connessione a "jdbc: mysql: //127.0.0.1: 3306/twitter"

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

Come lo avete ora, la password in chiaro.

+1

Hi nos, Grazie per la risposta. Ho giocato con la dichiarazione GRANT ALL che hai fornito.Per qualche ragione l'unica cosa che funziona è quando io; – Joe

+0

GRANT ALL su twitter. * TO '' @ 'localhost' IDENTIFICATO DA 'mypwd'; – Joe

+0

Ho eliminato l'utente root in modo che l'unico utente sia '' @ 'localhost' e funzioni. Mentre sono contento che funzioni, qualcosa non va ancora bene perché ho specificato nel mio app context.xml che l'utente è 'root' quindi mi chiedo perché '' funzionerà e in effetti il ​​messaggio di errore che ero sempre prima stava sempre negando l'accesso a '' @ 'localhost' e non a 'root' @ 'localhost'. Hai idea del perché questo potrebbe essere il caso? – Joe

1

Nella context.xml configurazione per il webapp dovete cambiare user = "root" di username = "root"

Problemi correlati