gpt4 book ai didi

java - 编译后的预备语句是存储在对象中还是一般情况下?

转载 作者:行者123 更新时间:2023-12-02 03:05:55 24 4
gpt4 key购买 nike

我知道,第一次使用时,jdbc 会将已编译的准备好的语句保存在某处,以便下次以更有效的方式访问它。

现在,假设我遇到这种情况:

public class MyDao{
public void doQuery(){
try(PreparedStatement stmt = connection.prepareStatement(MY_STMT)){

}
}

}

以下两个片段都会将编译后的准备好的语句保留在内存中吗?

片段 1:

MyDao dao = new MyDao();
dao.doQuery(); //first one, expensive
dao.doQuery(); //second one, less expensive as it has been already compiled

片段 2:

MyDao dao = new MyDao();
dao.doQuery(); //first one, expensive
MyDao dao2 = new MyDao();
dao2.doQuery(); //will it be expensive or less expensive?

我担心,通过创建一个新的 dao 对象,jvm 会将准备好的语句视为新语句,因此不会对其进行编译。

如果不是这样的话,是否存在jvm会“忘记”编译过的语句而重新编译的情况?

谢谢

最佳答案

准备好的语句重用的最基本场景是您的代码保持 PreparedStatement 打开并重用该准备好的语句。您的示例代码不符合此条件,因为您关闭了准备好的语句。另一方面,尝试为多个方法调用保持打开准备好的语句通常不是一个好计划,因为存在潜在的并发问题(例如,如果多个线程使用相同的 DAO,则可能会执行来自多个线程的奇怪的值组合等) .

一些 JDBC 驱动程序在内部有一个(可选)准备好的语句缓存(池)以供重用,但只有当尝试在同一物理连接上再次准备相同的语句文本时,才会发生重用。检查驱动程序的文档。

在一个单独的级别上,数据库系统可能会缓存准备好的语句的执行计划,并且如果再次准备相同的语句文本(即使对于不同的连接),它可以(将)重用该计划。

关于java - 编译后的预备语句是存储在对象中还是一般情况下?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41745011/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com