I have this RoR (2.3.16) app that has a simple agenda tool. Each customer has their own individual database, and I have one central database with login, passwd and the customer database name.
Something like this:
main_database:
users_table:
login_field
passwd_field
database_name_field
customer_db_1:
tables …
customer_db_2:
tables …
So, after user authentication, I set the correspondent database connection according each customer.
The problem is:
Customer 1 sometimes see records from customer 2, even being on different databases.
I’m totally lost here… I just suspect that this could be a database connection cache issue, since the SQL query is the same for every customer (ie.: select * from agendas;) but the connection string is different for each one.
Most of the time everything runs ok… but some customers are getting this strange behaviour.
thanks for your reply!! I’ll try it and see if I can find more info to help me…
I was also wondering where can I find how Rails (specially 2.3.x) deals with sql result caching. This could help to diagnose a possible root cause.
There is an sql cache in Rails, however it is scoped to the current request - you get a fresh cache for each request. When you say that you are setting the DB connection after authentication, what exactly are you doing (and by authentication do you mean when the user signs in or on every request once you have got a user_id from a session/cookie?) ?
Are you checking for an error return here in case it fails for some
reason, leaving the connection as it was for the last request? Also I
presume you are not silently absorbing any exception raised there.
didn’t work, but also didn’t throw any exception. So the requested view got the last opened database connection to retrieve the records. Of course, the records retrieved was from another user (the last successful establish_connection attempt).
I would wonder how this plays with connection pooling. In any case,
since you're explicitly opening the connection, I'd add an after_filter
to explicitly *release* the connection after using it.
And it might be worth testing whether setting the connection pool
size to 1 changes the behavior. Not that that's necessarily a great
long-term "solution", but for troubleshooting purposes.
I expect it returned an error (hence my suggestion to check for error
return). If you look at the docs for establish_connection you will
see that it may throw an exception, but under other circumstances will
return an error.