From cd107ca635e22c072cafd0e16c695da6a0a18304 Mon Sep 17 00:00:00 2001 From: "Brian J. Cardiff" Date: Thu, 30 Nov 2023 11:13:58 -0300 Subject: [PATCH] Drop checkout_some, simpler pool_prepared statement --- src/db/pool.cr | 21 ------------ src/db/pool_prepared_statement.cr | 56 ++----------------------------- 2 files changed, 2 insertions(+), 75 deletions(-) diff --git a/src/db/pool.cr b/src/db/pool.cr index 757e4e3..aeef2d6 100644 --- a/src/db/pool.cr +++ b/src/db/pool.cr @@ -158,27 +158,6 @@ module DB end end - # ``` - # selected, is_candidate = pool.checkout_some(candidates) - # ``` - # `selected` be a resource from the `candidates` list and `is_candidate` == `true` - # or `selected` will be a new resource and `is_candidate` == `false` - def checkout_some(candidates : Enumerable(WeakRef(T))) : {T, Bool} - sync do - candidates.each do |ref| - resource = ref.value - if resource && is_available?(resource) - @idle.delete resource - resource.before_checkout - return {resource, true} - end - end - end - - resource = checkout - {resource, candidates.any? { |ref| ref.value == resource }} - end - def release(resource : T) : Nil idle_pushed = false diff --git a/src/db/pool_prepared_statement.cr b/src/db/pool_prepared_statement.cr index 388b3b2..164ae75 100644 --- a/src/db/pool_prepared_statement.cr +++ b/src/db/pool_prepared_statement.cr @@ -5,74 +5,22 @@ module DB # # See `PoolStatement` class PoolPreparedStatement < PoolStatement - # connections where the statement was prepared - @connections = Set(WeakRef(Connection)).new - @mutex = Mutex.new - def initialize(db : Database, query : String) super - # Prepares a statement on some connection - # otherwise the preparation is delayed until the first execution. - # After the first initialization the connection must be released - # it will be checked out when executing it. - - # This only happens if the db is configured to use prepared statements cache. - # Without that there is no reference to the already prepared statement we can - # take advantage of. - if db.prepared_statements_cache? - statement_with_retry &.release_connection - end - - # TODO use a round-robin selection in the pool so multiple sequentially - # initialized statements are assigned to different connections. end protected def do_close - @mutex.synchronize do - # TODO close all statements on all connections. - # currently statements are closed when the connection is closed. - - # WHAT-IF the connection is busy? Should each statement be able to - # deallocate itself when the connection is free. - @connections.clear - end end # builds a statement over a real connection - # the connection is registered in `@connections` private def build_statement : Statement - clean_connections - - conn, existing = @mutex.synchronize do - @db.checkout_some(@connections) - end - + conn = @db.pool.checkout begin - stmt = conn.prepared.build(@query) + conn.prepared.build(@query) rescue ex conn.release raise ex end - if !existing && @db.prepared_statements_cache? - @mutex.synchronize do - @connections << WeakRef.new(conn) - end - end - stmt - end - - private def clean_connections - return unless @db.prepared_statements_cache? - - @mutex.synchronize do - # remove disposed or closed connections - @connections.each do |ref| - conn = ref.value - if !conn || conn.closed? - @connections.delete ref - end - end - end end end end