Я написал этот файл конфигурации для чтения из базы данных и записи в файл CSV .:
<?xml version = "1.0" encoding = "UTF-8"?>
<!-- Start imports -->
<import resource = "launch-context.xml"/>
<bean class = "org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor"/>
<!-- End imports -->
<job id = "DLM" xmlns = "http://www.springframework.org/schema/batch">
<!-- Step 1 -->
<step id = "siebelToStaging" next = "generateControlReport">
<tasklet transaction-manager = "transactionManager">
<chunk reader = "DbReader" writer = "outputFileWriter" commit-interval = "10"> </chunk>
<!--
<listeners>
<listener ref = "dbReaderStepExecutionListener"/>
</listeners>
-->
</tasklet>
</step>
<!-- Step 2 -->
<step id = "generateControlReport">
<tasklet ref = "generateControlReportTasklet"/>
</step>
<listeners>
<listener ref = "jobListener"/>
</listeners>
</job>
<!-- End job -->
<bean id = "jobListener" class = "my.com.tm.hsbb.eai.batch.listener.GenericJobExecutionListener">
<property name = "eaiJobExecution" ref = "eaiJobExecution"/>
<property name = "dao" ref = "dao"/>
</bean>
<!--
<bean id = "dbReaderStepExecutionListener" class = "my.com.tm.hsbb.eai.batch.listener.DbStepExecutionListenerImpl">
<property name = "eaiJobExecution" ref = "eaiJobExecution"/>
<property name = "updLastWritableStepCtxId" value = "true"/>
<property name = "updLastReadableStepCtxId" value = "true"/>
</bean>
-->
<!-- Assigning values to parameter variable -->
<bean id = "eaiJobExecution" class = "my.com.tm.hsbb.eai.batch.job.EaiJobExecution">
<property name = "parameter">
<bean class = "my.com.tm.hsbb.eai.batch.job.Parameter">
<property name = "fileDateFmt" value = "yyyyMMDDhhmmss"/>
<property name = "fileHeaderDateFmt" value = "yyyyMMDDhhmmss"/>
<property name = "totalRecordsFmt" value = "10N"/>
<property name = "sequenceFmt" value = "4N"/>
<property name = "sequenceName" value = "003_SEQ"/>
<property name = "outputDir" value = "/outbox/new"/>
<property name = "reportDir" value = "/ctlrpt"/>
</bean>
</property>
</bean>
<bean id = "dao" class = "my.com.tm.hsbb.eai.batch.dao.BatchJobDao">
<property name = "dataSource" ref = "dataSource"/>
</bean>
<bean id = "generateControlReportTasklet" class = "my.com.tm.hsbb.eai.batch.tasklet.GenerateControlReportTasklet">
<property name = "ctrlReportDir" ref = "reportDirResource"/>
</bean>
<bean id = "controlReport" class = "my.com.tm.hsbb.eai.batch.dataobject.ControlReport"/>
<bean id = "reportDirResource" class = "org.springframework.core.io.FileSystemResource">
<constructor-arg value = "../ctlrpt"/>
</bean>
<!-- ItemReader which reads from Siebel database and returns the row mapped by rowMapper - START-->
<bean id = "DbReader"
class = "org.springframework.batch.item.database.JdbcCursorItemReader">
<property name = "dataSource" ref = "DataSource" />
<property name = "sql">
<value>
<![CDATA[SELECT STX.serial_num
FROM cityDB
WHERE MODEM.prod_id = (SELECT row_id
FROM s_prod_int
WHERE name = 'Modem'
AND ROWNUM < 2)
AND status_cd <> 'Inactive'
AND par_asset_id = row_id]]>
</value>
</property>
<property name = "rowMapper">
<bean class = "my.com.tm.hsbb.eai.batch.transform.DynamicLineManagementRowMapper" />
</property>
</bean>
<!-- ItemReader which reads from database and returns the row mapped by rowMapper - END-->
<!-- SBL DB Connectivity configuration -->
<bean id = "DataSource" class = "oracle.jdbc.pool.OracleDataSource">
<property name = "driverType" value = "${db_driver}"/>
<property name = "URL" value = "${db_url}"/>
<property name = "user" value = "${db_user}"/>
<property name = "password" value = "${db_password}"/>
</bean>
<!-- Writing the file - START -->
<bean id = "outputFileWriter" class = "org.springframework.batch.item.file.FlatFileItemWriter" scope = "step">
<property name = "resource" value = "file:/new/LINE_ICP_#{jobParameters[dateCreated]}#{jobParameters[timeCreated]}.txt"/>
<property name = "lineAggregator">
<bean class = " org.springframework.batch.item.file.transform.PassThroughLineAggregator"/>
</property>
</bean>
<!-- Writing the file - END -->
Это самый простой файл конфигурации spring -batch, который я когда-либо писал, но это пакетное задание, которое заняло 9 часов, чтобы написать файл размером 10 МБ и 69507 строк. Я убрал большинство строк, которые могут относиться к классам и интерфейсам, которые могли вызвать узкие места, но это все еще занимает много времени.
Не могли бы вы посоветовать мне, что еще я могу сделать, чтобы сократить время обработки? Если предоставленной мной информации недостаточно, вы можете сообщить мне об этом. (p.s некоторые из пространств имен пришлось удалить, поскольку система распознает их как гиперссылки, также был сокращен запрос sql) Заранее спасибо.
Я выполнил запрос на ЖАБЕ, и это займет несколько минут.
Итак, запрос (относительно медленный). Что делает ваш DynamicLineManagementRowMapper? Также 10, поскольку интервал фиксации немного мал, попробуйте что-нибудь вроде 100. И что занимает много времени, чтение или запись?
Я думаю, что дольше всего длится чтение. Я думал, что RowMapper обязателен.
Я второй М. Дейнум. Попробуйте использовать кусок побольше, например 100 или 1000, и посмотрите, что произойдет. Более того, убедитесь, что столбцы в операторах select проиндексированы (это может сократить время выполнения вашего запроса). Кроме того, возможно, что step2 или ваш jobListener (который относится к дао) тоже требуют времени. Вы измерили продолжительность каждого шага?
Привет, Махмуд, могу я узнать, как измерить продолжительность каждого шага?
Вы можете использовать StepExecutionListener и записывать startTime и endTime в методах beforeStep и afterStep.
Вы проверяли производительность самого запроса?