我在這個 stackoverflow 答案(https://stackoverflow.com/a/56336447/9098559)上看到 hikari 不支持 PreparedStatement 快取。
我還在 Hikari CP 檔案中看到了它。
許多連接池,包括 Apache DBCP、Vibur、c3p0 等都提供 PreparedStatement 快取。HikariCP 沒有。為什么?
但是,在 Hikari cp 檔案的示例代碼中設定了準備陳述句快取。(https://github.com/brettwooldridge/HikariCP#rocket-initialization)
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://localhost:3306/simpsons");
config.setUsername("bart");
config.setPassword("51mp50n");
config.addDataSourceProperty("cachePrepStmts", "true");
config.addDataSourceProperty("prepStmtCacheSize", "250");
config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
HikariDataSource ds = new HikariDataSource(config);
Hikari說它不支持快取,但是為什么我可以配置快取呢?上面是什么cachePrepStmts意思?
uj5u.com熱心網友回復:
許多連接池,包括 Apache DBCP、Vibur、c3p0 等都提供 PreparedStatement 快取。HikariCP 沒有。為什么?
Hikari本身不支持/提供快取,它將快取委托給正在使用的底層資料源,在本例中為 MySQL 資料源。這些屬性直接在底層 MySQL 資料源上設定以進行快取。例如,這些設定在 Postgres 上不起作用(它們在那里有不同的名稱)。Hikari“只是”一個連接池,僅此而已,僅此而已,它委托給底層使用的資料源/jdbc驅動程式的其他一切。
如果您閱讀了檔案,那也是其中解釋的內容。
在連接池層,PreparedStatements 只能按連接快取。如果您的應用程式有 250 個經常執行的查詢和一個包含 20 個連接的池,則您要求您的資料庫保留 5000 個查詢執行計劃——同樣,池必須快取這么多 PreparedStatement 及其相關的物件圖。
大多數主要的資料庫 JDBC 驅動程式已經有一個可以配置的陳述句快取,包括 PostgreSQL、Oracle、Derby、MySQL、DB2 等等。JDBC 驅動程式在利用資料庫特定功能方面處于獨特的地位,并且幾乎所有快取實作都能夠跨連接共享執行計劃。這意味著,您的 250 個經常執行的查詢會在資料庫中產生恰好 250 個執行計劃,而不是記憶體中的 5000 個陳述句和相關的執行計劃。聰明的實作甚至不在驅動程式級別的記憶體中保留 PreparedStatement 物件,而只是將新實體附加到現有計劃 ID。
這是檔案中的部分,突出顯示的部分準確解釋了為什么 Hikari 本身不提供快取,而是將其委托給正在使用的驅動程式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/445193.html
標籤:mysql 春天 数据库 准备好的陈述 hikaricp
