On Wed, Apr 5, 2017 at 1:39 PM, Marc Kaufmann <[email protected]> wrote:
> Thanks David, that makes a little sense also because it often happens after
> there has been no activity on the server for a while. If it is a stale
> handle, is there something I can do about it?

Get a fresh handle instead of re-using an old one.  I don't know what
this line does:    (define dbc (study-db a-study))   but if it's
returning a cached handle then that's your problem.

Something like this would work:

(define (connect-me)
  (postgresql-connect #:user     "foo"
                      #:database "bar"
                      #:password "baz"
                      #:port     5432
                      ))

(define dbc (connect-me))


(Note that this is illustrative, not necessarily efficient.)

Also, you might want to look into virtual connections and connection pools.


>
> Cheers,
> Marc
>
> On Wed, Apr 5, 2017 at 1:25 PM, David Storrs <[email protected]> wrote:
>>
>> I'm guessing here, but these lines:
>>
>>    /usr/share/racket/pkgs/db-lib/db/private/mysql/message.rkt:417:0:
>> parse-packet
>>    /usr/share/racket/pkgs/db-lib/db/private/mysql/connection.rkt:105:4:
>> recv* method in connection%
>>
>> suggest to me that the issue is:
>>
>> 1) The connection handle is stale or not established
>>
>> 2) It's failing to make the connection before the initial call is
>> made, so it receives something that isn't a packet back (my guess
>> would be #f, but that's purely a guess).
>>
>> 3) The connection then finishes being made so the second call works.
>>
>>
>> The reason it works on localhost is that the DB is instantly available
>> with no network latency and your handles are not stale.
>>
>> As an aside, I would suggest using bind params for your SQL instead of
>> assembling it as a string.  It will be faster, might fix your problem,
>> and will be substantially more secure depending on where your data is
>> coming from.  It will also allow the handle to cache statements for
>> future use.  The only change you need is to get rid of the
>> string-append:
>>
>>   (query-exec
>>         dbc
>>         "INSERT INTO participant (subscribed, next_matrix,
>> completion_code, comprehension_incorrect, comprehension_question)
>> VALUES (1, 1, ?, 0, 0)"
>>         (random 1000000))
>>
>>
>> Hope this helps,
>>
>> Dave
>>
>> On Wed, Apr 5, 2017 at 12:08 PM, Marc Kaufmann
>> <[email protected]> wrote:
>> > Hi all,
>> >
>> > I have the following code that occasionally throws an error when called,
>> > but definitely not always:
>> >
>> > "
>> > (define (study-add-participant! a-study)
>> >   (displayln-date)
>> >   (define dbc (study-db a-study))
>> >   (displayln "Inserting new participant...")
>> >   (query-exec
>> >         dbc
>> >         (string-join
>> >           '(
>> >                 "INSERT INTO participant (subscribed, next_matrix,
>> > completion_code, comprehension_incorrect, comprehension_question)"
>> >                 "VALUES (1, 1, ?, 0, 0)"))
>> >         (number->string (random 1000000)))
>> >   (displayln "New participant inserted. Getting id of new
>> > participant...")
>> >   ... ; More stuff
>> > "
>> >
>> > Sometimes I hit the following error, but never if I refresh the page
>> > that calls 'study-add-participant!, and usually I don't hit the error at
>> > all.
>> >
>> > "
>> > Servlet (@ /tutorial) exception:
>> > io:read-le-intN: internal error;
>> >  unexpected eof; got #<eof>
>> >
>> >   context...:
>> >    /usr/share/racket/collects/db/private/generic/interfaces.rkt:209:0:
>> > error*9
>> >    /usr/share/racket/pkgs/db-lib/db/private/mysql/message.rkt:417:0:
>> > parse-packet
>> >    /usr/share/racket/pkgs/db-lib/db/private/mysql/connection.rkt:105:4:
>> > recv* method in connection%
>> >    .../more-scheme.rkt:261:28
>> >    /usr/share/racket/collects/db/private/generic/common.rkt:276:13
>> >
>> > /usr/share/racket/collects/db/private/generic/../../../racket/private/more-scheme.rkt:261:28
>> >    [repeats 1 more time]
>> >    /usr/share/racket/collects/db/private/generic/functions.rkt:141:0:
>> > compose-statement
>> >    /usr/share/racket/collects/db/private/generic/functions.rkt:216:0:
>> > query-exec
>> >    /home/marc/mturk/model.rkt:99:0: study-add-participant!
>> >    /home/marc/mturk/pages.rkt:563:0: tutorial
>> >
>> > /usr/share/racket/collects/racket/contract/private/arrow-higher-order.rkt:342:33
>> >    [repeats 1 more time]
>> >
>> > /usr/share/racket/pkgs/web-server-lib/web-server/dispatchers/dispatch-servlets.rkt:58:2
>> >
>> > /usr/share/racket/collects/racket/contract/private/arrow-higher-order.rkt:342:33
>> >    [repeats 1 more time]
>> > ...
>> > "
>> >
>> > From the logs, I know that this happens in the query-exec, since I see
>> > the first `displayln message, but not the second one. What I do not
>> > understand is how I can hit the message sometimes but not other times? What
>> > (hidden?) state is there that is changing and sometimes causes the
>> > io:read-le-intN to fail?
>> >
>> > If it helps with diagnosing:
>> >
>> > - The query did not get run successfully on the database.
>> > - The query itself is correct, since it succeeds the second time, and
>> > since it succeeded yesterday. Thus, it's not that I am addressing a missing
>> > database or anything.
>> > - I have never yet hit this error when running the code on localhost for
>> > testing and development. This is on the live server.
>> >
>> > I am happy to provide more logs or run commands to figure out what is
>> > going on, but unfortunately I cannot even replicate the bug reliably (I hit
>> > it 4 times so far.
>> >
>> > Thanks,
>> > Marc
>> >
>> > --
>> > 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