active_record_slave 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
data/README.md
CHANGED
@@ -3,14 +3,14 @@ active_record_slave
|
|
3
3
|
|
4
4
|
* http://github.com/ClarityServices/active_record_slave
|
5
5
|
|
6
|
-
|
6
|
+
## Introduction
|
7
7
|
|
8
8
|
active_record_slave allows all database reads to go to a slave while ensuring
|
9
9
|
that all writes go to the master database. Also, active_record_slave ensures that
|
10
10
|
any reads that are performed in a transaction will always go to the master
|
11
11
|
database to ensure data consistency.
|
12
12
|
|
13
|
-
|
13
|
+
## Features
|
14
14
|
|
15
15
|
* Redirecting reads to a single slave database
|
16
16
|
* Supports all Rails 3 read apis, including dynamic finders, AREL, and ActiveRecord::Base.select
|
@@ -25,34 +25,36 @@ database to ensure data consistency.
|
|
25
25
|
* Debug logs include 'Slave: ' prefix to indicate which SQL statements are going
|
26
26
|
to the slave database
|
27
27
|
|
28
|
-
|
28
|
+
### Example showing Slave redirected read
|
29
29
|
r = Role.where(:name => "manager").first
|
30
30
|
r.description = 'Manager'
|
31
31
|
r.save!
|
32
32
|
|
33
|
-
|
33
|
+
Log file output:
|
34
|
+
|
34
35
|
03-13-12 05:56:05 pm,[2608],b[0],[0], Slave: Role Load (3.0ms) SELECT `roles`.* FROM `roles` WHERE `roles`.`name` = 'manager' LIMIT 1
|
35
36
|
03-13-12 05:56:22 pm,[2608],b[0],[0], AREL (12.0ms) UPDATE `roles` SET `description` = 'Manager' WHERE `roles`.`id` = 5
|
36
37
|
|
37
|
-
|
38
|
+
### Example showing how reads within a transaction go to the master
|
38
39
|
Role.transaction do
|
39
40
|
r = Role.where(:name => "manager").first
|
40
41
|
r.description = 'Manager'
|
41
42
|
r.save!
|
42
43
|
end
|
43
44
|
|
44
|
-
|
45
|
+
Log file output:
|
46
|
+
|
45
47
|
03-13-12 06:02:09 pm,[2608],b[0],[0], Role Load (2.0ms) SELECT `roles`.* FROM `roles` WHERE `roles`.`name` = 'manager' LIMIT 1
|
46
48
|
03-13-12 06:02:09 pm,[2608],b[0],[0], AREL (2.0ms) UPDATE `roles` SET `description` = 'Manager' WHERE `roles`.`id` = 4
|
47
49
|
|
48
|
-
|
50
|
+
## Requirements
|
49
51
|
|
50
|
-
* Rails 3 or greater
|
52
|
+
* ActiveRecord 3 or greater (Rails 3 or greater)
|
51
53
|
|
52
54
|
May also work with Rails 2. Anyone want to give it a try and let me know?
|
53
55
|
Happy to make it work with Rails 2 if anyone needs it
|
54
56
|
|
55
|
-
|
57
|
+
## Note
|
56
58
|
|
57
59
|
ActiveRecord::Base.execute is commonly used to perform custom SQL calls against
|
58
60
|
the database that bypasses ActiveRecord. It is necessary to replace these calls
|
@@ -62,11 +64,11 @@ active_record_slave and redirected to the slave.
|
|
62
64
|
This is because ActiveRecord::Base.execute can also be used for database updates
|
63
65
|
which we do not want redirected to the slave
|
64
66
|
|
65
|
-
|
67
|
+
## Install
|
66
68
|
|
67
69
|
gem install active_record_slave
|
68
70
|
|
69
|
-
|
71
|
+
## Configuration
|
70
72
|
|
71
73
|
To enable slave reads for any environment just add a _slave:_ entry to database.yml
|
72
74
|
along with all the usual ActiveRecord database configuration options.
|
@@ -92,6 +94,7 @@ For Example:
|
|
92
94
|
|
93
95
|
Sometimes it is useful to turn on slave reads per host, for example to activate
|
94
96
|
slave reads only on the linux host 'batch':
|
97
|
+
|
95
98
|
development:
|
96
99
|
database: clarity_development
|
97
100
|
username: root
|
@@ -111,7 +114,7 @@ slave reads only on the linux host 'batch':
|
|
111
114
|
pool: 20
|
112
115
|
<% end %>
|
113
116
|
|
114
|
-
|
117
|
+
## Possible Future Enhancements
|
115
118
|
|
116
119
|
* Support multiple slaves (ask for it by submitting a ticket)
|
117
120
|
|
@@ -120,7 +123,7 @@ Meta
|
|
120
123
|
|
121
124
|
* Code: `git clone git://github.com/ClarityServices/active_record_slave.git`
|
122
125
|
* Home: <https://github.com/ClarityServices/active_record_slave>
|
123
|
-
* Bugs: <
|
126
|
+
* Bugs: <https://github.com/ClarityServices/active_record_slave/issues>
|
124
127
|
* Gems: <http://rubygems.org/gems/active_record_slave>
|
125
128
|
|
126
129
|
This project uses [Semantic Versioning](http://semver.org/).
|
Binary file
|
@@ -14,9 +14,21 @@ module ActiveRecordSlave
|
|
14
14
|
# Inject a new #select method into the ActiveRecord Database adapter
|
15
15
|
base = adapter_class || ActiveRecord::Base.connection.class
|
16
16
|
base.send(:include, InstanceMethods)
|
17
|
-
base.alias_method_chain
|
17
|
+
base.alias_method_chain(:select, :slave_reader)
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
21
|
+
# Force reads for the supplied block to read from the master database
|
22
|
+
# Only applies to calls made within the current thread
|
23
|
+
def self.read_from_master
|
24
|
+
# Set :master indicator in thread local storage so that it is visible
|
25
|
+
# during the select call
|
26
|
+
current = Thread.current[:active_record_slave]
|
27
|
+
Thread.current[:active_record_slave] = :master
|
28
|
+
yield
|
29
|
+
ensure
|
30
|
+
Thread.current[:active_record_slave] = current
|
31
|
+
end
|
32
|
+
|
21
33
|
end
|
22
34
|
|
@@ -5,8 +5,10 @@ module ActiveRecordSlave
|
|
5
5
|
# Replace #select with one that calls the slave connection instead
|
6
6
|
def select_with_slave_reader(sql, name = nil)
|
7
7
|
# Only read from slave when not in a transaction and when this is not already the slave connection
|
8
|
-
if (open_transactions == 0) &&
|
9
|
-
|
8
|
+
if (open_transactions == 0) && (Thread.current[:active_record_slave] != :master)
|
9
|
+
ActiveRecordSlave.read_from_master do
|
10
|
+
Slave.connection.select(sql, "Slave: #{name || 'SQL'}")
|
11
|
+
end
|
10
12
|
else
|
11
13
|
select_without_slave_reader(sql, name)
|
12
14
|
end
|
metadata
CHANGED
@@ -1,22 +1,26 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: active_record_slave
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
prerelease:
|
5
|
-
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 2
|
8
|
+
- 0
|
9
|
+
version: 0.2.0
|
6
10
|
platform: ruby
|
7
11
|
authors:
|
8
|
-
|
12
|
+
- Reid Morrison
|
9
13
|
autorequire:
|
10
14
|
bindir: bin
|
11
15
|
cert_chain: []
|
12
16
|
|
13
|
-
date: 2012-03-
|
17
|
+
date: 2012-03-16 00:00:00 -04:00
|
14
18
|
default_executable:
|
15
19
|
dependencies: []
|
16
20
|
|
17
21
|
description: ActiveRecordSlave is a library to seamlessly enable reading from database slaves in a Rails 3 project, written in Ruby.
|
18
22
|
email:
|
19
|
-
|
23
|
+
- reidmo@gmail.com
|
20
24
|
executables: []
|
21
25
|
|
22
26
|
extensions: []
|
@@ -24,22 +28,22 @@ extensions: []
|
|
24
28
|
extra_rdoc_files: []
|
25
29
|
|
26
30
|
files:
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
31
|
+
- active_record_slave-0.1.0.gem
|
32
|
+
- lib/active_record_slave/active_record_slave.rb
|
33
|
+
- lib/active_record_slave/instance_methods.rb
|
34
|
+
- lib/active_record_slave/railtie.rb
|
35
|
+
- lib/active_record_slave/slave.rb
|
36
|
+
- lib/active_record_slave/version.rb
|
37
|
+
- lib/active_record_slave.rb
|
38
|
+
- LICENSE.txt
|
39
|
+
- nbproject/private/config.properties
|
40
|
+
- nbproject/private/private.properties
|
41
|
+
- nbproject/private/private.xml
|
42
|
+
- nbproject/private/rake-d.txt
|
43
|
+
- nbproject/project.properties
|
44
|
+
- nbproject/project.xml
|
45
|
+
- Rakefile
|
46
|
+
- README.md
|
43
47
|
has_rdoc: true
|
44
48
|
homepage: https://github.com/ClarityServices/active_record_slave
|
45
49
|
licenses: []
|
@@ -48,23 +52,25 @@ post_install_message:
|
|
48
52
|
rdoc_options: []
|
49
53
|
|
50
54
|
require_paths:
|
51
|
-
|
55
|
+
- lib
|
52
56
|
required_ruby_version: !ruby/object:Gem::Requirement
|
53
|
-
none: false
|
54
57
|
requirements:
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
+
- - ">="
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
segments:
|
61
|
+
- 0
|
62
|
+
version: "0"
|
58
63
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
59
|
-
none: false
|
60
64
|
requirements:
|
61
|
-
|
62
|
-
|
63
|
-
|
65
|
+
- - ">="
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
segments:
|
68
|
+
- 0
|
69
|
+
version: "0"
|
64
70
|
requirements: []
|
65
71
|
|
66
72
|
rubyforge_project:
|
67
|
-
rubygems_version: 1.
|
73
|
+
rubygems_version: 1.3.6
|
68
74
|
signing_key:
|
69
75
|
specification_version: 3
|
70
76
|
summary: ActiveRecord read from slave
|