Visual Basic.NET - Ayuda... muchas conexiones por transacción

 
Vista:

Ayuda... muchas conexiones por transacción

Publicado por William (6 intervenciones) el 14/07/2010 16:08:51
Saludos estimados foristas.
Tengo un gran problema, estoy construyendo una aplicación la cual me esta trayendo problemas.
Tengo una función en una clase creada y almacenada en una dll, la cual ejecuta una instrucción SQL en una base de datos Oracle 10g R2, la escribo a continuación:
-----------------------------------
Public Function ExtraeCampo(ByVal sCampo As String, ByVal sTabla As String, ByVal sWhere As String) As String

Dim myConnection As OracleConnection
Dim myCommand As OracleCommand
Dim dr As OracleDataReader
Dim sDevuelve As String

myConnection = New OracleConnection(sCadenaConexion)

Try
myConnection.Open()
If Trim(sWhere) <> "" Then
myCommand = New OracleCommand("Select " & sCampo & " from " & sTabla & " where " & sWhere, myConnection)
Else
myCommand = New OracleCommand("Select " & sCampo & " from " & sTabla, myConnection)
End If

dr = myCommand.ExecuteReader()
sDevuelve = ""
While dr.Read()
sDevuelve = dr(0).ToString()
End While
Catch e As Exception
sDevuelve = e.Message
End Try
Return sDevuelve
dr.Close()
myConnection.Close()
End Function

--------------------------------------------------

Y sCadenaConexion es:

"data source = " & sServidor & "; user id = " & sUsuario & "; password = " & sClave & "; Integrated Security = no; Persist Security Info=False;"

---------------------------------------------------

Cada vez que se ejecuta esa función, se crea una conexión en la bd, llega un momento en el que cae la bd ya que la cantidad de conexiones es enorme (processes excede el numero permitido), cuando me di cuenta de eso, solo habia ejecutado un proceso donde invocaba esta funcion muchas veces y se crearon 15 conexiones.

Alguien sabe que puede estar pasando??
De antemano muchas gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de roger

RE:Ayuda... muchas conexiones por transacción

Publicado por roger (186 intervenciones) el 14/07/2010 19:12:09
hola

Nunca se esta cerrando la conexion porque tienes

Return sDevuelve
dr.Close()
myConnection.Close()

cuando llega a "return sDevuelve" acaba la funcion, no pasa por dr.Close()
myConnection.Close() que es donde se cierra la conexion.
Solo debes cambiar el orden y listo

dr.Close()
myConnection.Close()
Return sDevuelve

Normalmente el compilador (al menos en C#), mostaría que se ha detectado codigo inalcanzable como lo tienes en este momento.

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Ayuda... muchas conexiones por transacción

Publicado por William (6 intervenciones) el 14/07/2010 19:40:31
Muchísimas gracias, tenias toda la razón estimado Roger, hice lo q pusiste y ahora solo tiene una sola conexion inactiva... pero... esa conexión no deberia tambien estar cerrada?
Gracias por la respuesta.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de roger

RE:Ayuda... muchas conexiones por transacción

Publicado por roger (186 intervenciones) el 14/07/2010 20:30:41
puede ser que mantenga la conexion para hacer uso de la caracteristica de Pooling, entonces cada que hay un intento de conexion se utiliza el pool de conexion ya creado (el que te esta quedando activo) para evitar el uso de recursos que implica todo el proceso de conexion con la base de datos. Aqui hay algo de informacion al respecto http://www.oracle.com/technology/oramag/oracle/06-jul/o46odp.html .

Prueba cambiando tu cadena de conexion para evitar el pooling (pooling=false), y comprueba que efectivamente no quede ninguna conexion activa, y asi salimos de la duda.

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Ayuda... muchas conexiones por transacción

Publicado por William (6 intervenciones) el 14/07/2010 22:32:48
Al agregar "pooling=false" a la cadena de conexión, no hay ninguna conexion activa, tenias toda la razon.
Muchisimas gracias !!
Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar