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%
[...]
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.



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.
Respuesta Responder a este mensaje
#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#
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.
Respuesta Responder a este mensaje
#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%
"Baco" wrote in message
news:uZKpTuy%
[...]
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.



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.

Respuesta Responder a este mensaje
#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:


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:

> -No es la ms eficiente. Lo mismo me pregunte hace algunos aos cuando
> empec con C#.
>
> Entiendo que quiere preguntar cmo reducir cdigo para manejar datos. La
> respuesta es: Usa una capa de datos. En esta librera de clases pones el
> cdigo necesario para conectarte a tu base de datos y devolver resultados, o
> ejecutar comandos. Si tu aplicacin 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 solucin efectiva. Por dems,
> agregamos la capacidad de respetar las reglas del pool de conexiones. Un
> ejemplo sencillo de una aplicacin 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 funcin puede reducir miles de lneas de cdigo"
>
> Los objetos que devuelven datos suelen ser ms complejos, pero igual, es muy
> elegante.
>
> P.S.
> Alberto Poblacin tiene razn. Nosotros no tenemos porque administrar las
> conexiones, ADO.NET lo hace eficientemente siempre y cuando respetemos sus
> reglas. Una programacin sencilla (no controlada), puede degenerar en
> errores fatales de conexiones copadas. Bsicamente se siguen un par de
> reglas. Usar la misma cadena de conexin para la aplicacin, y segundo usar
> para mltiples bases de datos la directiva USE de SQL. De otra parte, ya es
> regla muy conocida que debemos usar "using" para usar una conexin.
>
> Sigue esta premisa: "Entre ms sabes de C#, menos cdigo escribes."
>
>
> "Baco" escribi en el mensaje de
> noticias:uZKpTuy#
> > Buenos das,
> > 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 gustara decir que he estado leyendo bastante
> > informacin en Internet pero no termino de dar con la posible solucin a
> > mi duda.
> >
> > Actualmente mis proyectos se basan en una serie de pginas web forms en
> > las que creo y abro la conexin. Estos web forms hacen uso de una clase
> > repleta de funciones que tambin necesitan conectarse a la base de datos.
> > Pero claro, actualmente, tengo que crear, abrir, cerrar y eliminar la
> > conexin en cada funcin, independientemente de que dicha conexin ya est
> > abierta en el web form.
> >
> > Supongo que esta metodologa no es la ms eficiente. podrais indicarme
> > como podra optimizar estas conexiones?
> >
> > Muchas gracias
> > Un saludo.
>
Respuesta Responder a este mensaje
#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:

-No es la ms eficiente. Lo mismo me pregunte hace algunos aos cuando
empec con C#.

Entiendo que quiere preguntar cmo reducir cdigo para manejar datos. La
respuesta es: Usa una capa de datos. En esta librera de clases pones el
cdigo necesario para conectarte a tu base de datos y devolver resultados, o
ejecutar comandos. Si tu aplicacin 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 solucin efectiva. Por dems,
agregamos la capacidad de respetar las reglas del pool de conexiones. Un
ejemplo sencillo de una aplicacin 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 funcin puede reducir miles de lneas de cdigo"

Los objetos que devuelven datos suelen ser ms complejos, pero igual, es muy
elegante.

P.S.
Alberto Poblacin tiene razn. Nosotros no tenemos porque administrar las
conexiones, ADO.NET lo hace eficientemente siempre y cuando respetemos sus
reglas. Una programacin sencilla (no controlada), puede degenerar en
errores fatales de conexiones copadas. Bsicamente se siguen un par de
reglas. Usar la misma cadena de conexin para la aplicacin, y segundo usar
para mltiples bases de datos la directiva USE de SQL. De otra parte, ya es
regla muy conocida que debemos usar "using" para usar una conexin.

Sigue esta premisa: "Entre ms sabes de C#, menos cdigo escribes."


"Baco" escribi en el mensaje de
noticias:uZKpTuy#
> Buenos das,
> 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 gustara decir que he estado leyendo bastante
> informacin en Internet pero no termino de dar con la posible solucin a
> mi duda.
>
> Actualmente mis proyectos se basan en una serie de pginas web forms en
> las que creo y abro la conexin. Estos web forms hacen uso de una clase
> repleta de funciones que tambin necesitan conectarse a la base de datos.
> Pero claro, actualmente, tengo que crear, abrir, cerrar y eliminar la
> conexin en cada funcin, independientemente de que dicha conexin ya est
> abierta en el web form.
>
> Supongo que esta metodologa no es la ms eficiente. podrais indicarme
> como podra optimizar estas conexiones?
>
> Muchas gracias
> Un saludo.

email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida