Pool de conexiones en VisualBasic.net y Mysql

Si analizaramos los recursos gastados por la computadora, al momento de ejecutar un query a una base de datos, la mayoría de los recursos se gastan en el momento en que la la aplicación se conecta al gestor que empleamos, si ejecutaramos múltiples conexiones a la ves, dado que tubieramos una aplicación en red por ejemplo, malgastariamos la memoria del servidor, así como la de los clientes y sufririamos por errores de falta de memoria o nuestras consultas de retrasarían, sin embargo el proceso es correcto, conectamos, ejecutamos y finalmente desconectamos, es correcto, pero en algunos casos no es suficiente, una alternativa a estos casos es crear un pool de conexiones, este concepto trabaja de la siguiente manera:

Generamos un grupo de conexiones, cada vez que una acción de la aplicación requiera una conexión a la base de datos, esta tomará una conexión del conjunto que tenemos, una vez que la desocupe, la devolverá al pool. De esta manera no cramos objetos de conexion a cada momento, asi ahorramos memoria de clientes y servidor y mejoramos la velocidad de nuestros querys hacia la base de datos. A continuación realizaremos una pequeña aplicación, donde manejaremos los artículos de computo, software e impresión de una tienda, implementando este concepto de pool de conexiones.

Esta modesta aplicación tendrá la posibilidad de insercción, consulta y modificación de articulos, las herramientas necesarias son las siguientes:


  • VisualBasic.Net 2008 Express Edition

  • Mysql Server 5.0 o superior
En mysql creamos una base de datos con el nombre "dbarticulos", crearemos las tablas marca y articulos, marca con los atributos idmarca, marca y descripcion y artuculos, con idarticulo, idmarca, artículo y descripcion, nuestro enlace será idmarca, asi que será nuestra llave foranea, el escript el es siguiente:

CREATE TABLE `dbarticulos`.`marca` (
`idmarca` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
`marca` VARCHAR(45) NOT NULL,
`descripcion` VARCHAR(45) NOT NULL,
PRIMARY KEY (`idmarca`)
)
ENGINE = InnoDB;

CREATE TABLE `dbarticulos`.`articulo` (
`idarticulo` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
`idmarca` INTEGER UNSIGNED NOT NULL,
`articulo` VARCHAR(45) NOT NULL,
`descripcion` VARCHAR(45) NOT NULL,
PRIMARY KEY (`idarticulo`),
CONSTRAINT `FK_articulo_1` FOREIGN KEY `FK_articulo_1` (`idmarca`)
REFERENCES `marca` (`idmarca`)
ON DELETE RESTRICT
ON UPDATE RESTRICT
)
ENGINE = InnoDB;
Una vez creada la base de datos, insertaremos los siguientes valores en la tabla "marca"


idmarca marca descripcion
------------------------------------------------------
1 HP impresoras y computadoras
2 Microso.. software y computadoras
3 Appl. computadoras
------------------------------------------------------

Creamos un nuevo proyecto en vb.net, una aplicación para Windows, al que llamaremos "polldbarticulos", una vez creado agregaremos una clase a el proyecto, con el nombre "dbpool", luego agregaremos las referencias necesarias en nuestro esplorador, click derecho y elegímos agragar referencia, nos desplegara la siguiente pantalla:



Una ves agregada, vamos hacia la clase dbpool, importamos las librerías de MySql.Data.MySqlClient, posteriormente declaramos una variable de tipo String que será nuestra cadena de conexión y una variable de tipo MysqlConnection, ambas serán estáticas; finalmente declararemos dos metodos, uno sub y otro function, la clase final quedará de la siguiente manera:

Imports MySql.Data.MySqlClient
Public Class dbpool
Private Shared cadena As String = "Server=localhost;
User Id=root;Password=tupassword;Persist Security Info=True;
Database=dbarticulos"

Public Shared con As MySqlConnection
Public Shared Function Open() As MySqlConnection
Try
con = New MySqlConnection(cadena)
con.Open()
Catch ex As Exception
Close(con)
MsgBox("Error" & ex.ToString)
End Try
Return con
End Function
Public Shared Sub Close(ByVal con As MySqlConnection)
If con.State = ConnectionState.Open Then
Try
con.Close()
con = Nothing
Catch ex As Exception
MsgBox("Error" & ex.ToString)
End Try
End If
End Sub
End Class


Notese que en la función Open, creamos las conexiones disponibles y también las abrimos y finalmente las devolvemos para ser utilizadas, en el metodo Close, verificamos si la conexión esta en uso; si es así, la cerramos; si ya esta cerrada la devolvemos al pool; la parte gráfica es sencilla, agregaremos un control de Tabs con 2 pestañas, una de Alta y otra de Consulta, en la parte de Alta quedará de la suguiente manera:


Finalmente en el evento Load del Frame, seleccionaremos todas las marcas de la base de datos, con un elemento MysqlConnection, MysqlCommand, MysqlDataReader y un String para escribir nuestros querys, pero no es como de costrumbre, el siguiente código nos dira la manera correcta:

Imports MySql.Data.MySqlClient
Public Class Form1
Dim con As MySqlConnection
Dim query As String
Dim comando As MySqlCommand
Dim lector As MySqlDataReader
Private Sub Form1_Load(ByVal sender As System.Object,
ByVal e As System.EventArgs) Handles MyBase.Load

Try
query = "select marca from marca"
con = dbpool.Open
comando = New MySqlCommand(query, con)
lector = comando.ExecuteReader
While lector.Read
ComboBox1.Items.Add(lector.GetString(0))
End While
dbpool.Close(con)
Catch ex As Exception
MsgBox(ex.ToString)
Finally
lector.Close()
End Try
End Sub
End Class

Notese que con la lí nea con = dbpoll.Open ya tenemos una conexión del pool automaticamente y con la línea dbpool.Close(con), devolvemos la conexión al conjunto que tenemos de estas, lo demás es lo de siempre, con esto no debemos de tener ningún tipo de problema, una vez que probemos la aplicación, veremos una imagen parecida a esta:


Este es el fin del primer artículo, en el siguiente veremos la inserción de datos. Si quieres pudedes bajar el proyecto hasta este punto para aclarar todas tus dudas aquí.

  1. gravatar

    # by Anónimo - 19 de mayo de 2009, 9:45

    El zip viene con la bd?

  2. gravatar

    # by Slatancrouch - 19 de mayo de 2009, 13:52

    Así es amigo, el zip incluye la bd.

  3. gravatar

    # by Maxi - 3 de junio de 2009, 12:02

    Excelente!
    estoy estudiando VB.net y son pocos los sitios que tienen una explicación tan clara!
    esperamos más...
    Gracias!

  4. gravatar

    # by Julio Adrián - 9 de junio de 2009, 20:42

    Este no es un pool de conexiones. Solo es una clase que encapsula la creación de una conexión.

  5. gravatar

    # by Themexicanshow - 10 de junio de 2009, 9:28

    Bueno, cabe destacar que la estrutura del pool esta bien hecha, sin embrago hace falta el datasource correspondiente para identificar el numero de conexiones disponibles, las que ya no se utilizan, etc, pero eso los puedes configurar al servidor mysql, pero para una aplicación de escritorio, es así como debe ser, por la programación miltihilo que aquí es nesesaria, un 8.8 te pongo, bien hecho...
    esperemas más.