【问题标题】:How can I force BufferedWriter to break up data at specific places?如何强制 BufferedWriter 在特定位置分解数据?
【发布时间】:2019-06-19 19:40:11
【问题描述】:

我正在使用 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 所以选择在那里分解它。

【问题讨论】:

  • 我们来看一些代码
  • 这里是主要的XY problem。改变 BufferedWriter 写入数据的方式并不是一个好的攻击计划。向我们展示您的代码。给我们上下文。我保证那里有更好的答案。
  • 老实说,这只是与数据库交互的一种糟糕方式。通过网络发送查询并让它分块读取它们是荒谬的。
  • 呃...你为什么不用jdbc之类的?
  • @LouisWasserman 为什么?如果每次我有数据要插入我都必须将数据发送到数据库,这似乎有点低效......等到我有一堆数据并一次插入它们不是更有意义吗?

标签: java sqlite bufferedwriter


【解决方案1】:

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

所以你的选择是

  • 在您完成查询后刷新BufferedWriter(但如果这对您有用,您从缓冲中得到什么好处?)
  • 使用没有缓冲的普通Writer - 数据在您写入后立即发送(但这不是您通常与数据库对话的方式,那么您从字符流中获得什么好处?)
  • 根本不要使用Writer - JDBC 是与数据库或诸如 JPA 或 Hibernate 之类的一些包装器对话的常用方式。

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

【讨论】:

    猜你喜欢
    • 2012-03-28
    • 1970-01-01
    • 2016-06-10
    • 2012-04-16
    • 2019-03-24
    • 1970-01-01
    • 2017-09-02
    • 1970-01-01
    • 2013-09-30
    相关资源
    最近更新 更多