News for hackers. Stuff that matters.
Re:Understanding Connections and Pools by tjvc on Tuesday January 05, 2021 @05:30PM (#25652121)
Great article, many thanks.

> Rails auto-management needs to be conservative and cautious, therefore inefficient

Can you help me understand this better? Are you saying that Rails tends to hold onto connections for longer than it needs to?

Re:Understanding Connections and Pools by sudhirj on Wednesday January 06, 2021 @02:20AM (#25655387)
Yeah, Rails doesn't currently strongly analyze what it needs to do. Based on my experience with it, I remember that it either 1) checks out a connection at the beginning of the request into a thread local / request context and releases it at the end of the request, or 2) checks out when the first active record work is attempted, and releases at the end of the request.

Either way, if you have a request flow of 1) DB read - 50ms 2) Network request - 200ms 3) DB write - 50ms, you can see that the connection is idle for 2/3 of your request handling time. Rails does this so that if you start a transaction in step 1 you can commit it in step 3. All your writes are also automatically wrapped in a transaction, I think.

In Go on the other hand, step 1 will checkout and release the connection immediately, and step 3 will checkout and release. So the connection isn't idle locked for the 200ms in step 2. But if you don't remember this explicitly and try in step 3 to finish something (transaction/advisory lock/prepared statement) that you started in step 1, you're screwed.

So Rails saved you from doom by holding onto a connection for an inefficient extra 200ms, and Go shoots you in the foot in the name of efficiency.

Re:Understanding Connections and Pools by tjvc on Wednesday January 06, 2021 @05:15AM (#25656318)
That makes a lot of sense - thanks for explaining! :)