JDBCWriterPattern

El patrón JDBCWriterPattern se utiliza para escribir datos en una base de datos utilizando una conexión JDBC.

Clases de soporte

  • JDBCWriter
  • LocalJDBCWriter

Propiedades obligatorias

Las propiedades siguientes son necesarias para el patrón.
Tabla 1. Propiedades obligatorias. La tabla incluye el nombre y el valor de cada propiedad necesaria para el patrón.
Nombre de propiedad Value LocalJDBCWriter JDBCWriter
PATTERN_IMPL_CLASS Clase que implementa la interfaz JDBCWriterPattern Aplicable Aplicable
ds_jndi_name Nombre JNDI del origen de datos. Aplicable No aplicable
jdbc_url El URL de JDBC. Por ejemplo, jdbc:derby:C:\\mysample\\CREDITREPORT. Aplicable No aplicable
jdbc_driver El controlador JDBC. Por ejemplo, org.apache.derby.jdbc.EmbeddedDriver Aplicable No aplicable
user_id El ID de usuario de la base de datos. Por ejemplo, Myid Aplicable No aplicable
pswd Contraseña de usuario. Por ejemplo, mypwd. Sólo LocalJDBCReader. Aplicable No aplicable

Propiedades opcionales

Para el patrón las propiedades siguientes son opcionales.
Tabla 2. Propiedades opcionales . La tabla incluye el nombre, el valor y la descripción de cada propiedad opcional para el patrón.
Nombre de propiedad Value Descripción LocalJDBCReader JDBCWriter
debug true o false (el valor predeterminado es false) Habilita el rastreo detallado en esta secuencia de datos por lotes. Aplicable Aplicable
EnablePerformanceMeasurement true o false (el valor predeterminado es false) Calcula el tiempo total invertido en las secuencias de datos por lotes y el método processRecord, si se utiliza GenericXDBatchStep. Aplicable Aplicable
EnableDetailedPerformanceMeasurement true o false (el valor predeterminado es false) Proporciona un desglose más detallado del tiempo invertido en cada método de las secuencias de datos por lotes. Aplicable Aplicable
batch_interval El valor predeterminado es 20. Haga que el valor sea menor que el intervalo del punto de control para la sincronización basada en el registro. Indica el número de actualizaciones SQL que se deben procesar por lotes antes de comprometerse. Aplicable Aplicable

Definición de interfaz

public interface JDBCWriterPattern {

	public void initialize(Properties props);
	
	/**
	 	 * Esta es normalmente una consulta de actualización utilizada para grabar datos en la BD
	 * @return      
	 */
		public String getSQLQuery();
	
	/**
	 	 * La clase padre BDSJDBCWriter crea una nueva preparedstatement y la
	 	 * pasa a este método. Este método llena la preparedstatement con los
	 	 * valores adecuados y la devuelve a la clase padre para su ejecución
	 	 * @parámetro pstmt
	 	 * @parámetro record
	 * @return      
	 */
		public PreparedStatement writeRecord(PreparedStatement pstmt, Object record);
}

Ejemplo xJCL JDBCWriter

<batch-data-streams>
<bds>
<logical-name>outputStream</logical-name>
<props>
<prop name="PATTERN_IMPL_CLASS" value="com.ibm.websphere.batch.samples.tests.bds.EchoWriter"/>
<prop name="ds_jndi_name" value="jdbc/fvtdb"/>
<prop name="debug" value="true"/>
</props>
<impl-class>com.ibm.websphere.batch.devframework.datastreams.patterns.JDBCWriter</impl-class>
</bds>
</batch-data-streams> 

Ejemplo xJCL LocalJDCBWriter

<batch-data-streams>
<bds>
<logical-name>outputStream</logical-name>
<props>
<prop name="PATTERN_IMPL_CLASS" value="com.ibm.websphere.batch.samples.tests.bds.EchoWriter"/>
<prop name="jdbc_url" value="jdbc:derby:C:\\mysample\\CREDITREPORT"/>
<prop name="jdbc_driver" value="org.apache.derby.jdbc.EmbeddedDriver"/>
<prop name="user_id" value="myuserid"/>
<prop name="pswd" value="mypswd"/>
<prop name="debug" value="true"/>
</props>
<impl-class>com.ibm.websphere.batch.devframework.datastreams.patterns.LocalJDBCWriter</impl-class>
</bds>
</batch-data-streams> 

Procesamiento de salto de registros con JDBCWriterPattern

El procesamiento de salto de registros es un caso especial de JDBCWriter/LocalJDBCWriter. El escritor (writer) funciona agrupando en un lote una secuencia de sentencias SQL y ejecutándolas en bloque contra una base de datos, lo que genera una única excepción BatchUpdateException si se produce un problema durante la ejecución. Para conseguir una granularidad similar a la de un procesamiento de salto de registros general, se intenta analizar una única BatchUpdateException para determinar qué ejecuciones de sentencia han fallado y con qué excepciones, así como qué registros individuales se pasan a los escritores.

Por ejemplo, supongamos un lote de diez registros donde el JDBCWriterPattern del usuario genera para el registro nº 2 una sentencia SQL que da lugar a una excepción java.sql.SQLIntegrityConstraintViolationException y donde la correspondiente sentencia SQL del registro nº 9 da lugar a una excepción java.sql.DataTruncation.

A fin de proporcionar un paralelismo lo más cercano posible al procesamiento de salto de registros en los escritores que no funcionan por lotes:
  • Invoque una vez el método del manejador de omisiones onSkippedWrite(Object o, Throwable t) pasándole el registro nº 2 y la instancia de la excepción SQLIntegrityConstraintViolationException.
  • Invoque una segunda vez el método del manejador de omisiones onSkippedWrite(Object o, Throwable t) pasándole el registro nº 9 y la instancia de la excepción DataTruncation.
  • Incremente en dos el recuento de saltos (suponiendo que ambas excepciones formen parte de la lista de inclusiones implícita o explícitamente).

El proceso de análisis de una excepción BatchUpdateException para extraer excepciones SQLExceptions encadenadas de las sentencias de que consta no es estándar en los manejadores y configuraciones JDBC. Además, algunos controladores abortan en el primer error sin ejecutar el lote completo.

Observe si la configuración de su controlador (algunos controladores se comportan de forma diferente en este ámbito dependiendo de la configuración) tiene un estilo de ejecución de lotes atómico o no atómico. En general, en el estilo atómico, la ejecución del lote aborta en el primer error, mientras que en el estilo no atómico se ejecuta el resto del lote.

En el caso del estilo atómico, el entorno de ejecución aborta el bucle de ejecución de pasos (lanza una excepción y retrotrae la transacción actual). En este caso, no existe ninguna excepción concreta que asociar a los registros de las sentencias no ejecutadas. Puesto que nunca se llegan a ejecutar, no se saltan.

En el caso del estilo no atómico, el entorno de ejecución emplea una heurística para analizar la BatchUpdateException en busca de la(s) excepcion(es) SQLException encadenada(s). Dicha heurística intenta determinar qué sentencias de la ejecución por lotes han generado errores e intenta emparejarlos con el registro correspondiente invocando el escucha de saltos pasándole el registro y la SQLException encadenada correspondientes. También incrementa el recuento de saltos una vez por cada registro que ha generado una excepción en el lote, en lugar de limitarse a hacerlo una única vez para todo el lote.

Si no se puede realizar esta correlación (en el estilo no atómico) y se ha configurado un escucha de saltos, el entorno de ejecución invoca el escucha de saltos una vez por cada registro problemático pasándole la excepción de nivel superior BatchUpdateException. Si no se puede realizar la correlación y no se ha configurado un escucha de saltos, el entorno de ejecución aborta el bucle de ejecución de pasos lanzando una excepción.


Icon that indicates the type of topic Reference topic



Timestamp icon Last updated: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=rgrid_btchpttrn2
File name: rgrid_btchpttrn2.html