Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java jdbc是否在内存中保留准备好的语句?_Java_Sqlite_Jdbc - Fatal编程技术网

Java jdbc是否在内存中保留准备好的语句?

Java jdbc是否在内存中保留准备好的语句?,java,sqlite,jdbc,Java,Sqlite,Jdbc,我正在为我的sqlite日志数据库使用准备好的语句 我的线程每50毫秒运行一次,将日志缓冲区中的内容写入数据库 目前,我正在为每个线程运行创建一个新的预处理语句批,并在写入所有数据行后关闭它们 现在我想知道是否最好将准备好的语句保存在内存中,并仅在线程关闭/中断时关闭它 我之所以进行这种预优化,是因为我希望这个日志线程对主应用程序性能的影响尽可能小,并且我可以想象每50秒分配/解析/验证资源可能比将准备好的语句保存在内存中更为密集 最后,我想我需要在数据库中为各种日志类型准备大约20-30条语句

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

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

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

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

我之所以进行这种预优化,是因为我希望这个日志线程对主应用程序性能的影响尽可能小,并且我可以想象每50秒分配/解析/验证资源可能比将准备好的语句保存在内存中更为密集


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

这是我的两分钱:-

如果您的目的仅仅是两个,请保存开始/结束准备好的语句。我认为你在这里不会得到太多的内存开销。昂贵的操作是打开/关闭连接,而不是语句。我相信你一定已经在使用池了


另外,当您使用prepared语句时,只要DB获得该语句,它就会编译并缓存该语句,以便它可以使用最后一条编译的语句连续调用同一语句。因此,它是为连续调用而预编译的。因此,从这个角度来看,在内存中保存没有帮助。

这是我的两分钱:-

如果您的目的仅仅是两个,请保存开始/结束准备好的语句。我认为你在这里不会得到太多的内存开销。昂贵的操作是打开/关闭连接,而不是语句。我相信你一定已经在使用池了


另外,当您使用prepared语句时,只要DB获得该语句,它就会编译并缓存该语句,以便它可以使用最后一条编译的语句连续调用同一语句。因此,它是为连续调用而预编译的。因此,从这个角度来看,在内存中保存没有帮助。

执行多个准备好的语句的简单答案是使批处理过程变得简单,就像将所有语句添加到批处理中,然后通过执行批处理一次执行所有语句一样。这将通过在单个实例上执行多个查询来节省处理。
通过在每个数据行之后进行更新,您可以正常运行,这样您将拥有更好的日志。每次同时执行所有这些查询时,请尝试执行while()循环。可能有助于在每次执行数据插入后输入日志。

执行多个准备好的语句的简单答案是使批处理过程变得简单,就像将所有语句添加到批处理中并通过执行批处理一次执行所有语句一样。这将通过在单个实例上执行多个查询来节省处理。
通过在每个数据行之后进行更新,您可以正常运行,这样您将拥有更好的日志。每次同时执行所有这些查询时,请尝试执行while()循环。可能有助于在每次执行数据插入后输入日志。

所以如果我理解正确,数据库实际上会缓存准备好的语句本身?很高兴知道。是的,当线程启动时,我打开了连接,它保持打开状态,直到应用程序/线程关闭。但是,如果我选择将准备好的语句保存在内存中,会有什么收获呢?这方面有什么见解吗?正如我所说的,这是没有道理的。如果你的表现有所改善,那就努力吧。但是如果你不这样做,它的性能会有很大的开销。如果我理解正确的话,数据库实际上会缓存准备好的语句吗?很高兴知道。是的,当线程启动时,我打开了连接,它保持打开状态,直到应用程序/线程关闭。但是,如果我选择将准备好的语句保存在内存中,会有什么收获呢?这方面有什么见解吗?正如我所说的,这是没有道理的。如果你的表现有所改善,那就努力吧。但如果您不这样做,它的性能就会受到影响。我目前正在做的是生成prepared语句,然后进入一个最多25行的迭代器循环,将迭代器.next()返回的LogObject的内容写入数据库,然后在每行之后的循环末尾调用executeUpdate()。这就是你的意思吗?你首先需要一起执行多个查询。因此,首先将所有语句描述为batch语句。addBatch()以这种方式添加所有语句,并放置该语句。executeBatch()我当前正在做的是生成准备好的语句,然后进入迭代器循环,最多25行写入数据库,并将迭代器返回的LogObject的内容放入其中。next()然后在每行之后的循环末尾调用executeUpdate()。这就是你的意思吗?你首先需要一起执行多个查询。因此,首先将所有语句描述为batch statement.addBatch()以这种方式添加所有语句,并放置该语句。executeBatch()