2010-09-23 4 views
7

J'ai essayé de mettre en place un DatabaseConnectionPool pour une application Web ces deux derniers jours sans succès.J'ai lu les sections pertinentes des documents Tomcat et beaucoup autour du sujet et pensent que je fais tout droit, mais évidemment pas parce que je continue à obtenir l'erreur suivante:Impossible de créer PoolableConnectionFactory (Accès refusé pour l'utilisateur '' @ 'localhost'

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

Je ne reçois pas l'erreur quand je commence à Tomcat en cours d'exécution, mais quand J'essaie d'exécuter le servlet suivant:

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

Le contexte pour la webapp est:

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

Ce que je ne comprends vraiment pas pourquoi l'erreur ne dit pas que l'accès est refusé à « root » @ « localhost » quand j'ai précisé que c'est l'utilisateur.

Ce que j'ai essayé:

Ai-je un context.xml en double? J'ai supprimé la valeur par défaut dans Tomcat 6.0/conf. J'ai essayé de mettre un context.xml dans [mywebappname] /META-INF/context.xml mais non seulement ça n'a pas fonctionné, mais cela a entraîné la création d'un fichier nommé TwitterSearch.xml qui a été généré automatiquement et placé dans le Tomcat 6.0/conf/Répertoire Catalina/localhost. Alors maintenant, je suis en train d'éditer celui-là et c'est le seul que j'ai.

Est-ce la version de Tomcat? Eh bien, j'ai complètement réinstallé la dernière version de Tomcat 6.0, donc je ne pense pas que ce soit ça.

Avons-nous oublié des bocaux? J'ai le tomcat-dbcp.jar, jconnector.jar et tous les autres que je pense que je suis censé avoir dans le répertoire Tomcat 6.0/lib. Lorsque je regarde les mots de passe dans la base de données MySQL, ils semblent avoir été codés à des fins de sécurité dans une longue chaîne alphanumérique. Est-ce normal? Devrais-je avoir ceci dans mon context.xml ou juste le mot de passe normal? Je ne sais vraiment pas comment je peux régler cela et j'apprécierais vraiment des conseils d'experts.

Merci beaucoup à l'avance.

Joe

Répondre

9

Votre configuration est correcte. Cela semble être un problème d'autorisations.

Vous devez accorder cet accès utilisateur dans mysql. Alors que Java va se connecter à localhost, il le fera en utilisant tcp/ip - cependant dans mysql localhost et 127.0.0.1 ont une signification différente. L'émission de ce SQL devrait faire l'affaire.

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

qui suppose Java résout 'localhost' à 127.0.0.1, si les choses ne fonctionne toujours pas, vous pouvez essayer de changer votre chaîne de connexion à "jdbc: mysql: //127.0.0.1: 3306/twitter"

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

Comme vous l'avez maintenant, le mot de passe en clair.

+1

Salut nos, Merci pour votre réponse. J'ai joué avec la déclaration GRANT ALL que vous avez fournie.Pour une raison quelconque, la seule chose qui fonctionne est quand je; – Joe

+0

DONNER TOUT sur twitter. * À '' @ 'localhost' IDENTIFIÉ PAR 'mypwd'; – Joe

+0

J'ai supprimé l'utilisateur root de sorte que le seul utilisateur est '' @ '' localhost 'et cela fonctionne. Bien que je sois heureux que ça marche, quelque chose ne va pas, parce que j'ai spécifié dans mes applications context.xml que l'utilisateur est 'root' alors je me demande pourquoi '' fonctionnera et en fait le message d'erreur que j'étais Beforee refusait toujours l'accès à '' @ '' localhost 'et non à' root '@' localhost '. Avez-vous une idée de pourquoi cela pourrait être le cas? – Joe

1

Dans votre context.xml de configuration pour la webapp vous devez changer d'utilisateur = "root" par nom d'utilisateur = "root"

Questions connexes