当前位置: 首页 > 知识库问答 >
问题:

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

叶举
2023-03-14

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

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

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

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

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

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

共有2个答案

齐乐
2023-03-14

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

邵正雅
2023-03-14

这是我的两分钱:-

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

此外,当您使用prepared语句时,DB一旦获得该语句,就会对其进行编译和缓存,以便可以使用最后编译的语句连续调用同一语句。因此,它是为连续调用预编译的。因此,从这个角度来看,记忆在这里没有帮助。

 类似资料:
  • 我正在尝试使用准备好的语句和TABLE_CATALOG和table_schema的参数来选择默认模式'public'中的所有表。当我创建一个准备好的语句时,系统会返回一个错误,这没有任何意义。如果我指定了TABLE_CATALOG而不指定TABLE_SCHEMA,它可以很好地工作。另外,如果指定TABLE_SCHEMA而不指定TABLE_CATALOG,它也可以正常工作。我是不是做错什么了? 线程

  • 我目前正在增强一个使用spring和Hibernate的应用程序。有多个应用程序通过准备好的语句与db(postgres)通信的实例。到目前为止,应用程序通过DBCP与postgres通信。 更改:应用程序现在通过pgbouncer与postgres通信。 即:application->dbcp->pgbouncer->postgres 我知道这不是最理想的解决方案,即:有两个池。但由于当前的体系

  • 我正在使用JDBC执行Oracle语句,如下所示: 我在Java找到了几种称呼上面的声明的方法,主要是: > 使用OraclePreparedStatement: 使用CallableStatement: > 方法#2抛出“SQLException:Not all return parameters registered”,但是,如果我将SQL语句包装为“begin..end;”-那么方法2就很好

  • 但是,我不能让它在JDBC驱动程序上作为一个准备好的语句工作。id的值应该是一个参数,因此我尝试将其作为传递给: 在这里,当我尝试设置参数时,我得到了以下异常: 当我尝试以下任一操作时,参数设置正确:

  • 我一直在读一些较新的JDBC连接池(如Tomcat)不支持客户端语句池。我已经读到,这是因为大多数JDBC驱动程序都维护自己的语句缓存。然而,我不认为PostgreSQL会发生这种情况。 我说的对吗?如果是这样,我应该使用一个连接池来缓存准备好的语句,以获得最佳的批插入性能吗? 谢谢

  • 我有一个类,其中我使用旧的jdbc方法创建了到h2数据库的连接,该方法编写url并获取连接,我在数据库中创建了一个表,这个表不是java对象,所以我用尽了聪明的方法来为我的方法编写测试 //我还创建了一个表app_user公共void addUser(连接连接,字符串登录,字符串密码,字符串描述)抛出SQLException{ 而我的测试方法看起来像这样,有没有办法让它不那么整洁,更简单,我试图用