Optimización de conexiones a sql server

24/05/2010 - 12:26 por Baco | Informe spam
Buenos días,
llevo ya varios meses programando en asp.net (vb) y estoy interesado en
saber cual es la mejor manera de crear las conexiones con la base de datos.
Ante todo me gustaría decir que he estado leyendo bastante información en
Internet pero no termino de dar con la posible solución a mi duda.

Actualmente mis proyectos se basan en una serie de páginas web forms en las
que creo y abro la conexión. Estos web forms hacen uso de una clase repleta
de funciones que también necesitan conectarse a la base de datos.
Pero claro, actualmente, tengo que crear, abrir, cerrar y eliminar la
conexión en cada función, independientemente de que dicha conexión ya esté
abierta en el web form.

Supongo que esta metodología no es la más eficiente. ¿podríais indicarme
como podría optimizar estas conexiones?

Muchas gracias
Un saludo.

Preguntas similare

Leer las respuestas

#1 Alberto Poblacion
24/05/2010 - 21:02 | Informe spam
"Baco" wrote in message
news:uZKpTuy%
Mostrar la cita
Sí, es la más eficiente, o al menos la más recomendable. El pool de
conexiones se encarga de mantener la conexión abierta, de forma que cuando
cualquiera de tus funciones hace un Close, la conexión no se cierra sino que
se devuelve al pool. Cuando se vuelve a abrir en otra función, no se abre
una nueva conexión, sino que se recupera la que había en el pool. De esta
manera se consigue que, cuando la aplicación funciona con múltiples usuarios
y se ejecutan tus funciones desde múltiples hilos, el número total de
conexiones abiertas en cada momento sea el mínimo posible.
#2 Harvey Triana
25/05/2010 - 22:13 | Informe spam
-No es la más eficiente. Lo mismo me pregunte hace algunos años cuando
empecé con C#.

Entiendo que quiere preguntar cómo reducir código para manejar datos. La
respuesta es: Usa una capa de datos. En esta librería de clases pones el
código necesario para conectarte a tu base de datos y devolver resultados, o
ejecutar comandos. Si tu aplicación evoluciona, la interfaz Web no usa el
espacio de nombres System.Data o sus derivados. Francamente no es simple
para un programador medio, pero es la solución efectiva. Por demás,
agregamos la capacidad de respetar las reglas del pool de conexiones. Un
ejemplo sencillo de una aplicación que escribí:

// use Parameters as @_0, @_1, @_2, @_3, ... @_n
public static bool Execute(string _Catalog, string _Sql, params object[]
_Parameters)
{
bool r = false;
try
{
using (SqlConnection cnn = new
SqlConnection(Shared.ConnectionString()))
{
cnn.Open();
SqlCommand cmd = new SqlCommand(_Sql), cnn);
for (int i = 0; i < _Parameters.Length; i++)
{
cmd.Parameters.AddWithValue("_" + i.ToString(),
_Parameters[i]);
}
cmd.ExecuteNonQuery();
r = true;
}
}
catch (Exception E)
{
m_Error = E.Message;
}
return r;
}
"Esta sola función puede reducir miles de líneas de código"

Los objetos que devuelven datos suelen ser más complejos, pero igual, es muy
elegante.

P.S.
Alberto Población tiene razón. Nosotros no tenemos porque administrar las
conexiones, ADO.NET lo hace eficientemente siempre y cuando respetemos sus
reglas. Una programación sencilla (no controlada), puede degenerar en
errores fatales de conexiones copadas. Básicamente se siguen un par de
reglas. Usar la misma cadena de conexión para la aplicación, y segundo usar
para múltiples bases de datos la directiva USE de SQL. De otra parte, ya es
regla muy conocida que debemos usar "using" para usar una conexión.

Sigue esta premisa: "Entre más sabes de C#, menos código escribes."


"Baco" escribió en el mensaje de
noticias:uZKpTuy#
Mostrar la cita
#3 Luis Martinez
25/05/2010 - 23:12 | Informe spam
Lo que tienes que hacer para organizar tu codigo, es crear un clase que
encapsule el codigo de crear, abrir, cerrar y eliminar la conexión. Busca en
red articulos relacionados a la creación de una clase "DataHelper".


Saludos,

Luis Martínez
Caracas-Venezuela

"Alberto Poblacion"
escribió en el mensaje de noticias
news:%23Z9j7O3%
Mostrar la cita
#4 Harvey Triana
27/05/2010 - 22:01 | Informe spam
Si. Evidentemente me falto una transcripción. Disculpas.
SqlCommand cmd = new SqlCommand(Shared.Query(_Catalog, _Sql), cnn);
Donde Shared.Query transforma Sql como "use " + _Catalog + ";" + Sql

¿Ejemplos?
//1 (actualiza o agrega el registro si no existe)
string sql = "if exists (select 1 from Table1 where Field1=@_0 and
Field2=@_1)"
+ " update Table1 set Filed3=@_2 where Field1=@_0 and
Field2=@_1 "
+ "else"
+ " insert into Table1 values(@_0,@_1,@_2)";
DataCommand.Execute("Database1", sql, Field1, Field2, Field3);
//2 (borra un conjunto)
string sql = "delete from Table1 where Field1=@_0 and Field2=@_1)"
DataCommand.Execute("Database1", sql, Field1, Field2);

¿Cuántas lineas necesitaría para esto con System.Data en la interfaz? Muchas.

Salu2.
<Harvey Triana />


"Juan Marcial" wrote:

Mostrar la cita
#5 Juan Marcial
27/05/2010 - 23:57 | Informe spam
Muy interesante Harvey. tiempos sin escribir en un news ¿no?- Hacia falta.

Una pregunta. El parametro _Catalog no veo que hace en la funcion.
¿Podrias darnos un ejemplo?

Gracias
Juan Marcial
Ingeniero de Software


"Harvey Triana" wrote:

Mostrar la cita
Ads by Google
Search Busqueda sugerida