Как сделать пакетную вставку в Oracle Database - PullRequest
0 голосов
/ 28 марта 2019

Мне нужна вставка make batch в базу данных Oracle, но я не совсем понимаю, как сделать этот пакет.

String INSERT = "INSERT INTO LOGS(METHOD,USER,START_DATE,RESPONSE_TIME,IS_ERROR) VALUES (?,?,?,?,?)";

private synchronized void saveToDBAndClear(ConcurrentHashMap<Long, Logs> logs) {
    List<Logs> list = new ArrayList<>(logs.values());
    logService.insertLog(list);
    initLogMap();
}


    public void insertLog(List<Logs> logsList) {

        int[] insertedLog = jdbcTemplate.batchUpdate(INSERT, new BatchPreparedStatementSetter() {

            @Override
            public void setValues(PreparedStatement ps, int i) throws SQLException {
                ps.setString(1, logsList.get(i).getMethod());
                ps.setString(2, logsList.get(i).getUser());
                ps.setTimestamp(3, logsList.get(i).getStartDate());
                ps.setLong(4, logsList.get(i).getResponseTime());
                ps.setString(5, logsList.get(i).getIsError());
            }

            @Override
            public int getBatchSize() {
                return logsList.size();
            }
        });
        logger.info("It was inserted {} logs into Logs", insertedLog.length);
    }

И я должен сделать

List<Logs> list = new ArrayList<>(logs.values());

потому что я не знаю, как использовать jdbcTemplate.batchUpdate()

для каждого ConcurrentHashMap и сбор партии в объеме 100 или 1000 для отправки в БД.

Может кто-нибудь помочь мне с этим?

приписка

Я пытался с этим

public class LogProcessor {
private int batchSize = 10;
private final double initialCapacity = 1.26;
private ConcurrentHashMap<Long, Logs> logMap;
private AtomicLong logMapSize;

    private void initLogMap() {
this.logMap = new ConcurrentHashMap<>((int) (batchSize * initialCapacity));
this.logMapSize = new AtomicLong();
    }

public void process(LogKeeper keeper){
 LogHandler log = keeper.getLog();
 Long i = logMapSize.incrementAndGet();
 logMap.put(i, log.toJdbc());
 System.out.println("Lines inside the map = "+logMap.size());
 if (i % batchSize == 0) {
  System.out.println("Reached batchSize and = " + batchSize);
                    saveToDBAndClear(logMap);
                }

private synchronized void saveToDBAndClear(ConcurrentHashMap<Long, Logs> logs) {
List<Logs> list = new ArrayList<>(logs.values());
System.out.println("Created list with size = "+ list.size());
logService.insertLog(list);
initLogMap();
System.out.println("Now size of map = "+ logs.size()+" and AtomicLong = "+logMapSize.intValue() );
}

    @TransactionalRollback
    public void insertLog(List<Logs> logsList) {
        System.out.println("Inside insertLog method");
        int[][] insertedLog=jdbcTemplate.batchUpdate(INSERT, logsList, 15, (ps, arg) -> {
            ps.setString(1, arg.getMethod());
            ps.setString(2, arg.getClient());
            ps.setTimestamp(3, arg.getStartDate());
            ps.setLong(4, arg.getResponseTime());
            ps.setString(5, arg.getIsError());
        });
        System.out.println("It was inserted " + insertedLog[0].length + " logs into DB");
    }
}

And there is some log information

А теперь, как видите. Мой batchSize в качестве частного поля равен 10. В batchUpdate я поставил 15. Я полагаю, что если я отправлю в список методов insertLog, например, с размером, равным 1 или 100, он будет собираться в пакеты с размером, равным 15, и будет отправлять в БД, но во вставке только тот том, список которого состоит.

Из-за этого я должен собрать именно тот batchSize, который мне нужен в моей карте, а затем отправить его в метод insertLog. Если бы я мог, я бы отправил только logs log в метод insertLog и поместил что-то вроде

 public void insertLog(Logs logs){
jdbcTemplate.batchUpdate(INSERT, logs, 1000, (ps, arg) ->(...));}

После этого П.С. кто-нибудь может помочь с этой вставкой bathSize? Можно ли сделать batchInsert или batchUpdate без такой простой проверки, как 10% batchSize = 0?

1 Ответ

0 голосов
/ 29 марта 2019

Взгляните на PLSQLSample.java для справки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...