Something like that -- it depends on what is easiest. If writing happens in
only a few places, then you can maintain a list of the functions that do
writes rather than those that only do reads. You could also take Dave's
approach and use the HTTP method to determine the connection:
READ_ONLY_URIS = ['mysql://...1','mysql://...2','mysql://...3']
if request.env.request_method and request.env.request_method == 'GET':
db_uri = random.shuffle(READ_ONLY_URIS)
else:
db_uri = 'mysql://...master'
db = DAL(db_uri, ...)
Alternatively, you could try changing the connection of the DAL object
within a given controller action. I haven't tried it, but maybe something
like this:
MASTER_URI = 'mysql://...master'
def connect_to_master(db, uri=MASTER_URI):
if db._uri != uri:
master = DAL(uri)
db._adapter = master._adapter
The above function takes a DAL instance and swaps the ._adapter, which is
used to connect to the database. In a given controller, you could then do:
def myaction():
connect_to_master(db)
[Do db write operations.]
return dict()
Anthony
On Saturday, January 6, 2018 at 8:26:45 AM UTC-5, CDA wrote:
>
> So given the example below from the book, I would add all the controller
> functions that does database read to read_only_actions list? I would have
> to continuously maintain this list as my application grows. Is this the
> right approach?
>
> if request.function in read_only_actions:
> db = DAL(sample(['mysql://...1','mysql://...2','mysql://...3'], 3))
> elif request.action in read_only_actions:
> db = DAL(shuffle(['mysql://...1','mysql://...2','mysql://...3']))
> else:
> db = DAL(sample(['mysql://...3','mysql://...4','mysql://...5'], 3))
>
>
> where 1,2,3 are slaves and 3,4,5 are masters.
>
> On Jan 6, 2018 3:54 AM, "Dave S" <[email protected]> wrote:
>
>
>
> On Friday, January 5, 2018 at 7:50:28 PM UTC-8, CDA wrote:
>>
>> How does web2py select a database to connect to based on the http request
>> content? Is it feasible to connect to different databases depending on
>> whether it is a read request or a write request? Can you provide example on
>> how to do this?
>>
>>
> I would expect that the http request wouldn't directly select a database.
> Instead, your controller would know if a select() was being done to satisfy
> the request (typical for HTTP GET, but often needed for other reasons), or
> an insert or update (often an HTTP POST or HTTP PUT), or a delete (such as
> for an HTTP DELETE). But it's your controller that decides what type of DB
> operation is required. AIUI.
>
> /dps
>
>
>
>> On Fri, Jan 5, 2018 at 6:35 PM, Anthony <[email protected]> wrote:
>>
>>> Do you have doubts about whether it would work? Seems fairly
>>> straightforward.
>>>
>>>
>>> On Friday, January 5, 2018 at 3:59:29 PM UTC-5, CDA wrote:
>>>>
>>>>
>>>> Below is an excerpt about horizontal scaling from Chapter 13 in the
>>>> book. Has any one successfully implemented this using web2py?
>>>>
>>>> It is also possible to connect to different databases depending on the
>>>> requested action or controller. In a master-slave database configuration,
>>>> *some* *action performs only a read* and *some performs both
>>>> read/write*. The former can safely connect to a slave db server, while
>>>> the latter should connect to a master. So you can do:
>>>>
>>>>
>>>> 1
>>>> 2
>>>> 3
>>>> 4
>>>> 5
>>>> 6
>>>>
>>>> if request.function in read_only_actions:
>>>> db = DAL(sample(['mysql://...1','mysql://...2','mysql://...3'], 3))elif
>>>> request.action in read_only_actions:
>>>> db = DAL(shuffle(['mysql://...1','mysql://...2','mysql://...3']))else:
>>>> db = DAL(sample(['mysql://...3','mysql://...4','mysql://...5'], 3))
>>>>
>>>>
>>>> where 1,2,3 are slaves and 3,4,5 are masters.
>>>>
>>> --
>>> Resources:
>>> - http://web2py.com
>>> - http://web2py.com/book (Documentation)
>>> - http://github.com/web2py/web2py (Source code)
>>> - https://code.google.com/p/web2py/issues/list (Report Issues)
>>> ---
>>> You received this message because you are subscribed to the Google
>>> Groups "web2py-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.
>>>
>>
>> --
> Resources:
> - http://web2py.com
> - http://web2py.com/book (Documentation)
> - http://github.com/web2py/web2py (Source code)
> - https://code.google.com/p/web2py/issues/list (Report Issues)
> ---
> You received this message because you are subscribed to the Google Groups
> "web2py-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.
>
>
>
--
Resources:
- http://web2py.com
- http://web2py.com/book (Documentation)
- http://github.com/web2py/web2py (Source code)
- https://code.google.com/p/web2py/issues/list (Report Issues)
---
You received this message because you are subscribed to the Google Groups
"web2py-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.