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
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
GRANT ALL su twitter. * TO '' @ 'localhost' IDENTIFICATO DA 'mypwd'; – Joe
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