Problema de Estabilidad en el Web DataWindow

Descripción del Problema
La implementación del componente Web DataWindow de EAServer (DataWindow/HTMLGeneratorXX) recae en la función SetLibraryList para agregar las PBLs que contienen los objetos DataWindow, a la lista de librarías del componente. Sybase ha determinado que la función SetLibraryList no es 'thread-safe' al ser invocada simultáneamente por múltiples instancias del componente; en consecuencia, las aplicaciones que usan esta funcionalidad pueden sufrir problemas intermitentes de estabilidad, especialmente durante períodos de alto uso. Estos problemas de estabilidad se pueden manifestar como excepciones en el log de errores de EAServer o 'colgadas' del componente Web DataWindow; otros componentes pueden continuar funcionando normalmente.
En PowerBuilder 9.0 una nueva función llamada AddToLibraryList supera esta deficiencia. Sin embargo en PowerBuilder 8, agregar dicha función forzaría a una migración de las aplicaciones PowerBuilder 8 existentes, después de aplicar el EBF que contiene esta nueva función; en consecuencia, ésta funcionalidad es sólo accesible como una función externa en PowerBuilder 8.0.3 Build 9872 y posteriores. La declaración de la función externa local es:
function integer AddToLibraryList(string lib) LIBRARY "PBVM80.DLL"
Dado que PowerBuilder 9.0 incluye la función AddToLibaryList como una función de PowerScript, la declaración de la función externa no es necesaria al usar DataWindow/HTMLGenerator90. Note sin embargo, que PowerBuilder 9.0 se entrega con una versión del componente WebDW que aún utiliza la función SetLibraryList y como consecuencia se requiere llevar a cabo la modificación descrita a continuación.
Solución al Problema
El componente Web DataWindow estándar se incluye en la libraría PBDWRMT.PBL, que por defecto se encuentra en el directorio %SYBASE%\PowerBuilder X.0\Code Examples\WebDW, donde %SYBASE% es el directorio de instalación del software Sybase (por ejemplo C:\Program Files\Sybase) y 'X' es la versión de PowerBuilder (8 o 9).
Sólo existe una invocación de la función SetLibraryList dentro de ésta PBL. La función que incluye éste llamado es SetDWObject, la cual hace parte del objeto no visual nv_remote_datawindow; abajo se muestra el cambio requerido en el código para que esa función resuelva el problema de estabilidad.
Código actual:
// if the passed library is not already in the library list if Pos(is_default_library_list, as_sourceFileName) = 0 then // append to default library list libList = is_default_library_list + "," + as_sourceFileName li_result = GetApplication().SetLibraryList(libList) if ib_trace then of_log("SetLibraryList(" + libList+") = " + String(li_result)) else libList = is_default_library_list end if
Código modificado:
// if the passed library is not already in the library list if Pos(is_default_library_list, as_sourceFileName) = 0 then // append to default library list libList = is_default_library_list + "," + as_sourceFileName li_result = AddToLibraryList(as_sourceFileName) if ib_trace then of_log("AddToLibraryList(" + as_sourceFileName+") = " + String(li_result)) else libList = is_default_library_list end if
Si usted está utilizando su propia implementación del componente WebDW, simplemente haga éste cambio y cargue ('deploy') el componente modificado a EAServer.
Si usted está usando la implementación del WebDW que viene con EAServer, no hay necesidad de volver a cargar el componente; siga estos pasos:
- Con el 'Library Painter' de PowerBuilder ubique el archivo PBDWRMT.PBL, que se encuentran en %SYBASE%\PowerBuilder X.0\Code Examples\WebDW, donde %SYBASE% es el directorio de instalación del software Sybase (por ejemplo C:\Program Files\Sybase) y 'X' es la versión de PowerBuilder (8 o 9).
- Haga 'doble click' sobre la PBL (en la parte derecha del 'Painter') y luego 'doble click' sobre el objeto nv_remote_datawindow.
- Dentro de la lista de funciones del objeto nv_remote_datawindow ubique la función SetDWObejet.
- Lleve a cabo la modificación del código de la función SetDWObejet según se describe arriba; luego cierre el código del objeto nv_remote_datawindow, aceptando guardar los cambios.
- Ubique nuevamente el archivo PBDWRMT.PBL con el 'Library Painter' de PowerBuilder.
- Haciendo 'click derecho' sobre PBDWRMT.PBL, seleccione la opción 'Build Runtime Library...' y luego 'Ok'
- Ubique con el 'Explorador de Windows' el archivo PBDWRMT.PBD, el cuál se generó en el paso anterior; éste debió haber quedado ubicado junto con el archivo PBDWRMT.PBL.
- Cambie el nombre del archivo PBD, de PBDWRMT.PBD a PBDWR80.PBD (PowerBuilder 8.0) o PBDWR90.PBD (PowerBuilder 9.0).
- Baje EAServer.
- Copie el archivo PBDWR80.PBD o PBDWR90.PBD (dependiendo de su versión de PowerBuilder) a los siguientes directorios; al copiar el archivo se reemplazará la versión original:
- %SYBASE%\Shared\PowerBuilder
- %SYVASE%\EAServer\PowerBuilder
donde %SYBASE% es el directorio de instalación del software Sybase (por ejemplo C:\Program Files\Sybase).
- Reinicie EAServer.
Verificación de la Solución
Para verificar que la función AddToLibraryList está siendo usada (y no la función SetLibraryList) usted puede agregar la siguiente propiedad al componente Web DataWindow de EAServer, usando 'EAServer Manager' (o 'Jaguar Manager'):
com.sybase.datawindow.trace = true
El log de EAServer (usualmente ubicado en %SYBASE%\EAServer\bin\Jaguar.log) debe mostrar que al invocar el Web DataWindow se está invocando la función AddToLibraryList, en vez de SetLibraryList. La siguiente es una porción del log de EAServer:
jul 29 09:12:01 2004: HTMLDW: Activate() jul 29 09:12:01 2004: HTMLDW: Entering SetDWObject('C:/temp/prueba.pbl','d_customer') jul 29 09:12:01 2004: HTMLDW: Doing PBL/PBD jul 29 09:12:01 2004: HTMLDW: AddToLibraryList(C:/temp/prueba.pbl) = 1 jul 29 09:12:01 2004: HTMLDW: Entering Modify('DataWindow.htmldw='yes' DataWindow.NoUserPrompt='yes'') jul 29 09:12:01 2004: HTMLDW: Exiting Modify() = '' jul 29 09:12:01 2004: HTMLDW: EnableCommit() jul 29 09:12:01 2004: HTMLDW: Entering of_initializeFromDeclarative() jul 29 09:12:01 2004: HTMLDW: Exiting of_initializeFromDeclarative() = 1 jul 29 09:12:01 2004: HTMLDW: Exiting SetDWObject() = 1
Atributos del Documento
|
| Resumen: |
La función SetLibraryList de PowerScript puede causar inestabilidad en EAServer bajo condiciones de carga alta. Este documento describe una implementación alterna disponible en las versiones de PowerBuilder 8.0.3 y posteriores. |
| Código: |
10172 |
Última Modificación: |
Jul 29, 2004 |
| Temas: |
Rendimiento |
Tipo de Documento: |
Documento Técnico |
| Productos: |
PowerBuilder, EAServer |
Versión: |
8.0.x, 9.0.x |
| Plataformas: |
Todas las Plataformas |
Sistema Operativo: |
Windows |
|