Foros del Web » Programación para mayores de 30 ;) » Java »

DataSource con java EE6, netbeans 6.8 y glassfish v3

Estas en el tema de DataSource con java EE6, netbeans 6.8 y glassfish v3 en el foro de Java en Foros del Web. Bueno, comento el problema que tengo: Estoy intentando accesar al pool de conexiones que se genera en el glassfish desde una clase en java pero ...
  #1 (permalink)  
Antiguo 17/08/2010, 12:44
 
Fecha de Ingreso: agosto-2010
Mensajes: 7
Antigüedad: 13 años, 8 meses
Puntos: 0
DataSource con java EE6, netbeans 6.8 y glassfish v3

Bueno, comento el problema que tengo:
Estoy intentando accesar al pool de conexiones que se genera en el glassfish desde una clase en java pero no puedo, ya verifique que desde el glassfish si se realice la conexion. Esta en un proyecto Java Web.
Coloco el codigo de la clase para que vean que esta correcto


Código C++:
Ver original
  1. package conexion;
  2.  
  3. import java.sql.Connection;
  4. import java.sql.ResultSet;
  5. import java.sql.Statement;
  6. import javax.sql.DataSource;
  7. import javax.naming.Context;
  8. import javax.naming.InitialContext;
  9. import javax.naming.NamingException;
  10.  
  11. public class conexion
  12. {
  13.     public String datos()
  14.     {
  15.         try
  16.         {
  17.             DataSource ds = getConexion();
  18.             Connection con = ds.getConnection();
  19.             Statement st = con.createStatement();
  20.             String nombres = "";
  21.             ResultSet rs = st.executeQuery("select * from usuarios");
  22.             while (rs.next())
  23.             {
  24.                 nombres += rs.getString(1) + " " + rs.getString(2) + ",";
  25.             }
  26.             System.out.println(nombres);
  27.             return nombres;
  28.         }
  29.         catch(Exception e)
  30.         {
  31.             System.out.println(e);
  32.         }
  33.         return "no funciono";
  34.     }
  35.  
  36.  
  37.     private DataSource getConexion() throws NamingException {
  38.         Context c = new InitialContext();
  39.         return (DataSource) c.lookup("java:comp/env/conexionPruebas");
  40.     }
  41. }


Si no estoy mal conexionPruebasss deberia ser el nombre de mi jndi que se muestra en el glassfish en el apartado de recursos JDBC, el cual esta igual.

Me di cuenta de que no entra en try de la funcion datos() y pasa al catch enviandome en pantalla lo siguiente

javax.naming.NamingException: Lookup failed for 'java:comp/env/conexionPruebas' in SerialContext [Root exception is javax.naming.NameNotFoundException: No object bound to name java:comp/env/conexionPruebas]


Pero no encuentro cual es el problema.

Por cierto he hecho este mismo ejemplo sin cambiar nada, pero con la version de java EE5 y funciona bien pero con java EE6 nop, ademas de que el servidor es el mismo glassfish v3.

Si pudieran darme una ayudada... estaria muy agradecido.
  #2 (permalink)  
Antiguo 18/08/2010, 12:08
 
Fecha de Ingreso: enero-2008
Mensajes: 197
Antigüedad: 16 años, 3 meses
Puntos: 10
Respuesta: DataSource con java EE6, netbeans 6.8 y glassfish v3

Mmmm que raro que estés tratando de acceder un Datasource a la "old school", por qué no mejor usas Spring o Hibernate para acceder a tu recurso.

En Spring sería algo así:

Código XML:
Ver original
  1. <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean" scope="singleton">
  2.  
  3. <property name="jndiName" value="/jdbc/YourDataSource" />
  4. <property name="resourceRef" value="true" />
  5. </bean>

Con Hibernate :

Código Properties:
Ver original
  1. hibernate.connection.datasource = java:/comp/env/jdbc/yourDataSource
  2. hibernate.transaction.factory_class =     org.hibernate.transaction.JTATransactionFactory
  3. hibernate.transaction.manager_lookup_class =     org.hibernate.transaction.JBossTransactionManagerLookup
  4. hibernate.dialect = org.hibernate.dialect.YourDBDialect

La ventaja es que usarías un ORM en lugar de manejar la capa de datos a manita ya que es mucho trabajo!!!!

Saludos!
  #3 (permalink)  
Antiguo 18/08/2010, 15:22
 
Fecha de Ingreso: agosto-2010
Mensajes: 7
Antigüedad: 13 años, 8 meses
Puntos: 0
Respuesta: DataSource con java EE6, netbeans 6.8 y glassfish v3

No habia checado esas opciones ya que pensaba solo hacer la conexion y crear una clase donde se manejaran las consultas, creyendo que no era necesario la utilizacion de algun otro framework. Pero aun asi checare los frameworks que me dics y vere con cual se me es más comodo trabajar. Aunque sigo pensando el porque en java ee 5 si funciona y en 6 no.
  #4 (permalink)  
Antiguo 18/08/2010, 15:37
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Respuesta: DataSource con java EE6, netbeans 6.8 y glassfish v3

No entiendo lo de probar con Java EE5 o Java EE 6 con el mismo servidor de aplicaciones ya que es el servidor de aplicaciones el que implementa la especificación, pero de todas formas lo que dice el error es que ha habido algun problema al publicar el DataSource por JNDI y no está en la dirección que esperas. De Java EE5 a Java EE6 hubo cambios en la forma de crear los DataSources, así que puede que el problema sea ese.

No uso GlassFish, así que no te puedo decir mucho más sobre como crear los datasources en ese servidor o como comprobar si estan bien publicados.

Suerte.
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
  #5 (permalink)  
Antiguo 18/08/2010, 15:47
 
Fecha de Ingreso: agosto-2010
Mensajes: 7
Antigüedad: 13 años, 8 meses
Puntos: 0
Respuesta: DataSource con java EE6, netbeans 6.8 y glassfish v3

En el glassfish al montar el war se generan bien lo que es el pool de conexiones, el jndi y no tiene problemas al hacer ping a la base de datos, entonces donde creo que esta el error es en esta linea:

Código JAVA:
Ver original
  1. return (DataSource) c.lookup("java:comp/env/conexionPruebas");

Voy a checar si cambio la especificacion para esto o es problema del glassfish

Gracias a todos por la ayuda
  #6 (permalink)  
Antiguo 19/08/2010, 09:24
 
Fecha de Ingreso: agosto-2010
Mensajes: 7
Antigüedad: 13 años, 8 meses
Puntos: 0
Respuesta: DataSource con java EE6, netbeans 6.8 y glassfish v3

Hola que tal, bueno buscando en san gugle encontre la nueva especificacion de los datasource y la he implementado, ya no marca problemas con javax.naming.NamingException pero ahora me envia un java.lang.NullPointerException del catch

Código JAVA:
Ver original
  1. package conexion;
  2.  
  3. import java.sql.Connection;
  4. import java.sql.ResultSet;
  5. import java.sql.Statement;
  6. import javax.annotation.Resource;
  7. import javax.annotation.sql.*;
  8. import javax.ejb.Stateless;
  9. import javax.sql.DataSource;
  10.  
  11.  
  12. @DataSourceDefinition(name = "java:comp/env/jdbc/pruebas",
  13. className = "org.postgresql.Driver",
  14. user = "postgres",
  15. password = "12345",
  16. databaseName = "Pruebas",
  17. serverName = "localhost")
  18.  
  19. @Stateless
  20. public class conexion
  21. {
  22.     @Resource(lookup = "java:comp/env/jdbc/pruebas")
  23.     private DataSource ds;
  24.  
  25.     public String consulta()
  26.     {
  27.         String nombre = "";
  28.         try
  29.         {
  30.             Connection con=ds.getConnection();
  31.             Statement st = con.createStatement();
  32.             ResultSet rs = st.executeQuery("SELECT * FROM usuarios");
  33.  
  34.             while(rs.next())
  35.             {
  36.                 nombre += rs.getString(1) + " " + rs.getString(2) + " " + rs.getString(3) + " " + rs.getString(4) + ",";
  37.             }
  38.             con.close();
  39.             return nombre;
  40.         }
  41.         catch(Exception e)
  42.         {
  43.             return e.toString();
  44.         }
  45.     }
  46. }

No encuentro que sera esta vez pero presiento que estoy más cerca de conseguirlo. Cualquier ayuda, comentario o sape por algun error sintactico es bienvenido y agradecido.
  #7 (permalink)  
Antiguo 19/08/2010, 12:31
 
Fecha de Ingreso: enero-2008
Mensajes: 197
Antigüedad: 16 años, 3 meses
Puntos: 10
Respuesta: DataSource con java EE6, netbeans 6.8 y glassfish v3

Lo que se ve bastante raro es la parte de catch, no estás manejando bien la exception y estás perdiendo precisamente el stacktrace que te indica cuál es el error.

En mi opinión deberías quitar ese return y manejar la exception con un Logger:


Te recomiendo usar un Logger para manejar correctamente los logs de tu app

Descarga Log4J es muy sencillo de usar, solamente descarga el JAR y agrega el (los) jars a tu app y Configúralo.

Para configurarlo sólo tines que agregar este archivo a tu raiz donde está tu código.

log4j.properties (debe ir en tu raíz de tu source package)


Código properties:
Ver original
  1. # Direct log messages to standard output
  2. # --------------------------------------
  3. log4j.appender.stdout=org.apache.log4j.ConsoleAppender
  4. log4j.appender.stdout.Target=System.out
  5. log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
  6. log4j.appender.stdout.layout.ConversionPattern=%d [%t] %-5p %c{1}:%L - %m%n
  7.  
  8. # Direct messages to file
  9. # -----------------------
  10. log4j.appender.file=org.apache.log4j.FileAppender
  11. log4j.appender.file.File=/apps/logs/tu-app.log
  12. log4j.appender.file.layout=org.apache.log4j.PatternLayout
  13. log4j.appender.file.layout.ConversionPattern=%d [%t] %-5p %c{1}:%L - %m%n
  14.  
  15. # Set log levels - for more verbose logging change 'info' to 'debug'
  16. # ------------------------------------------------------------------
  17. log4j.rootLogger=DEBUG, stdout, file
  18.  
  19. # Applies for all the application
  20. # -------------------------------
  21. log4j.logger.com.tu.paquete=DEBUG


y agrega esto a tu clase:


Código Java:
Ver original
  1. import org.apache.log4j.Logger;
  2.  
  3. private static final Logger LOG = Logger.getLogger(TuClase.class);
  4.  
  5. y para logear la exception usa:
  6.  
  7. LOG.error(e.getMessage(), e );

ah y es mala práctica cachar Exception, deberías cachar una exception más específica para poder actuar en consecuencia.

Sé que no exactamente respondo tu pregunta pero te puede ayudar a debuggear mejor y diagnosticar cuál es el problema.
  #8 (permalink)  
Antiguo 19/08/2010, 17:19
 
Fecha de Ingreso: agosto-2010
Mensajes: 7
Antigüedad: 13 años, 8 meses
Puntos: 0
Respuesta: DataSource con java EE6, netbeans 6.8 y glassfish v3

Vale, gracias por la ayuda y ya puse en practica el log4j, me envia esto en la terminal:

Código Terminal:
Ver original
  1. ADVERTENCIA: StandardWrapperValve[peticion]: PWC1406: Servlet.service() for servlet peticion threw exception
  2. java.lang.NullPointerException
  3.         at conexion.conexion.consulta(conexion.java:34)
  4.         at peticion.peticion.processRequest(peticion.java:33)
  5.         at peticion.peticion.doPost(peticion.java:59)
  6.         at javax.servlet.http.HttpServlet.service(HttpServlet.java:754)
  7.         at javax.servlet.http.HttpServlet.service(HttpServlet.java:847)
  8.         at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1523)
  9.         at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:279)
  10.         at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:188)
  11.         at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:641)
  12.         at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:97)
  13.         at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:85)
  14.         at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:185)
  15.         at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:325)
  16.         at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:226)
  17.         at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:165)
  18.         at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:791)
  19.         at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:693)
  20.         at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:954)
  21.         at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:170)
  22.         at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:135)
  23.         at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:102)
  24.         at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:88)
  25.         at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:76)
  26.         at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:53)
  27.         at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:57)
  28.         at com.sun.grizzly.ContextTask.run(ContextTask.java:69)
  29.         at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:330)
  30.         at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:309)
  31.         at java.lang.Thread.run(Thread.java:619)

y asi quedo el codigo con el log4j implementado

Código Java:
Ver original
  1. package conexion;
  2.  
  3. import java.sql.Connection;
  4. import java.sql.ResultSet;
  5. import java.sql.SQLException;
  6. import java.sql.Statement;
  7. import javax.annotation.Resource;
  8. import javax.sql.DataSource;
  9. import org.apache.log4j.Logger;
  10.  
  11. public class conexion
  12. {
  13.     @Resource(lookup = "java:comp/env/pruebas")
  14.     private DataSource ds;
  15.  
  16.     private static final Logger LOG = Logger.getLogger(conexion.class);
  17.  
  18.     public String consulta()
  19.     {
  20.         String nombre = "";
  21.        
  22.         try
  23.         {
  24.             Connection con=ds.getConnection();
  25.             Statement st = con.createStatement();
  26.             ResultSet rs = st.executeQuery("SELECT * FROM usuarios");
  27.  
  28.             while(rs.next())
  29.             {
  30.                 nombre += rs.getString(1) + " " + rs.getString(2) + " " + rs.getString(3) + " " + rs.getString(4) + ",";
  31.             }
  32.             con.close();
  33.             return nombre;
  34.         }
  35.         catch(SQLException e)
  36.         {
  37.             LOG.error(e.getMessage(), e);
  38.         }
  39.         return null;
  40.     }
  41. }

Creo me voy a dar por vencido para el proyecto con java EE6 y lo voy hacer con java EE5 el cual no me da ningun problema con el datasource y seguire intentando con java EE6 ver que es lo que pasa.
  #9 (permalink)  
Antiguo 20/08/2010, 05:16
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Respuesta: DataSource con java EE6, netbeans 6.8 y glassfish v3

El código y el stacktrace no pegan, ya que segun los datos, el NullPointer se produciría en una linea que sólo contiene una llave. Algo no cuadra.
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
  #10 (permalink)  
Antiguo 20/08/2010, 08:04
 
Fecha de Ingreso: agosto-2010
Mensajes: 7
Antigüedad: 13 años, 8 meses
Puntos: 0
Respuesta: DataSource con java EE6, netbeans 6.8 y glassfish v3

Bueno, no habiendo ni como hacer me he decidido empezar a trabajar con java ee5 para no atrasar el trabajo, gracias a hualro y GreenEyed por la ayuda y los consejos de programación, vale que se puede dar por cerrado este tema... aunque si doy con la solucion la posteare.
  #11 (permalink)  
Antiguo 20/08/2010, 08:14
 
Fecha de Ingreso: agosto-2010
Mensajes: 7
Antigüedad: 13 años, 8 meses
Puntos: 0
Respuesta: DataSource con java EE6, netbeans 6.8 y glassfish v3

Bueno, no habiendo ni como hacer me he decidido empezar a trabajar con java ee5 para no atrasar el trabajo, gracias a hualro y GreenEyed por la ayuda y los consejos de programación, vale que se puede dar por cerrado este tema... aunque si doy con la solucion la posteare.
  #12 (permalink)  
Antiguo 30/09/2010, 09:22
 
Fecha de Ingreso: septiembre-2010
Mensajes: 2
Antigüedad: 13 años, 6 meses
Puntos: 0
Respuesta: DataSource con java EE6, netbeans 6.8 y glassfish v3

Hola que tal, despues de un tiempo y liberada la version 6.9.1 de netbeans, al parecer corrigieron el problema que se venia dando con la generacion del DataSource por lo que ya se puede generar de la siguiente forma:

Código C++:
Ver original
  1. private DataSource getConexionPoolPrueba() throws NamingException {
  2.         Context c = new InitialContext();
  3.         return (DataSource) c.lookup("java:comp/env/conexionPoolPrueba");
  4.     }

Y sin mayor problema se realiza la petición de conexión. Con lo que queda resuelto este problema.

Etiquetas: datasource, glassfish, netbeans
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:29.