Blogroll

lunes 13 de septiembre de 2010

Clase JAVA pool de conexiones para conectar a base de datos MySQL

(Perdón por las sangrías :P)
Bueno, aquí os dejo una clase que implementa el "pool" de conexiones en JAVA y MySQL.
Después de mucho buscar por Google, no encontré ninguna que se adaptara a lo que quería,
así que... Tocó implementarla.
El objetivo de esta clase es no tener que escribir todo el código para la conexión cada vez que se desee hacer una consulta, actualización o inserción, ahorrando la perdida de tiempo de ejecución que supone el abrir y cerrar conexiones.
Antes de utilizar esta clase, es necesario indicar en el constructor de la clase la dirección del servidor, la base de datos a la que conectar, el nombre de usuario para el acceso y la contraseña del mismo.(Se indica en rojo y mayúsculas).
Sé que en teoría debería cerrar y abrir la conexión en cada llamada a la base de datos, pero estuve probando con un servidor muy antiguo y perdía muchísimo tiempo en eso, de todas formas os dejo un método para cerrar la conexión cuando os plazca.

/////////////EJEMPLO DE USO/////////////////////
import java.sql.ResultSet;
import java.sql.SQLException;
...
try {
ResultSet rs = null;
String SQL = "SELECT dni FROM tabla";
rs = mysql.dameQuery(SQL); //Para UPDATE o INSERT mysql.dameUpdate(SQL);
while(rs.next()) {
dni = rs.getString("dni");
...
}
mysql.cierra(); //Esta función no cierra la conexion sino el Statement
//para cerrar la conexión: mysql.cierraConexion();
} catch (SQLException e) {
System.out.println("SQL Exception: "+ e.toString());
}
...

/////////////FIN EJEMPLO DE USO/////////////////////

/////////////CODIGO DE LA CLASE//////////////////
package TUPACKAGE;
/**
* http://fernandoris.blogspot.com
* @author Fernando Rodríguez-Izquierdo Serrano
*/
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.ResultSet;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.commons.dbcp.BasicDataSource;


public class mysql {
private static Connection connection = null;
private static Statement statement = null;
private static ResultSet resultSet = null;
private static mysql instance = null;
private static BasicDataSource basicDataSource = null;


mysql() throws SQLException{

/**
* Constructor de la clase
* se debe configurar el servidor,
* la base de datos, contraseña, usuario y password
*/
mysql.basicDataSource = new BasicDataSource();
mysql.basicDataSource.setUrl("jdbc:mysql://SERVIDOR/BASEdeDATOS?" +
"user=USUARIO&password=CONTRASEÑA&zeroDateTimeBehavior=convertToNull");
mysql.basicDataSource.setDriverClassName("com.mysql.jdbc.Driver");
mysql.connection = mysql.basicDataSource.getConnection();
}

public static ResultSet dameQuery(String query){

/**
* Esta función devuelve un ResultSet con los resultados
* de la consulta que se le pase por parametro. Solo es usada
* para SELECT
* Ej.: ResultSet s = mysql.dameQuery("SELECT * FROM tabla");
*/
try {
mysql.statement = mysql.connection.createStatement();
mysql.resultSet = mysql.statement.executeQuery(query);
} catch (SQLException ex) {
Logger.getLogger(mysql.class.getName()).log(Level.SEVERE, null, ex);
}finally{
return mysql.resultSet;
}
}

public static ResultSet dameUpdate(String query) throws SQLException{

/**
* Función para hacer UPDATE e INSERT
* devuelve ResultSet con las id's generadas por un INSERT
* Ej.: ResultSet s = mysql.dameUpdate("INSERT INTO socios (fila1) VALUES ('"+valor1+"')");
*/
int i=0;
try {
mysql.statement = mysql.connection.createStatement();
i = mysql.statement.executeUpdate(query);
} catch (SQLException ex) {
Logger.getLogger(mysql.class.getName()).log(Level.SEVERE, null, ex);
}finally{
//Devuelve las id's generadas si hay
return mysql.statement.getGeneratedKeys();
}
}

public static void cierra() throws SQLException{
mysql.statement.close();
}

public static void cierraConexion() throws SQLException{
mysql.connection.close();
}

public static Connection getConnection(){
return mysql.connection;
}

}

/////////////FIN CODIGO DE LA CLASE//////////////////

lunes 14 de junio de 2010

COMO configurar mi servidor MySQL para acceder desde fuera de mi red

Bien, como el título de este post indica, voy a enseñaros ha desbloquear vuestro servidor de mysql, para que sea acesible desde el exterior de la red, doméstica o de oficina. Hemos de tener en cuenta que para acceder a cualquier recurso de nuestra máquina desde una dirección externa a nuestra red local, es necesario que tengamos una dirección ip fija, podeis contratarla con vuestro ISP (Internet Service Provider, vamos telefonica, jazztel o la que sea que os de el servicio de internet) o usar el programa "no-ip" http://www.no-ip.com/
Hay tres cosas que debemos tener en cuenta:

La configuración del servidor.
El puerto de la conexión.
El usuario que accederá desde el exterior.

Voy a dar por hecho que teneis ubuntu, un servidor de mysql y un phpmyadmin u otro gestor de bases de datos.

Para configurar el servidor lo primero que debeis hacer es abrir el archivo de configuración de mysql, con permisos de super usuario para poder escribir en él.

sudo gedit /etc/mysql/my.cnf


Una vez abierto debeis buscar las siguientes linea y comentarla (añadir # al inicio de la linea)

bind-address = 127.0.0.1


Una vez comentada la linea quedaría de la siguiene forma

#bind-address = 127.0.0.1


Guardamos los cambios, cerramos el archivo y ejecutamos el siguiente comando para resetear el servidor mysql y que los cambios tengan efecto.

sudo /etc/init.d/mysql restart


La configuración de nuestro servidor ya admite conexiones externas, pero esto no es suficiente ya que debemos decirle a nuestro router, que las conexiones al puerto 3306 (puerto por defecto de mysql) vayan a la máquina donde dicho servidor está alojado. Dicho paso depende del modelo de router que tengais, pero buscando por la red encontrareis como abrir los puertos de vuestro router.
Aquí os dejo un post que he encontrado y os puede servir de guía. http://hackrevolution.mforos.com/1312900/7062554-listado-de-routers-tutorial-abrir-puertos/

Bueno ahora solo nos queda agregar un usuario a nuestro servidor de bases de datos mysql, que tenga permitido realizar conexiones desde cualquier dirección ip, lo explicaré con phpmyadmin porque considero que es lo más extendido actualmente.
Accedemos a nuestro phpmyadmin con nuestra cuenta de root, pulsamos sobre "privilegios", y posteriormente "Agregar un nuevo usuario". Aparecerá ante vosotros un formulario en el cual introducir los datos del nuevo usuario, nombre de usuario, contraseña ... tened en cuenta que en la pestaña donde pone "servidor" debeis elegir "Cualquier servidor". Posteriormente seleccionais la base de datos a la que quereis que este usuario tenga acceso y listos. Ya podeis acceder a vuestras bases de datos desde cualquier pc o aplicación.

Espero que os haya servido de ayuda XD Saludos a tod@s.

viernes 21 de mayo de 2010

Diccionario de nombres con sexo en CSV y SQL

Uno de los problemas con el que un programador puede encontrarse, es decidir el género de una persona (masculino/femenio) a partir del nombre de la misma.
Pongamos el caso de que una empresa, ha estado recopilando datos de sus clientes durante años, sin tener en cuenta el sexo de los mismos. Pasados unos años recopilando información, por cualquier motivo, (normalmente análisis estadísticos) deciden que les sería útil conocer el sexo de sus clientes. Imaginemos que dicha empresa tiene una base de datos con 3 millones de clientes.
Es evidente que no es viable realizar un script o programa que decida el género de una persona dependiendo del nombre de la misma, ya que para que fuera medio fiable deberíamos implementar una RNA, entrenarla, hacer pruebas ... es un trabajo costoso en tiempo.
Obviamente tampoco parece la mejor opción realizar esta tarea registro por registro ya que el coste en tiempo también sería demasiado alto, por no hablar del pobrecito al que le asignen dicha tarea, que se puede morir del asco.
Bien, lo más lógico, al menos para mi, sería tener un diccionario de nombres propios el cual indique si tal o cual nombre corresponde al género masculino o femenino. Además dicho diccionario debe estar en un formato fácil de manejar por un programa informático.
Yo me encontré con ese problema y después de inspeccionar la red en busca de dicho diccionario, nunca lo encontré, por lo que me fabriqué el mio propio. Tengo que decir que no es muy extenso, contiene 2600 nombres aproximadamente, por lo que es posible que os encontréis que algunos de los que necesitéis no estén aquí contenidos, pero menos da una piedra ¿no? :P
He decidido colgarlo en formato CSV ya que es un tipo de archivo muy fácil de exportar a cualquier base de datos o formato que necesitéis.
También lo dejo en sql para el que le resulte más fácil.
El carácter de separación de campos es ";" un 0 representa género femenino y un 1 lo contrario.
Espero que os sea útil XD. Saludos.

Descárgalo aquí en CSV

Descárgalo aquí en SQL


.

miércoles 12 de mayo de 2010

PHP - Clase para conexión a bases de datos

Aquí os dejo una clase para conectar a bases de datos MySQL, con el patrón de diseño singleton implementado. Es decir, solo existirá una instacia de dicha clase por muchos objetos que se creen.
Suele resultar útil sobretodo si eres de los que olvidas cerrar las sesiones y esas cosas.

¿Cómo utilizar?

//EJEMPLO DE USO
$db = db::getInstancia(SERVIDOR,USUARIO,CONTRASEÑA,BASE_DE_DATOS);
$arrayResultados = $db->dameQuery("SELECT nombre,apellidos FROM usuarios");
while(list($nombre,$apellidos)=mysql_fetch_array($arrayResultados)){
//Tratamiento de datos
echo("Nombre: $nombre Apellidos: $apellidos");
}

CÓDIGO DE LA CLASE


//Author: Fernando Rodríguez-Izquierdo Serrano

class db{
static private $instancia = NULL;
private $servidor;
private $usuario;
private $password;
private $basedatos;
private $conexion;

public function __construct($servidor,$usuario,$password,$basedatos){
$this->servidor = $servidor;
$this->usuario = $usuario;
$this->password = $password;
$this->basedatos = $basedatos;
}
//Función de conexión
private function conectar(){
$this->conexion = mysql_connect($this->servidor,$this->usuario,$this->password) or DIE(mysql_error());
mysql_select_db($this->basedatos, $this->conexion);
}

private function desconectar(){
mysql_close($this->conexion);
}

public function dameQuery($query){
$this->conectar();
$res = mysql_query($query) or die (mysql_error());
$this->desconectar();
return $res;
}

public function dameQuerySinCerrar($query){
$this->conectar();
$res = mysql_query($query) or die (mysql_error());
return $res;
}

public function dameQuerySinAbrir($query){

$res = mysql_query($query) or die (mysql_error());
$this->desconectar();
return $res;
}

static public function getInstancia($servidor,$usuario,$password,$basedatos) {
if (self::$instancia == NULL) {
self::$instancia = new db($servidor,$usuario,$password,$basedatos);
}
return self::$instancia;
}

}
?>

jueves 5 de marzo de 2009

Claves para jugar al Day of Tentacle (ensalda)


Bueno, como soy muy friki y todo el mundo lo sabe. Tengo aquí una información que no he de perder nunca. Las claves para poder jugar al Day Of Tentacle, uno de mis juegos favoritos de los que ya no se hacen.
Aquí os las dejo.

martes 30 de septiembre de 2008

Gana dinero desde casa

Por favor pierde 5 minutos de tu vida en leer esto, quizás te sirva de algo.

Les presento “es-fácil”, una empresa que os paga solo por clickear en los banners de los correos promocionales que mandarán a tu cuenta de correo. El dinero viene de las empresas (ebay,bailys,cacique… entre otras) que quieren promocionarse y le pagan la campaña de e-mails a es-fácil y esta última te paga un porcentaje a ti por ser su público objetivo. De esta manera todos ganan, la empresa anunciante hace llegar su publicidad, “es-fácil” se queda un porcentaje y tú ganas otro (más pequeño, todo sea dicho).


ENLACE!!!!

Por cada correo leído, ganarás 3 céntimos. Pensarás que es poco, pero aquí viene lo bueno, por cada correo que lea un amigo referido por ti, tu ganas un céntimo, y por los amigos de tus amigos, hasta cinco niveles. ¿Te sigue pareciendo poco?

Haz cuentas … Digamos que te apuntas y que la media de correos mensuales es de 20 correos. Ya has ganado 60 céntimos, muy poco ¿Verdad?. Pongamos el caso de que haces 10 amigos (nivel 2) 20 correos x 10 amigos a 1 céntimo por correo …2€ mas los 60 que habías ganado 2′60€ . Sigamos la cadena completa….

Apúntate —-> http://www.es-facil.com/ganar/alta?Id=64155919

(nivel 1) Tu…………………………………………………………………………………….0′60€

(nivel 2) 10 amigos…………………………………………………………………………..2′00€

(nivel 3) Cada amigo del nivel anterior hace 10 amigos. 100 amigos……………20,00€

(nivel 4) Cada amigo del nivel anterior hace 10 amigos. 1000 amigos…………200,00€

(nivel 5) Cada amigo del nivel anterior hace 10 amigos. 10000 amigos……..2000,00€

____________________________________________________________________________________

Total ganado en un mes ………………………………………………………………2222′60€

Evidentemente no todo es color de rosas, para poder cobrar necesitas tener un mínimo acumulado de 60€. Mucha gente desiste antes de llegar al primer cobro ya que no buscan amigos y por 60€ cada 10 meses no son capaces de ver publicidad en sus bandejas de entrada. Lo que quiere decir, que muchos de tus referidos se darán por vencidos y dejarán de generarte ingresos. Por lo que la cantidad que ganarás mensualmente no es fija, depende de tu capacidad para dar a conocer este servicio. Tampoco la cantidad de e-mails que te manden será fija, dependerá de el número de promociones que ese mes lleguen, puede que un mes te lleguen 20 correos y al mes siguiente solo 10.

Apúntate —-> http://www.es-facil.com/ganar/alta?Id=64155919

Si has llegado hasta aquí y todavía tienes dudas puedes escribirme a nandosevillano@hotmail.com . Os agradecería mucho que si decidís apuntaros lo hagais a través del enlace que aquí se muestra, ya que así me ayudais a mi. Mucha suerte a tod@s.

Comprobado que pagan!!!