jueves, 16 de octubre de 2008

ICEfaces + Managed Bean + EJB 3.0 + Pool Conexiones + Netbeans

Les dejo un video que he realize como parte del ramo Proyecto de Software en el que hay que desarrollar una aplicación empresarial sobre la plataforma de java enterprise (jee).

Basicamente el video es como un minitutorial de como desarrollar una Enterprise Application

El proyecto desarrollado por mi grupo tiene las siguiente caracteristicas.
  • Uso del framework ICEfaces en la capa web
  • Uso de EJB 3.0 en la capa de negocios
  • Uso de un Pool de conexiones para la base de datos.
Este mini tutorial abarca:
  • Como integrar ICEFACES en Netbeans
  • Crear una Enterprise Application e integrarle el framework ICEfaces
  • Crear un pool de conexiones (conexion.java) y hacer uso de él desde un EJB (capa de negocio)
  • Crear un Managed Bean (en la capa web) que se comunique con el EJB.
  • Hacer uso del managed bean desde un JSP.
Les dejo también el codigo de la clase conexion, a esta clase le deben cambiar el nombre del JNDI y el nombre del metodo que les generara Netbeans al momento de crear el pool de conexiones, como se muestre en el video.




ICEfaces + EJB 3.0 + Pool Conexiones + JEE



package genericos;


import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

public class Conexion {


Connection conn = null;
ResultSet rs = null;

public Conexion(){
}

public void conectar(){
Context c = null;
Context envCtx = null;
DataSource ds = null;

Statement stmt=null;
String sql="";
String resultado="";

try {
ds=this.getConexionBD();
conn = ds.getConnection();
if(conn== null)
System.out.println("ConexionNula");


} catch (NamingException ex) {
ex.printStackTrace();
Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE, null, ex);
}
catch (SQLException ex) {
ex.printStackTrace();
Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE, null, ex);
}


}
public Object ejecutaSql( String sql )
{

Statement stmt =null;
conectar();
int irs = 0;
try
{
stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATABLE);
if( sql.startsWith( "select" ) )
{
rs = stmt.executeQuery( sql );
//System.out.println( "xq rs: " + rs );
}
else if( sql.startsWith( "delete" ) || sql.startsWith( "insert" ) )
{
irs = stmt.executeUpdate( sql );
//rs = stmt.getGeneratedKeys();
}
else if( sql.startsWith( "update" ) )
{
irs = stmt.executeUpdate( sql );
}
}
catch( Exception e ) {

e.printStackTrace();
//throw e;
return e.toString();
}

return rs;
}

@SuppressWarnings("empty-statement")
public void close(){
if (rs != null) {
try { rs.close(); } catch (SQLException e) { ; }
rs = null;
}
if (conn != null) {
try { conn.close(); } catch (SQLException e) { ; }
conn = null;
}

}

private DataSource getConexionBD() throws NamingException {
Context c = new InitialContext();
return (DataSource) c.lookup("dataSource");
}
}

1 comentario:

Anónimo dijo...

Amigo tienes que tener cuidado al ocupar el pool de conexiones, en el metodo cerrar realmente no estas cerrando nada, y las conexiones se quedaran abiertas, aunque eso lo arreglas con una buena configuracion de tu archivo context.xml. Por otra parte te recomendaria cambiar la sentencia para insertar, uy reemplazarlo con un executeQuery, ya que puedes retornar automaticamente el id del ulitmo objeto que se inserto, agregando al final de la consulta "returning id_tabla" y te devolverá un ResultSet que te permite obtener el id, util cuando tienees una bd preparada para muchas transacciones simultaneas.

Felipe.