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
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
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.
- 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.