J'essaie de migrer des données d'une database Oracle vers SQL Server. J'utilise actuellement un JDBCCursorItemReader pour lire datatables Oracle, puis un JDBCBatchItemWriter pour écrire datatables dans SQL Server.
Mon problème est que cela prend trop de time. Pour une table de ~ 200 000 lignes, cela prend presque une heure (et je dois exécuter quatre de ces requêtes, chacune d'environ 200K de lignes).
@Bean public JdbcCursorItemReader<DataPOJO> dataReader() throws Exception, ParseException, UnexpectedInputException { final JdbcCursorItemReader<DataPOJO> dataReader= new JdbcCursorItemReader<>(); dataReader.setDataSource(oracleDataSource); dataReader.setSql(Constants.DATA_QUERY); dataReader.setRowMapper(new BeanPropertyRowMapper<DataPOJO>(DataPOJO.class)); return dataReader; } @Bean public JdbcBatchItemWriter<DataPOJO> dataWriter() throws UnexpectedInputException, ParseException, Exception { JdbcBatchItemWriter<DataPOJO> dataWriter = new JdbcBatchItemWriter<>(); dataWriter.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<DataPOJO>()); dataWriter.setSql(Constants.DATA_MERGE); dataWriter.setDataSource(mssDataSource); return dataWriter; }
Quelqu'un a-t-il des conseils pour améliorer les performances sur ces types d'emplois?
Quelqu'un a-t-il des conseils pour améliorer les performances sur ces types d'emplois?
Je voudrais aborder de cette façon ..
1.Voir les statistics d'attente pour le process que je cours
select * from sys.dm_exec_requests where session_id=<< your session id>>
Pour identifier votre sessionid, vous pouvez vérifier sys.processes
select spid,waittime,lastwaittype,status hostname, --below three columns help you identify your query/spid, program_name,--- you can replace spid in above query to get live status nt_username from sys.sysprocesses
2.Troubleshoot basé sur le type d'attente ..
Je voudrais d'abord insert vos loggings à une table source (personnellement, j'utiliserais une table temporaire) et puis tirer parti de la command MERGE
pour pousser les loggings de cette table "source" dans votre table "cible".
Un couple key de performance concerne:
UPDATE
Maintenant, pour accomplir cela avec Spring Batch, vous aurez probablement besoin d'un ItemWriter
composite (un sort de la boîte avec le framework). Le rédacteur délégué 1 serait le JdbcBatchItemWriter
vous utilisez déjà et serait inséré dans cette table source. Le rédacteur délégué 2 serait personnalisé et exécuterait simplement votre command MERGE
.