如何强制BufferedWriter在特定位置分解数据?

时间:2019-06-19 19:40:11

标签: java sqlite bufferedwriter

我正在使用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 :(得分:0)

当您写入BufferedWriter时,它只会将写入的内容保存在缓冲区中。在选择的某个时候,它将把数据发送到底层字符流。您无法控制何时发生,但可以告诉它刷新。如果要在流的另一端获取部分数据,则表明其余数据位于缓冲区中。

所以您的选择是

  • 在完成查询后刷新BufferedWriter(但是,如果这对您有用,那么从缓冲中获得什么好处?)
  • 为用户提供无缓冲的普通Writer-写入后即发送数据(但这不是您通常与数据库进行通信的方式,因此从字符流中获得什么好处?)
  • 完全不使用Writer-JDBC是与数据库或围绕它的包装(如JPA或Hibernate)进行通信的常用方法。

您说数据库写入是一个瓶颈。如果有许多小写操作,缓冲可以提高性能:它们以较大的块发送。但是,如果要发送大量数据,缓冲将无济于事。