If you are doing multi-threaded application or web portal, it may be possible to experience high frequency of ADODB connection timeout.
The reason is because there isn't enough database resources to service your needs.
Refer to 'Pooling in the Microsoft Data Access Components'
The answer is to make sure that each ADODB.connection is properly closed thereafter. You may think that you know the answer, but actually it can be tricky.
The rules are:
1.) Close all opened ADODB.connection object.
If you open a Connection object, remember to close it. Do not rely on garbage collection to implicitly close your connections.
2.) A disconnected ADODB.Recordset object has not actually been disconnected. If you don't set the 'ActiveConnection' property of the ADODB.Recordset to Nothing/NULL, it is not disconnected and the connection is not released into the pool.
3.) Similar to setting 'ActiveConnection' property of the ADODB.Recordset to Nothing/NULL, same applies to ADODB.Command object. You have to set the 'ActiveConnection' property of the ADODB.Command to Nothing/NULL.
4.) Turn off 'OLE DB resource pooling'.
You can do this by adding "OLE DB Services = -2" to the ADO Connection string
http://support.microsoft.com/kb/229564
The potential delays or disadvantages of not using pooling are related to the followings.
Creating a new object, setting properties, and establishing a new connection to the database.
Which means that there isn't much bottleneck from higher level point of view.
For my case, I didn't have to turn off 'OLE DB resource pooling' where by adhering to rules no.1, 2, 3, it solved the issue.
The reason is because there isn't enough database resources to service your needs.
Refer to 'Pooling in the Microsoft Data Access Components'
The answer is to make sure that each ADODB.connection is properly closed thereafter. You may think that you know the answer, but actually it can be tricky.
The rules are:
1.) Close all opened ADODB.connection object.
If you open a Connection object, remember to close it. Do not rely on garbage collection to implicitly close your connections.
2.) A disconnected ADODB.Recordset object has not actually been disconnected. If you don't set the 'ActiveConnection' property of the ADODB.Recordset to Nothing/NULL, it is not disconnected and the connection is not released into the pool.
Public Function ServiceTest(ConnectStr As String, _ SqlText As String) _ As String Dim cnn As New ADODB.Connection Dim rst As New ADODB.Recordset cnn.ConnectionString = ConnectStr cnn.CursorLocation = adUseClient cnn.Open Set rst.ActiveConnection = cnn rst.Open SqlText, , adOpenKeyset, adLockBatchOptimistic, -1 Set rst.ActiveConnection = Nothing 'This is important rst.Close Set rst = Nothing cnn.Close 'This is important Set cnn = Nothing Exit Function
3.) Similar to setting 'ActiveConnection' property of the ADODB.Recordset to Nothing/NULL, same applies to ADODB.Command object. You have to set the 'ActiveConnection' property of the ADODB.Command to Nothing/NULL.
Public Function ServiceTest(ConnectStr As String, _ SqlText As String) _ As String Dim lngRowsAffected as integer Dim cmdobj as new ADOD.command Dim cnn As New ADODB.Connection Dim rst As ADODB.Recordset cnn.ConnectionString = ConnectStr cnn.CursorLocation = adUseClient cnn.Open Set cmdobj.ActiveConnection = cnn cmdobj.CommandType = adCmdText cmdobj.CommandText = SqlText Set rst = cmdobj.execute(lngRowsAffected) If lngRowsAffected <= 0 Then 'Fail else 'Success end if Set rst = nothing Set cmdobj.ActiveConnection = Nothing 'This is important Set cmdobj = Nothing cnn.Close 'This is important Set cnn = Nothing End Function
4.) Turn off 'OLE DB resource pooling'.
You can do this by adding "OLE DB Services = -2" to the ADO Connection string
http://support.microsoft.com/kb/229564
The potential delays or disadvantages of not using pooling are related to the followings.
Creating a new object, setting properties, and establishing a new connection to the database.
Which means that there isn't much bottleneck from higher level point of view.
For my case, I didn't have to turn off 'OLE DB resource pooling' where by adhering to rules no.1, 2, 3, it solved the issue.
Comments