Principales respuestas
Conectar y Desconectar de SQL Server

Pregunta
-
Estimados, tengo una aplicacion multiusuario que trabaja sobre SQL Server 2012. La App basicamente graba filas en el SQL cada 25 segundos aproximadamente, a través de la lectura de un código de barras. Mi pregunta es la siguiente: es preferible que cada vez que termine de leer un dato me desconecte de la BBDD, para luego conectarme en la rpoxima lectura (25 segundos)? o combiene conectarse al principio y solo desconectar al cerrar la aplicacion?. Consulto, porque esta misma APP trabajaba con ACCESS hasta hace un mes y tenia que conectarme y desconectarme para cada lectura, ya que de la otra manera me volvia loco el tema del bloqueo de los registros, cada tanto se colgaban todas las aplicaciones.
Bueno gente gracias de antemano y aguardo consejos.
Saludos!
Pablo
Respuestas
-
No hace falta configurar ningún parámetro adicional, tal como lo tienes está bien. De forma predeterminada el pool queda activado. Tendrías que meter un parámetro adicional en el caso contrario, es decir, si desearas DESACTIVAR el pool.
- Marcado como respuesta pianpa miércoles, 16 de mayo de 2012 10:43
Todas las respuestas
-
Hola,
Ese tema de abrir y cerrar la base de datos a cada rato tiene dos aristas. Estan los que dicen abrir y cerrar y los opositores que dicen abrir al iniciar la aplicacion y cerrar al salir.
Si tenias problemas con Access seguro que estabas haciendo algo mal. Si usas los metodos del recordset para agregar las filas lo que tenes que hacer es cerrar el recordset luego de guardar. Si por el contrario usas codigo SQL para insertar registros deberias anidar las inserciones en una transaccion y luego de confirmar la transaccion forzar la grabacion del buffer del jet.
-
Hola Victor, efectivamente quise saber la opinión de los foreros, ya que en la web encontré gente a favor y gente en contra. Respecto a lo que me decis sobre el Access, seguramente estaba haciendo algo mal, pero la verdad es que le di muchas vueltas al asunto y me decidi migrar a SQL. Mi duda es si en SQL puedo llegar a tener las mismas complicaciones. Yo utilizaba el siguiente codigo en Access:'DEFINE LAS CONEXIONES
'conectar a la BBDD
Set con = New ADODB.Connection
con.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source='" & RUTA & "';Jet OLEDB:Database Password=123"'Recordset para busquedas
With rstR
If .State = adStateOpen Then
.Close
End If
.ActiveConnection = con
.CursorLocation = adUseClient
.CursorType = adOpenKeyset
.LockType = adLockReadOnly
.Properties("IRowsetIdentity") = True
.Open "SELECT MODELO FROM MODELOS ORDER BY MODELO", , , , adCmdText
.MoveFirst
For i = 1 To .RecordCount
If .EOF = True Then
'MsgBox "SE CARGO TODO LO QUE HABIA"
Exit For
Else
comboMODELO.AddItem rstR("MODELO")
.MoveNext
End If
Next i
.Close
End With
'Recordset para insertar registros
With rst2
If .State = adStateOpen Then
.Close
End If
.ActiveConnection = con
.CursorLocation = adUseClient
.CursorType = adOpenStatic
.LockType = adLockOptimistic
.Properties("IRowsetIdentity") = True
.Open "INSERT INTO TABLE(FECHA,SN,MODELO,ESTADO,USUARIO) VALUES (NOW(), '" & txtC.Text & "','" & comboMODELO & "','PASS','" & USUARIO & "')", , adOpenStatic, adLockOptimistic, adCmdText
etiERROR.ForeColor = vbBlue
etiERROR = "LA RELACION FUE EXITOSA"
End WithQue puede ser que esté mal?. El error que me salía era que al momento de querer hacer algún insert, el registro está bloqueado y me colgaba en cascada todas las terminales.
Saludos!
-
[...] es preferible que cada vez que termine de leer un dato me desconecte de la BBDD, para luego conectarme en la rpoxima lectura (25 segundos)? o combiene [sic] conectarse al principio y solo desconectar al cerrar la aplicacion?.
Si estás usando una método de acceso a datos de los que automáticamente gestionan el pool de conexiones (por ejemplo, conectas por medio de OleDb), entonces la recomendación es que abras y cierres la conexión cada vez que quieras usarla. Internamete, y sin que tú hagas nada, el pool hace la gestión necesaria para que al cerrar la conexión no se cierre de verdad, sino que se devuelve al pool. Cuando vuelves a abrirla, no se abre de verdad, sino que se recupera del pool la que ya estaba abierta. De esa forma, no se pierde nada de tiempo en abrir la conexión, y se optimiza el número total de conexiones abiertas en cada momento porque el pool se encarga de gestionarlas. Jugando con los parámetros de la cadena de conexión se puede habilitar o deshabilitar el pool, así como cambiarle los parámetros, tales como el tiempo que una conexión permanece abierta en el pool antes de cerrarse realmente.
-
[...] es preferible que cada vez que termine de leer un dato me desconecte de la BBDD, para luego conectarme en la rpoxima lectura (25 segundos)? o combiene [sic] conectarse al principio y solo desconectar al cerrar la aplicacion?.
Si estás usando una método de acceso a datos de los que automáticamente gestionan el pool de conexiones (por ejemplo, conectas por medio de OleDb), entonces la recomendación es que abras y cierres la conexión cada vez que quieras usarla. Internamete, y sin que tú hagas nada, el pool hace la gestión necesaria para que al cerrar la conexión no se cierre de verdad, sino que se devuelve al pool. Cuando vuelves a abrirla, no se abre de verdad, sino que se recupera del pool la que ya estaba abierta. De esa forma, no se pierde nada de tiempo en abrir la conexión, y se optimiza el número total de conexiones abiertas en cada momento porque el pool se encarga de gestionarlas. Jugando con los parámetros de la cadena de conexión se puede habilitar o deshabilitar el pool, así como cambiarle los parámetros, tales como el tiempo que una conexión permanece abierta en el pool antes de cerrarse realmente.
Alberto gracias por tu respuesta, la verdad no conocía el concepto del pool. Yo me estoy conectando de esta manera :
Set con = New ADODB.Connection
con.Open "Provider=SQLOLEDB; Initial Catalog=AAA; Data Source=10.0.0.1;", "user", "pass"y luego para desconectarme solo hago:
con.close
set con=nothing
Debería agregar algún parámetro adicional para que el pool trabaje correctamente?
Gracias!
Pablo D.
-
No hace falta configurar ningún parámetro adicional, tal como lo tienes está bien. De forma predeterminada el pool queda activado. Tendrías que meter un parámetro adicional en el caso contrario, es decir, si desearas DESACTIVAR el pool.
- Marcado como respuesta pianpa miércoles, 16 de mayo de 2012 10:43
-
-
Hola,
Si me permitis tu codigo deberia ser algo asi:
Llenar el Combo Modelo:
Esta rutina presupone una conexion abierta a la base de datos
Dim rstR As ADODB.Recordset
Set rstR = New ADODB.Recordset
comboMODELO.Clear
With rstR
Set .ActiveConnection = Con
.Source = "SELECT MODELO FROM MODELOS ORDER BY MODELO"
.CursorLocation = adUseClient
.CursorType = adOpenStatic
.LockType = adLockReadOnly
.Open , , , , adCmdTextDo Until .EOF
comboMODELO.AddItem rstR("MODELO")
.MoveNext
Loop
.Close
End WithSet rstR = Nothing
Funcion para Insertar el registro:
Esta funcion recibe los parametros y devuelve True o False segun sea si la insercion fue exitosa o no. El mensaje de error podes sacarlo, habria que ver como juega el objeto etiERROR, tal vez eso lo debas manejar dentro del cuerpo de tu programa con el resultado True o False de la llamada a la funcion.
Function InsertarRelacion(Con As ADODB.Connection, SN As String, Modelo As String, Usuario As String) As Boolean
On Error GoTo ErInsertar
Dim SwTansac As Boolean
Dim StrError As String
Dim Sentencia As String
Sentencia = "INSERT INTO TABLE("
Sentencia = Sentencia & "FECHA,"
Sentencia = Sentencia & "SN,"
Sentencia = Sentencia & "MODELO,"
Sentencia = Sentencia & "ESTADO,"
Sentencia = Sentencia & "USUARIO"
Sentencia = Sentencia & ") VALUES ("
Sentencia = Sentencia & "NOW(),"
Sentencia = Sentencia & "'" & SN & "',"
Sentencia = Sentencia & "'" & Modelo & "',"
Sentencia = Sentencia & "'PASS',"
Sentencia = Sentencia & "'" & Usuario & "'"
Sentencia = Sentencia & ")"
Con.BeginTrans
SwTansac = True
Con.Execute Sentencia, , adCmdText + adExecuteNoRecords
Con.CommitTrans
Call RefrescarJet(Con)
etiERROR.ForeColor = vbBlue
etiERROR = "LA RELACION FUE EXITOSA"
InsertarRelacion = TrueExit Function
ErInsertar:
If SwTansac Then
Con.CommitTrans
End If
StrError = "Error Nº: " & Err.Number & vbCrLf & vbCrLf
StrError = StrError & " " & Err.Description & vbCrLf & vbCrLf
StrError = StrError & " (Origen: " & Err.Source & ")" & vbCrLf
If Err.HelpFile <> "" Then
StrError = StrError & " (Archivo de Ayuda: " & Err.HelpFile & ")" & vbCrLf
StrError = StrError & " (Contexto de Ayuda: " & Err.HelpContext & ")" & vbCrLf
End If
MsgBox StrError, vbCritical, "Insertando Relación"
DoEvents
etiERROR.ForeColor = vbRed
etiERROR = "LA RELACION NO SE PUDO COMPLETAR"
Err.ClearEnd Function
Rutina para refrescar el buffer del Jet, solo para bases de datos Access:
Tenes que agregar a tu proyecto la referencia "Microsoft Jet and replication Object .."
Sub RefrescarJet(Base As ADODB.Connection)
On Error Resume Next
Dim JRO As JRO.JetEngine
Set JRO = New JRO.JetEngine
JRO.RefreshCache Base
Set JRO = Nothing
On Error GoTo 0End Sub
-
-
-