2012-08-06 9 views
5

Sto provando a fare qualcosa apparentemente semplice: impostare un piccolo pool di connessioni database in modo che un servlet (solo uno) non crei il mio server a 1 connessione al secondo.jetty mysql database pooling pool

Su Ubuntu 10.04, con l'ultimo aggiornamento/aggiornamento, sto usando Eclipse Jetty 8.1.5.v20120716. Sto cercando di connettermi a un server MySQL 5.1.

mio servlet viene chiamato gcm, quindi in ${jetty}/contexts, ho questo gcm.xml di file:

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

Quando inizio Pontile con java -jar start.jar -port=8080, tutto comincia bene fino a quando cerco di colpire il database dal mio servlet. La parte il codice di gestione della richiesta si presenta così:

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'errore che ottengo è:

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) 

Come arrivare Jetty per trovare il codice del database?

risposta

0

Prova ad aggiungere questo per 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

Ciao Sumit, grazie per la risposta, ma se lo metto in un file chiamato "web.xml", o in qualsiasi parte del mio file gcm.xml, mi viene detto "Impossibile raggiungere l'obiettivo del nodo: avviato", e " Tipo di configurazione sconosciuto: resource-ref in " –

+0

Ho dimenticato di menzionare: se colpisco il mio servlet a quel punto, ho ancora lo stesso errore NameNotFoundException. –

5

Nel mio caso, sono andato al pontile mailing list (https://dev.eclipse.org/mailman/listinfo/jetty-users) a chiedere la mia domanda.

Una molto intelligente persona (! Ciao Jan) ha scritto e ha risposto in questo modo:

Ci sono generalmente molti modi diversi per acheive lo stesso risultato in molo, in modo che è probabilmente il motivo che hai visto diversi modi documentata. Generalmente avere opzioni è una buona cosa

Nel caso in cui ci sia alcuna confusione, questa è la pagina definitiva: http://wiki.eclipse.org/Jetty/Feature/JNDI Se c'è qualcosa mancante, quindi fatecelo sapere così possiamo aggiornare la pagina.

Il tuo caso è un po 'fuori dall'ordinario in quanto stai utilizzando le funzioni di stile javaee , ma senza un file web.xml. Questo non è qualcosa che ho trovato prima, ma suona come qualcosa che dovrei aggiungere alla documentazione .

Suggerirei (come fa la pagina di cui sopra) che si mette ogni jndi definizioni in un WEB-INF file/pontile-env.xml e non il file xml contesto . Se lo fai, allora puoi fare effettivamente ciò che un elemento web.xml farebbe e vincolare la tua origine dati nello spazio dei nomi java: comp/env definendo la tua risorsa e vincolandola in java: comp/env in un go (notare che questo sarà NON lavoro in un file XML contesto , è deve essere molo-env.xml):

Quindi effettuare le seguenti operazioni in WEB-INF/pontile-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> 

nella chiamata a bindToENC bind qualunque sia il nome che si desidera cercare la suffisso java: comp/env. Ad esempio, se si desidera cercare java: comp/env/my/foo , l'argomento bindToENC sarebbe "my/foo".

- Jan Bartel www.webtide.com - Consulenza dello sviluppatore, servizi e supporto dal pontile & Esperti di CometD. _______________________________________________ molo-users mailing list [email protected] https://dev.eclipse.org/mailman/listinfo/jetty-users

Ora, questo non era abbastanza (io sono un novizio pontile). Il WEB-INF di cui si parlava era il WEB-INF all'interno del file war per il mio servlet ... così ho estratto il contenuto del file war in una directory, e quindi avrei potuto facilmente inserire il file jetty-env.xml nel WEB -INF directory.

Questo è stato troppo critico:

OK, ho assunto un po 'di conoscenza pontile lì, ed ho pensato che sapresti che quello che ho postato era solo un frammento da quello che ci si bisogno di avere per un file jetty-env.xml completo.

la pagina wiki per il file-pontile env.xml è qui: http://wiki.eclipse.org/Jetty/Reference/jetty-env.xml

Quindi avvolgere l'elemento principale come mostrato in quella pagina in tutto il frammento di I postato e si dovrebbe essere buono.

Ora/che/ha ottenuto la connessione al database da tentare. Quindi ricevevo errori connection refused from 127.0.0.1 in /var/log/auth.log.

Risulta per questo che ho avuto denyhosts in esecuzione, e sicuramente qualcuno aveva messo ALL: 127.0.0.1 in là ... il che significava che le connessioni alla mia macchina locale sono state negate.

Una volta risolto il problema, il servlet può finalmente raggiungere MySQL sul mio server.

Problemi correlati