我正在开发一个Sping Boot Web(REST)应用程序,我需要为许多请求提供服务。因此,我希望我的应用程序能够并发处理请求。由于Spring Boot REST服务是开箱即用的并发可用服务,我只需要使(PostgreSQL)数据库访问可以并发访问。为此,我使用了HikariCP数据源。
由于我的很多语句都是预处理语句,因此我将它们收集在一个方法中,在该方法中,我为每个语句调用一次pstmt = connection.prepareStatement("SQLCODE");
。然后,当处理来自REST服务的用户交互时,这些预处理语句将在各种方法中使用。
现在,当我使用HikariCP时,我不能再这样做了,是吗?当我准备一条语句时,这条语句绑定到一个连接。如果我试图并发访问它,我不能,因为连接不是共享的。
我是否遗漏了什么?如何解决这个问题?我是否需要从池中检索连接,在本地准备语句,执行查询,然后关闭连接?如果是,那么使用预准备语句的意义是什么(除了防止SQL注入)?
我知道这些语句是由PostreSQL端缓存的。那么,保留准备好所有预处理语句的方法会是个好主意吗?将它们发送到数据库缓存。然后在本地再次创建相同的语句。这样,人们可能仍然可以利用数据库的缓存可能性。但另一方面,这将是一个非常难看的代码。
我正在使用Spring:5.3.10、Java语言:11、PostgreSQL:14.0
第一个
先谢谢你。
1条答案
按热度按时间rbpvctlc1#
请读取https://github.com/brettwooldridge/HikariCP处的部分语句缓存
许多连接池,包括Apache DBCP、Vibur、c3p0和其他连接池都提供PreparedStatement缓存。HikariCP没有。为什么?
所以它不缓存。如果你读了解释,也许你会决定你不需要它。