【问题标题】:jdbc keep prepared statement in memory?jdbc将准备好的语句保留在内存中?
【发布时间】:2015-07-12 21:14:51
【问题描述】:

我正在为我的 sqlite 日志记录数据库使用准备好的语句。

我的线程每 50 毫秒运行一次,将日志缓冲区中的内容写入数据库。

目前我正在为每个线程运行一个新的准备好的语句批处理,并在写入所有数据行后关闭它们。

现在我想知道是否最好将准备好的语句保留在内存中并仅在线程关闭/中断时关闭它?

我做这个预优化的原因是因为我希望这个日志线程尽可能少地干扰主应用程序的性能,我可以想象每 50 秒分配/解析/验证资源可能比将准备好的语句保存在内存中。

最后,我认为我的数据库中需要为各种日志类型准备大约 20-30 条准备好的语句。那么在需要时将它们初始化为新的准备好的语句会更好,还是我应该只初始化一次并将准备好的语句保留在内存中?

【问题讨论】:

    标签: java sqlite jdbc


    【解决方案1】:

    这是我的两分钱:-

    如果您的目的只是两个保存打开/关闭准备好的语句。我认为您不会在这里获得太多比较内存开销。昂贵的操作是打开/关闭连接而不是声明。而且我相信您一定已经为此使用了池

    此外,当您使用准备好的语句时,DB 获取此语句后,它会立即编译并缓存它,以便它可以使用最后编译的语句来连续调用同一语句。因此它会为连续调用进行预编译。所以从这个角度来看,保存在内存中并没有帮助。

    【讨论】:

    • 如果我理解正确,那么数据库实际上会缓存准备好的语句本身?很高兴知道。是的,当线程启动时,我打开了连接并保持打开状态,直到应用程序/线程关闭。但是,如果我选择将准备好的语句保留在内存中,可能会遇到什么问题?对此有何见解?
    • 正如我所说,这没有任何问题。如果您获得性能改进,那就去吧。但如果你不这样做,它的性能开销
    【解决方案2】:

    执行多个Prepared Statement的简单答案是使批处理过程变得简单,只需将所有语句添加到批处理并通过执行批处理一次执行所有语句。这将通过在单个实例中执行多个查询来节省处理。 在每条数据线之后更新你就可以了,这样你就会有更好的日志。每次执行所有这些查询时都尝试一个 while() 循环。可能有助于在每次执行数据插入后输入日志。

    【讨论】:

    • 我目前正在做的是准备好语句,然后进入一个最多 25 行的迭代器循环写入数据库,并将 Iterator.next() 返回的 LogObject 的内容放入数据库,然后在每行之后在循环结束时调用 executeUpdate()。这是你的意思吗?
    • 您首先需要同时执行多个查询。所以首先描述要批处理的所有语句 statement.addBatch() 以这种方式添加所有语句并将 statement .executeBatch()
    猜你喜欢
    • 1970-01-01
    • 2017-04-12
    • 2013-12-06
    • 1970-01-01
    • 1970-01-01
    • 2011-08-06
    • 2015-04-15
    • 1970-01-01
    • 2015-07-19
    相关资源
    最近更新 更多