【发布时间】:2019-10-22 10:58:57
【问题描述】:
据我了解,每次初始化 PreparedStatement 时,该语句都会缓存在为数据库连接分配的内存中。因此,如果初始化过多的PreparedStatement 变量,则存在溢出可用于连接的内存的风险。
是否通过在
PreparedStatement实例上调用close()来释放缓存的内存?两个包含相同 SQL 的
PreparedStatement是否会创建重复的缓存事件,或者数据库是否足够智能,不会缓存重复PreparedStatement的新实例?
示例1,这样会不会溢出连接内存?:
while (true) {
PreparedStatement ps = connection.prepareStatement("SELECT id + ? FROM tbl");
ps.setDouble(1, Math.random());
ps.executeQuery();
ps.close();
}
如果会,那这个呢?
while (true) {
PreparedStatement ps = connection.prepareStatement("SELECT id FROM tbl");
ps.executeQuery();
ps.close();
}
【问题讨论】:
-
"立即释放此 Statement 对象的数据库和 JDBC 资源,而不是等待它自动关闭时发生这种情况。通常在完成资源后立即释放资源以避免捆绑数据库资源。”
-
你的问题太宽泛了。您正在为两个不同的数据库(MySQL 和 PostgreSQL)询问两个不同的事情(关闭时释放内存,并在
PreparedStatement实例之间共享准备好的语句信息)。每个问题请专注于一件事。
标签: java mysql sql postgresql jdbc