On Mon, Jul 24, 2017 at 9:11 AM, George Neuner <[email protected]> wrote:

> Hi David,
>
> On 7/24/2017 8:18 AM, David Storrs wrote:
>
> What happens in the following code?
>
> (define dbh (postgresql-connect ...))
>
> ;; Use the DBH in a new thread
> (thread (thunk
>   (while ...some long-running condition...
>     (sleep 1) ; don't flood the DB
>     (query-exec dbh "insert into users ..."))))
>
> ;; And in the main thread
> (query-exec dbh ...)
>
> I now have a database object that's being shared between two threads,
> yes?  Or is the object copied when the new thread is created and, if so,
> what will that do to the underlying connection to the DB?
>
>
> The single DBMS connection is being shared by the 2 threads.  That's a
> recipe for disaster if both try to use it simultaneously.
>
>
> New scenario:
>
> (define dbh (postgresql-connect ...))
> (define current-dbh (make-parameter dbh))
> (query-value (current-dbh) "select ...")
> (sleep 1000000)
> (query-value (current-dbh) "select ...")
>
> I would expect the first query-value to work but by the time the second
> runs the handle has probably been disconnected by the database and the
> query will throw an exception.  Am I understanding that properly?
>
>
> After sleeping 11.6 days?  Probably.   But it depends on the connection
> keep-alive settings.  By default, Postgresql uses the OS settings, which
> are roughly ~130 minutes assuming that the client understands and
> participates [which Racket does].  However, on most systems, keep-alive
> timeouts can be set far higher.
>
> Aside: I'm not aware of any published limits on keep-alive settings, only
> the defaults are known for various systems.  If the settings are just
> integral seconds and counts, and (theoretically) could go to MAX_INT, that
> would represent  ~3^20 years on a 32-bit machine ... for all practical
> purposes, infinite.
>
>
> Final scenario, identical to the previous except that the parameter is a
> promise:
> (define dbh (postgresql-connect ...))
> (define current-dbh (make-parameter (delay dbh)))
> (query-value (force (current-dbh)) "select ...")
> (sleep 1000000)
> (query-value (force (current-dbh)) "select ...")
>
> Would this make any difference?  I can't see why but thought I should ask.
>
>
> There's no difference wrt the above.  You aren't delaying the *opening* of
> the connection - you are simply performing unnecessary gyrations to get at
> the handle.   There would be a difference if instead you wrote:
>
>    (define dbh (delay (postgresql-connect ...)))
>    (define current-dbh (make-parameter dbh))
>    (query-value (force (current-dbh)) "select ...")
>    (sleep ...)
>    (query-value (force (current-dbh)) "select ...")
>
> which would try to open the connection at the point of each query.
> However, at the 2nd query, if the connection were still open due to
> keep-alive, the repeated open attempt might fail.
>
>
> George
>

Okay, good.  That's all as I expected.  Thanks, George.


> --
> You received this message because you are subscribed to the Google Groups
> "Racket Users" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups 
"Racket Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to