Thanks SO MUCH!  I'm sorry I didn't understand DB.synchronize(:read_only) 
as I piled through the documentation.  I promise I looked, but it wasn't 
making sense to me.  That's super helpful!

Thanks so much again!

Geff.

On Wednesday, December 9, 2020 at 2:19:22 PM UTC-8 Jeremy Evans wrote:

> On Wed, Dec 9, 2020 at 1:37 PM Geff Hanoian <[email protected]> wrote:
>
>> Jeremy,
>>
>> Thanks for everything.  You are always super help.  Cleanest software 
>> I've ever used.  I think everyone on this forum owes you a lifetime supply 
>> of scotch or whatever you drink. :)
>>
>> I did what you requested:
>> 1. made a super small app that just exercised this problem
>> 2. Added the logging as defined above (super helpful!)
>>
>> What I found is, it seems like DB.synchronize does not allocate anything 
>> when using a replica.  Is DB.synchronize correct for replicas?
>>
>> The following are the snip of code and log entries:  ( can post more of 
>> the code I just didn't want to inundate ).
>>
>> tester-primary.rb and tester-replicas.rb lines 25-28:
>>   DB.synchronize do
>>     x = Trip.order(:id).first.inspect
>>     y = Template.order(:id).first.inspect
>>   end
>>
>> app/models/template.rb:  ( super simple )
>> class Template < Sequel::Model
>>   many_to_one :user
>> end
>>
>> Querying primary: (seems correct, one NULL for both)
>> I, [2020-12-09T13:36:43.722029 #39120]  INFO -- : (0.000873s) (conn: 
>> 47271528492740) (source: tester-primary.rb:25:in `block in <top 
>> (required)>') SELECT NULL
>> I, [2020-12-09T13:36:43.723006 #39120]  INFO -- : (0.000753s) (conn: 
>> 47271528492740) (source: tester-primary.rb:26:in `block (2 levels) in <top 
>> (required)>') SELECT * FROM "trips" ORDER BY "id" LIMIT 1
>> I, [2020-12-09T13:36:43.723889 #39120]  INFO -- : (0.000452s) (conn: 
>> 47271528492740) (source: tester-primary.rb:27:in `block (2 levels) in <top 
>> (required)>') SELECT * FROM "templates" ORDER BY "id" LIMIT 1
>>
>> Query replica: (3 SELECT NULL)
>> I, [2020-12-09T13:35:51.502009 #39117]  INFO -- : (0.000418s) (conn: 
>> 46966930197660) (source: tester-replica.rb:25:in `block in <top 
>> (required)>') SELECT NULL
>> I, [2020-12-09T13:35:51.502847 #39117]  INFO -- : (0.000605s) (conn: 
>> 46966930244680) (source: tester-replica.rb:26:in `block (2 levels) in <top 
>> (required)>') SELECT NULL
>> I, [2020-12-09T13:35:51.504222 #39117]  INFO -- : (0.001229s) (conn: 
>> 46966930244680) (source: tester-replica.rb:26:in `block (2 levels) in <top 
>> (required)>') SELECT * FROM "trips" ORDER BY "id" LIMIT 1
>> I, [2020-12-09T13:35:51.505495 #39117]  INFO -- : (0.000398s) (conn: 
>> 46966930244680) (source: tester-replica.rb:27:in `block (2 levels) in <top 
>> (required)>') SELECT NULL
>> I, [2020-12-09T13:35:51.506530 #39117]  INFO -- : (0.000874s) (conn: 
>> 46966930244680) (source: tester-replica.rb:27:in `block (2 levels) in <top 
>> (required)>') SELECT * FROM "templates" ORDER BY "id" LIMIT 1
>>
>
> In Query replica, the first NULL (for the DB.synchronize line) is for a 
> different connection than your other ones.  Since you didn't provide a 
> shard to use, DB.synchronize will use the default shard.  However, internal 
> queries to get the columns will use the read_only shard by default, since 
> there isn't already a connection checked out for the read_only sharded, it 
> will checkout a connection for each query.  You want to make sure you pass 
> the appropriate shard name to DB.synchronize.  So if all access inside the 
> block should use the read_only shard, you want to checkout the read_only 
> shard:
>
> DB.synchronize(:read_only) do
>  
> If you want to use this block for both the default and read only cases, 
> you'll have to pick the argument you want to pass:
>
> DB.synchronize(use_replica ? :read_only : :default) do
>
> Where you have appropriately defined use_replica.
>
> Alternatively, you could look into using the server_block extension, which 
> allows all queries in a block to use a specified shard by default.
>
> Thanks,
> Jeremy
>

-- 
You received this message because you are subscribed to the Google Groups 
"sequel-talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/sequel-talk/32d66cd5-0723-4700-92a0-d48e5b8a3ff4n%40googlegroups.com.

Reply via email to