Как заставить BufferedWriter разбивать данные в определенных местах? - PullRequest
0 голосов
/ 19 июня 2019

Я использую BufferedWriter для отправки данных в базу данных, (я знаю, что это не совсем то, для чего она предназначена ... не спрашивайте. В основном мне нужно войти в базу данных, но буферизировать данные, чтобы мы моглине заканчивайте с большим узким местом), и я сталкиваюсь с проблемой, что писатель разбивает данные в неудобных местах (как в середине инструкции вставки), который вызывает ошибки очевидно.Есть ли способ заставить писателя отправлять только полные куски данных?или все, что я могу сделать, просто позвонить .write и посмотреть, что произойдет?(Установка размера байта не поможет, потому что есть много опций для различных типов операторов вставки)

//insertArray is a char[] that's being sent to BufferedWriter's .write method. 
//It contains the information for one record. (I know this is not ideal because of sql injection, 
//and I would prefer to send a prepared statement, but I'm using SQLlite which apparently doesn't support conversion of prepared statements to strings). 
private void callInsert() {

    try {

        writer.write(insertArray, 0, insertArray.length);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

Затем метод .write в моем классе открывает соединение с базой данных и отправляет любые данные, которые он имеет, как единое целое.длинное утверждение: как это:

insert into students(fname, lname, id) values(('Bob', 'Green', '5), ('Jake', 'Klein', '7')); 

В идеале я хотел бы обрезать данные после последней полной вставки перед записью, а затем добавить остальные к следующей записи.Моя текущая проблема заключается в том, что я мог бы получить следующее:

insert into students(fname, lname, id) values(('Bob', 'Green', '5), ('Jake', 'Klein

, если BufferedWriter решит разбить его там.

1 Ответ

0 голосов
/ 20 июня 2019

Когда вы пишете в BufferedWriter, он просто сохраняет ваши записи в буфере. В какой-то момент своего выбора он отправит эти данные в основной поток символов. Вы не можете контролировать, когда это произойдет, за исключением того, что вы можете сказать ему сбросить. Если вы получаете частичные данные на другом конце потока, это говорит о том, что остальные находятся в буфере.

Так что ваши варианты

  • сбросьте BufferedWriter после завершения запроса (но если это работает для вас, какую выгоду вы получите от буферизации?)
  • пользователь обычный Writer без буферизации - данные отправляются, как только вы пишете (но это не то, как вы обычно общаетесь с базой данных, так что вы получаете от потока символов?)
  • вообще не используйте Writer - JDBC - это обычный способ общения с базой данных или какой-то оберткой вокруг нее, такой как JPA или Hibernate.

Вы говорите, что записи в вашу базу данных являются узким местом. Буферизация может улучшить производительность, если у вас много небольших записей: они отправляются большими кусками. Но буферизация не поможет вам, если у вас есть большой объем данных для отправки.

...