2012-08-06 21 views
5

Estoy tratando de hacer algo aparentemente simple: configurar un pequeño grupo de conexiones de base de datos para que un servlet (el único) no cree mi servidor en 1 conexión por segundo.embarcadero mysql conexión de base de datos agrupación

En Ubuntu 10.04, con la última actualización/actualización, estoy usando Eclipse Jetty 8.1.5.v20120716. Estoy intentando conectarme a un servidor MySQL 5.1.

Mi servlet se llama gcm, por lo que en ${jetty}/contexts, tengo este archivo 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> 

Cuando comienzo embarcadero con java -jar start.jar -port=8080, todo empieza bien hasta que intento de golpear la base de datos de mi servlet. La parte código de manejo de la solicitud es el siguiente:

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

El error que consigo es:

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) 

Cómo llegar embarcadero para encontrar el código de base de datos?

Respuesta

0

Trate de añadir esto a 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

Hola Sumit, gracias por responder, pero si pongo eso en un archivo llamado 'web.xml', o en cualquier lugar en mi archivo gcm.xml, me dicen "No se puede alcanzar el objetivo de nodo: iniciado", y " Tipo de configuración desconocida: resource-ref en " –

+0

Se me olvidó mencionar: si toco mi servlet en ese punto, sigo recibiendo el mismo error NameNotFoundException. –

5

En mi caso, fui a la lista de correo embarcadero (https://dev.eclipse.org/mailman/listinfo/jetty-users) para hacer mi pregunta.

Una persona muy inteligente (! Hola enero) escribió y respondió así:

En general, existen muchas maneras diferentes de acheive el mismo resultado en embarcadero, por lo que es probablemente la razón por que he visto diferentes maneras documentado. Generalmente tener opciones es una buena cosa

En caso de que haya cualquier confusión, esta es la página definitiva: http://wiki.eclipse.org/Jetty/Feature/JNDI Si hay algo encuentra, entonces por favor háganoslo saber para que podamos actualizar la página.

Su caso es un poco fuera de lo común en el sentido de que está utilizando características de estilo javaee, pero sin un web.xml. Esto no es algo que he encontrado antes, pero suena como algo que debería agregar a la documentación.

recomendaría (como lo hace la página anterior) que se pone ningún definiciones jndi en un archivo WEB-INF/embarcadero-env.xml y no el archivo XML contexto . Si lo hace, puede hacer lo que hace un elemento web.xml y enlazar su fuente de datos en el espacio de nombres java: comp/env definiendo su recurso y vinculándolo en java: comp/env en el mismo camino (tenga en cuenta que esto NO trabajo en un archivo XML contexto , que debe ser muelle de una env.xml):

Así que haga lo siguiente en WEB-INF/embarcadero-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> 

En la llamada a bindToENC unen el nombre que desea buscar como el sufijo a java: comp/env. Por ejemplo, si desea buscar java: comp/env/my/foo , entonces el argumento bindToENC sería "my/foo".

- Jan Bartel www.webtide.com - Asesoramiento, servicios y soporte del desarrollador del Jetty & expertos de CometD. _______________________________________________ usuarios embarcadero lista de correo [email protected] https://dev.eclipse.org/mailman/listinfo/jetty-users

Ahora, eso no era más que suficiente (yo soy un novato embarcadero). El WEB-INF al que se refería era el WEB-INF dentro del archivo de guerra para mi servlet ... así que extraje el contenido del archivo war en un directorio, y luego pude poner fácilmente el archivo jetty-env.xml en la WEB -INF directorio.

Esto era demasiado crítico:

OK, supone un poco de conocimiento embarcadero allí, y pensé que sabrías que lo que he publicado no era más que un fragmento de lo que se necesita tener para un archivo completo jetty-env.xml.

La página wiki para el archivo de muelle de una env.xml está aquí: http://wiki.eclipse.org/Jetty/Reference/jetty-env.xml

Así que envuelven el elemento raíz, como se muestra en esa página en todo el fragmento I publicado y usted debe ser bueno.

Ahora/eso/se intentó la conexión de la base de datos. Luego recibí errores de connection refused from 127.0.0.1 en /var/log/auth.log.

Resulta que tenía denyhosts en ejecución, y efectivamente alguien había puesto ALL: 127.0.0.1 allí ... lo que significaba que se negaron las conexiones a mi máquina local.

Una vez que se arregló ese detalle, el servlet finalmente puede llegar a MySQL en mi servidor.

Cuestiones relacionadas