2012-08-06 4 views
5

J'essaie de faire quelque chose apparemment simple: mettre en place un petit pool de connexions de base de données afin qu'une servlet (juste un) ne crée pas mon serveur à 1 connexion par seconde.jetty mysql connexion de base de données de connexion

Sur Ubuntu 10.04, avec la dernière mise à jour/mise à jour, j'utilise Eclipse Jetty 8.1.5.v20120716. J'essaie de me connecter à un serveur MySQL 5.1.

Mon servlet est appelé gcm, donc dans ${jetty}/contexts, j'ai ce fichier gcm.xml:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure.dtd"> 
<Configure id="wac" class="org.eclipse.jetty.webapp.WebAppContext"> 
    <New id="jdbc/myds" class="org.eclipse.jetty.plus.jndi.Resource"> 
    <Arg></Arg> 
    <Arg>jdbc/myds</Arg> 
    <Arg> 
     <New class="com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource"> 
     <Set name="Url">jdbc:mysql://localhost:3306/chat</Set> 
     <Set name="User">root</Set> 
     <Set name="Password">sillyness</Set> 
     </New> 
    </Arg> 
    </New> 
    <Set name="contextPath">/</Set> 
    <Set name="war"><SystemProperty name="jetty.home" default="."/>/webapps/gcm</Set> 
    <Set name="extractWAR">true</Set> 
</Configure> 

Quand je commence la jetée avec java -jar start.jar -port=8080, tout commence bien jusqu'à ce que je tente de frapper la base de données de mon servlet. La partie à manipuler le code de la demande ressemble à ceci:

public static List<String> getDevices() 
    throws javax.naming.NamingException, java.sql.SQLException { 
    synchronized (regIds) { 
     InitialContext ctx = new InitialContext(); 
     DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/myds"); 
     Connection conn = null; 
     Statement stmt = null; 

     try { 
      conn = ds.getConnection(); 

      stmt = conn.createStatement(); 
      ResultSet rs = stmt.executeQuery("select * from chatdevice"); 

     //blah,blah,blah... 

L'erreur que je reçois est:

javax.naming.NameNotFoundException; remaining name 'jdbc/myds' 
     at org.eclipse.jetty.jndi.NamingContext.lookup(NamingContext.java:500) 
     at org.eclipse.jetty.jndi.NamingContext.lookup(NamingContext.java:531) 
     at org.eclipse.jetty.jndi.NamingContext.lookup(NamingContext.java:531) 
     at org.eclipse.jetty.jndi.NamingContext.lookup(NamingContext.java:546) 
     at org.eclipse.jetty.jndi.java.javaRootURLContext.lookup(javaRootURLContext.java:112) 
     at javax.naming.InitialContext.lookup(InitialContext.java:409) 
     at com.google.android.gcm.demo.server.Datastore.getDevices(Datastore.java:98) 

Comment obtenir la jetée pour trouver le code de base de données?

Répondre

0

Essayez d'ajouter ceci à Web.xml

<resource-ref> 
    <res-ref-name>jdbc/myds</res-ref-name> 
    <res-type>javax.sql.DataSource</res-type> 
    <res-auth>Container</res-auth> 
</resource-ref> 
+0

Salut Sumit, merci pour la réponse, mais si je mets cela dans un fichier appelé 'web.xml', ou n'importe où dans mon fichier gcm.xml, on me dit "Impossible d'atteindre le noeud target: started", et " Type de configuration inconnu: resource-ref dans " –

+0

J'ai oublié de mentionner: si je frappe ma servlet à ce moment-là, je reçois toujours la même erreur NameNotFoundException. –

5

Dans mon cas, je suis allé à la liste de diffusion de la jetée (https://dev.eclipse.org/mailman/listinfo/jetty-users) pour poser ma question.

Une très intelligente personne (! Salut Jan) a écrit et a répondu comme ceci:

Il y a généralement de nombreuses façons de atteind le même résultat dans jetée, donc c'est probablement la raison pour laquelle vous avez vu différentes façons documenté. En règle générale avoir des options est une bonne chose

Dans le cas où il y a confusion, c'est la page définitive: http://wiki.eclipse.org/Jetty/Feature/JNDI S'il y a quelque chose manquant, alors s'il vous plaît laissez-nous savoir afin que nous puissions mettre à jour la page.

Votre cas est un peu hors du commun en ce que vous utilisez les fonctionnalités de type javaee , mais sans un fichier web.xml. Ce n'est pas quelque chose que j'ai déjà rencontré auparavant, mais cela ressemble à quelque chose que je devrais ajouter à la documentation de .

Je recommande (tout comme la page ci-dessus) que vous mettez toutes les définitions jndi dans un WEB-INF/fichier-jetée env.xml et pas le fichier xml contexte . Si vous faites cela, alors vous pouvez effectivement faire ce qu'un élément web.xml ferait et lier votre source de données dans l'espace de noms java: comp/env en définissant votre ressource et la lier en java: comp/env dans le coup (notez cela PAS travail dans un contexte fichier xml, il doit être jetée-env.xml):

Alors procédez comme suit dans WEB-INF/jetée-env.xml:

<New id="jdbc/myds" class="org.eclipse.jetty.plus.jndi.Resource"> 
    <Arg></Arg> 
    <Arg>jdbc/myds</Arg> 
    <Arg> 
    <New class="com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource"> 
     <Set name="Url">jdbc:mysql://localhost:3306/chat</Set> 
     <Set name="User">root</Set> 
     <Set name="Password">sillyness</Set> 
    </New> 
    </Arg> 
    <Call name="bindToENC"> 
    <Arg>jdbc/myds</Arg> 
    </Call> 
</New> 

Dans l'appel à lier bindToENC quel que soit le nom que vous voulez regarder comme le suffixe java: comp/env. Par exemple, si vous voulez rechercher java: comp/env/my/foo alors l'argument bindToENC serait "my/foo".

- Jan Bartel www.webtide.com - Conseil aux développeurs, services et support de la jetée & Experts CometD. _______________________________________________ jetée utilisateurs liste de diffusion [email protected] https://dev.eclipse.org/mailman/listinfo/jetty-users

Maintenant, ce n'était pas tout à fait assez (je suis un débutant de la jetée). Le WEB-INF auquel on se référait était le WEB-INF dans le fichier war de mon servlet ... donc j'ai extrait le contenu du fichier war dans un répertoire, et ensuite je pourrais facilement mettre le fichier jetty-env.xml dans le WEB -INF répertoire.

Ce critiquait aussi:

OK, je suppose qu'il a peu de connaissance de la jetée, et pensé que vous sauriez que ce que je posté était simplement un extrait de ce que vous aurez besoin d'avoir pour un fichier jetty-env.xml complet.

La page wiki pour le fichier-jetée env.xml est ici: http://wiki.eclipse.org/Jetty/Reference/jetty-env.xml

enveloppez donc l'élément racine comme indiqué sur cette page autour de l'extrait que je vous Affichée et devrait être bon.

Maintenant/que/a obtenu la connexion à la base de données à tenter. Ensuite, j'obtenais des erreurs connection refused from 127.0.0.1 dans /var/log/auth.log.

Il s'avère que j'avais Denyhosts en cours d'exécution, et bien sûr quelqu'un avait mis ALL: 127.0.0.1 là ... ce qui signifie que les connexions à ma machine locale ont été refusées.

Une fois ce détail corrigé, la servlet peut enfin atteindre MySQL sur mon serveur.

Questions connexes