viernes, 25 de mayo de 2012

Ruby y Ubuntu - Trabajar con la versión correcta


Al parecer, no. con seguridad la combinación "No ser experto en Linux", "Ser nuevo en Ruby" es muy peligrosa si quieres programar con Ruby en Linux.

Esta es mi historia.

No sabía que ubuntu tiene por defecto una versión de ruby, en mi caso la 1.8.x. De todas maneras, aún sabiéndolo habría instalado la versión más reciente que para la fecha es la 1.9.3. La instalación fue sencilla:

sudo apt-get ruby

Y empieza el sufrimiento. Ubuntu simplemente no asocia la nueva instalación como el ruby por defecto.

¿Solución?, un enlace simbólico:

 sudo ln -s /usr/bin/ruby1.9.3 /usr/bin/ruby

En el cambio instalé una gema supuestamente recomendada pero que la verdad no sé para qué sirve a ciencia cierta. De todas maneras, ahí va:

sudo apt-get install ruby-dev

Finalmente, se presentó otro problema. IRB, la consola interactica de Ruby tampoco quedó asociada con la nueva versión de ruby. ¿Solución?, así es, enlaces simbólicos:

sudo ln -s /usr/bin/irb1.9.3 /usr/bin/irb

Nota: me di cuenta que irb apuntaba a una versión vieja de ruby porque al intentar usar watir me salía este error:


irb(main):003:0> require 'watir-webdriver'
LoadError: no such file to load -- watir-webdriver
from /usr/lib/ruby/vendor_ruby/1.8/rubygems/custom_require.rb:36:in `gem_original_require'
from /usr/lib/ruby/vendor_ruby/1.8/rubygems/custom_require.rb:36:in `require'
from (irb):3
from :0

IRB estaba accediente a la versión 1.8 (por defecto) de Ubuntu. 

También se puede verificar la versión a la que apunta irb con este comando: 
En IRB: 

puts $:

Muestra algo así: 

/usr/local/lib/site_ruby/1.9.1
/usr/local/lib/site_ruby/1.9.1/x86_64-linux
/usr/local/lib/site_ruby
/usr/lib/ruby/vendor_ruby/1.9.1
/usr/lib/ruby/vendor_ruby/1.9.1/x86_64-linux
/usr/lib/ruby/vendor_ruby
/usr/lib/ruby/1.9.1
/usr/lib/ruby/1.9.1/x86_64-linux
=> nil

Ahora sí, todo listo para trabajar. 

Se preguntará usted, único lector de mi blog, cómo encontré la solución. NO, no busqué por todo linux hasta encontrarla; recuerde que no soy experto en Linux. Después de horas y horas buscando en google llegué a esta solución, que seguramente no es la mejor, pero funcionó y con eso me basta. Igual, no quiero ser experto en linux, solo quería (hace unas 8 horas en total) hacer un pequeño programa en watir... por ahora creo que voy a dormir. 




sábado, 10 de marzo de 2012

Pool de conexiones JDBC en Glassfish

Objetivo: guardar un registro en base de datos desde un Stateless Session Bean utilizando JDBC.

Este es el código al que se quiere llegar:


package com.andres.beans;

import java.sql.Connection;
import java.sql.Statement;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.sql.DataSource;

/**
 * Session Bean implementation class BidManagerBean
 */
@Stateless
@LocalBean
public class BidManagerBean implements BidManager {

@Resource(name = "jdbc/pruebasmysql")
private DataSource datasource;

private Connection connection;

@PostConstruct
public void initialize() {
System.out.println("inicializando recursos de db");
try {
connection = datasource.getConnection();
if (connection == null) {
System.out.println("no se obtuvo la conexion");
}
} catch (Exception e) {
e.printStackTrace();
}
}

/**
* Default constructor.
*/
public BidManagerBean() {
// TODO Auto-generated constructor stub
}

public void addBid() {
System.out.println("agregando bid");
try {
Statement statement = connection.createStatement();
statement.execute("insert into bids values (null, 34)");

} catch (Exception e) {
e.printStackTrace();
}

}
}

Para utilizar el datasource de conexiones es necesario configurar el servidor glassfish.

1. Agregar driver de conexión a mysql
2. Configurar datasource.

1. Agregar driver de conexión a mysql

Antes de agregar el driver, el servidor debe ser detenido.

En algunos sitios he visto que agregar el driver de conexión de mysql en la carpeta lib del directorio de instalación de glassfish. Sin embargo, o por lo menos en mi caso, esto es incorrecto. El driver de conexion debe agregarse a la carpeta ext del dominio. La ruta sería similar a esta:

[directorioInstalacionGlassfish]/domains/domain1/lib/ext

Luego de copiar el jar en esta ruta, se inicia el servidor.

2. Configurar datasource. 

La configuración del datasource se hace desde la consola de administración de Glassfish, que por defecto está en el puerto 4848 (http://localhost:4848/common/index.jsf). Allí se selecciona la opción Resources - JDBC.

Luego, seleccionar JDBC Connection Pools y la opción para crear un nuevo pool de conexiones.


Para este ejemplo el pool queda configurado con los siguientes datos: 
Pool Name: pruebasmysql 
Resource Type: javax.sql.ConnectionPoolDataSource
Database Driver Vendor: MySql

En la siguiente pantalla solo es necesario configurar algunos parámetros: 

User: root
Port: 3306
Password: [password]
URL: jdbc:mysql://localhost:3306/pruebas

Guardar el datasource y hacer ping para verificar que la configuración fue exitosa. 

Luego de esta configuración, se puede probar el código presentado.