MTBASE / SYBASE DE COLOMBIA
 
Búsqueda avanzada...
Versión para imprimir Versión para imprimir Enviar vínculo por e-mail Enviar por e-mail Ver atributos del documento Atributos del documento
 

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:

  1. 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).
  1. Haga 'doble click' sobre la PBL (en la parte derecha del 'Painter') y luego 'doble click' sobre el objeto nv_remote_datawindow.
  1. Dentro de la lista de funciones del objeto nv_remote_datawindow ubique la función SetDWObejet.
  1. 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.
  1. Ubique nuevamente el archivo PBDWRMT.PBL con el 'Library Painter' de PowerBuilder.
  1. Haciendo 'click derecho' sobre PBDWRMT.PBL, seleccione la opción 'Build Runtime Library...' y luego 'Ok'
  1. 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.
  1. Cambie el nombre del archivo PBD, de PBDWRMT.PBD a PBDWR80.PBD (PowerBuilder 8.0) o PBDWR90.PBD (PowerBuilder 9.0).
  1. Baje EAServer.
  1. 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).

  1. 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
 
 Inicio   Sobre MTBASE   Sobre Sybase   Empleos en MTBASE   Mapa del Sitio   Aspectos Legales y Políticas de Privacidad