Vengo regresando de Monterrey, después de ir en representación de IBM; para formar parte del equipo de debuggeo de un proyecto importante (NDA – no detalles) en conjunto con gente de Microsoft USA.
Básicamente el problema era: el performance de la aplicación era muy lento, después de haber actualizado al .NET Framework 1.1, y después que Jason de MS USA hizo debugging en los dumps de IIS y algunos de los logs, sucede que todos los threads estaban esperando abrir una conexión vía el ODBC driver de Informix.
NTDLL!ZwWaitForSingleObject+0xb
KERNEL32!WaitForSingleObjectEx+0x71
KERNEL32!WaitForSingleObject+0xf
iclit09b!SQLSetDescRec+0xa20d
System.Data.Common.UnsafeNativeMethods/Odbc32.SQLDriverConnectW(ValueClass System.Runtime.InteropServices.HandleRef,I,String,I2,I,I2,ByRef I2,I2)
Void System.Data.Odbc.OdbcConnection.Open()
Básicamente, se debía a que la DLL de Informix estaba esperando en que se abriera una conexión. Este problema es similar al que mi colega y buen amigo Smasher de Cross se encontró en Financiera.
La misma recomendación que le hice a Smasher se hace aquí, actualizar a la ultima versión del SDK (2.81 TC3) para aliviar el problema de los drivers, que no requiere ningún cambio de codigo. Para mejorar aún más el rendimiento, recomendé utilizar el proveedor nativo de Informix que se encuentra dentro de ese mismo SDK para evitar que utilizar una capa adicional (que es el ODBC) para conectarse a la base de datos (que esto si requiere un cambio considerable de código).
Básicamente, el proveedor que IBM nos dá; contiene el mismo set de objetos que todos los proveedores nativos de ADO.NET, por lo que puede facilitar mucho la migración. Este es un segmento de código de como funciona:
1 | _DemoDataSet = new DataSet(); |
2 | |
3 | _IfxDaOrders = new IfxDataAdapter(«select |
4 | * from orders»,Conn); |
5 | |
6 | _OrderCmdBuilder = new IfxCommandBuilder(_IfxDaOrders); |
7 | |
8 | _OrderCmdBuilder.GetInsertCommand(); |
9 | _OrderCmdBuilder.GetUpdateCommand(); |
10 | _OrderCmdBuilder.GetDeleteCommand(); |
11 | |
12 | _IfxDaOrders.Fill(_DemoDataSet, «orders»); |
13 | _IfxDaCustomers = new IfxDataAdapter(«select * from customer»,Conn); |
14 | _CustCmdBuilder = new IfxCommandBuilder(_IfxDaCustomers); |
15 | //generate ahead the update command |
16 | _CustCmdBuilder.GetUpdateCommand(); |
17 | _IfxDaCustomers.Fill(_DemoDataSet, «customer»); |
Si se fijan, es exactamente igual que utilizar cualquier objeto de datos de .NET; solo con el prefijo Ifx (quien dijo, Search & Replace?)
Afortunadamente, todo salió bien después de este deployment. La actualización de los drivers de versión mejoró el problema y todo al parecer está funcionando tal como debe (solo que un poco lento). Se les hizo varias recomendaciones de arquitectura sobre la aplicación que pueden entrar dentro de otros posts.
Cheers!
Deja una respuesta
Lo siento, debes estar conectado para publicar un comentario.