mirror of
https://gitea.invidious.io/iv-org/shard-crystal-db.git
synced 2024-08-15 00:53:32 +00:00
Allow prepared_statements_cache=false option to disable prepared statements cache (#194)
* Add prepared_statements_cache in connection to opt-out * Honor prepared_statements_cache option in database also
This commit is contained in:
parent
9b52a65752
commit
285e865e3a
4 changed files with 51 additions and 4 deletions
|
@ -239,6 +239,24 @@ describe DB::Database do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe "prepared_statements_cache connection option" do
|
||||||
|
it "should reuse prepared statements if true" do
|
||||||
|
with_dummy "dummy://localhost:1027?prepared_statements=true&prepared_statements_cache=true" do |db|
|
||||||
|
stmt1 = db.build("the query")
|
||||||
|
stmt2 = db.build("the query")
|
||||||
|
stmt1.object_id.should eq(stmt2.object_id)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
it "should not reuse prepared statements if false" do
|
||||||
|
with_dummy "dummy://localhost:1027?prepared_statements=true&prepared_statements_cache=false" do |db|
|
||||||
|
stmt1 = db.build("the query")
|
||||||
|
stmt2 = db.build("the query")
|
||||||
|
stmt1.object_id.should_not eq(stmt2.object_id)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
describe "unprepared statements in pool" do
|
describe "unprepared statements in pool" do
|
||||||
it "creating statements should not create new connections" do
|
it "creating statements should not create new connections" do
|
||||||
with_dummy "dummy://localhost:1027?initial_pool_size=1" do |db|
|
with_dummy "dummy://localhost:1027?initial_pool_size=1" do |db|
|
||||||
|
|
|
@ -34,6 +34,24 @@ describe DB::Statement do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe "prepared_statements_cache flag" do
|
||||||
|
it "should reuse prepared statements if true" do
|
||||||
|
with_dummy_connection("prepared_statements=true&prepared_statements_cache=true") do |cnn|
|
||||||
|
stmt1 = cnn.query("the query").statement
|
||||||
|
stmt2 = cnn.query("the query").statement
|
||||||
|
stmt1.object_id.should eq(stmt2.object_id)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
it "should not reuse prepared statements if false" do
|
||||||
|
with_dummy_connection("prepared_statements=true&prepared_statements_cache=false") do |cnn|
|
||||||
|
stmt1 = cnn.query("the query").statement
|
||||||
|
stmt2 = cnn.query("the query").statement
|
||||||
|
stmt1.object_id.should_not eq(stmt2.object_id)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
it "should initialize positional params in query" do
|
it "should initialize positional params in query" do
|
||||||
with_dummy_connection do |cnn|
|
with_dummy_connection do |cnn|
|
||||||
stmt = cnn.prepared("the query").as(DummyDriver::DummyStatement)
|
stmt = cnn.prepared("the query").as(DummyDriver::DummyStatement)
|
||||||
|
|
|
@ -25,10 +25,13 @@ module DB
|
||||||
|
|
||||||
record Options,
|
record Options,
|
||||||
# Return whether the statements should be prepared by default
|
# Return whether the statements should be prepared by default
|
||||||
prepared_statements : Bool = true do
|
prepared_statements : Bool = true,
|
||||||
|
# Return whether the prepared statements should be cached or not
|
||||||
|
prepared_statements_cache : Bool = true do
|
||||||
def self.from_http_params(params : HTTP::Params, default = Options.new)
|
def self.from_http_params(params : HTTP::Params, default = Options.new)
|
||||||
Options.new(
|
Options.new(
|
||||||
prepared_statements: DB.fetch_bool(params, "prepared_statements", default.prepared_statements)
|
prepared_statements: DB.fetch_bool(params, "prepared_statements", default.prepared_statements),
|
||||||
|
prepared_statements_cache: DB.fetch_bool(params, "prepared_statements_cache", default.prepared_statements)
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -49,7 +52,11 @@ module DB
|
||||||
|
|
||||||
# :nodoc:
|
# :nodoc:
|
||||||
def fetch_or_build_prepared_statement(query) : Statement
|
def fetch_or_build_prepared_statement(query) : Statement
|
||||||
|
if @options.prepared_statements_cache
|
||||||
@statements_cache.fetch(query) { build_prepared_statement(query) }
|
@statements_cache.fetch(query) { build_prepared_statement(query) }
|
||||||
|
else
|
||||||
|
build_prepared_statement(query)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# :nodoc:
|
# :nodoc:
|
||||||
|
|
|
@ -95,7 +95,11 @@ module DB
|
||||||
|
|
||||||
# :nodoc:
|
# :nodoc:
|
||||||
def fetch_or_build_prepared_statement(query) : PoolStatement
|
def fetch_or_build_prepared_statement(query) : PoolStatement
|
||||||
|
if @connection_options.prepared_statements_cache
|
||||||
@statements_cache.fetch(query) { build_prepared_statement(query) }
|
@statements_cache.fetch(query) { build_prepared_statement(query) }
|
||||||
|
else
|
||||||
|
build_prepared_statement(query)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# :nodoc:
|
# :nodoc:
|
||||||
|
|
Loading…
Reference in a new issue