fresh_connection 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt CHANGED
@@ -2,3 +2,8 @@
2
2
 
3
3
  * 1 major enhancement:
4
4
  * Initial release
5
+
6
+ == 0.0.2 2011-10-18
7
+
8
+ * Ignore setting support
9
+ * Abolish multi connection
data/README.rdoc CHANGED
@@ -1,19 +1,19 @@
1
1
  = FreshConnection
2
2
 
3
- * https://github.com/tsukasaoishi/fresh_connection
3
+ * https://github.com/tsukasaoishi/fresh_connection
4
4
 
5
5
  == Description
6
6
 
7
- FreshConnection supports of connect with Mysql slave servers via Load Balancers.
8
- Currently, I have only tested with Rails2.3.14.
9
- In the future, I plan to support Rails3.
7
+ FreshConnection supports of connect with Mysql slave servers via Load Balancers.
8
+ Currently, I have only tested with Rails2.3.14.
9
+ In the future, I plan to support Rails3.
10
10
 
11
- All connections will be disconnected every time at the end of the action.
11
+ All connections will be disconnected every time at the end of the action.
12
12
 
13
13
  == How to use at Rails
14
14
 
15
15
  === Gemfile
16
- gem "fresh_connection", "=0.0.1"
16
+ gem "fresh_connection", "=0.0.2"
17
17
 
18
18
  === config/database.yml
19
19
  production:
@@ -31,10 +31,8 @@
31
31
  username: slave
32
32
  password: slave
33
33
  host: slave
34
- max_connection: 5
35
34
 
36
35
  slave is config to connect to slave servers.
37
- max_connection is max connection number to connect to slave.
38
36
  Others will use the master setting. If you want to change, write in the slave.
39
37
 
40
38
 
@@ -42,6 +40,11 @@ Others will use the master setting. If you want to change, write in the slave.
42
40
  require 'fresh_connection'
43
41
  ActionController::Dispatcher.middleware.swap ActiveRecord::ConnectionAdapters::ConnectionManagement, FreshConnection::Rack::ConnectionManagement
44
42
 
43
+ === config/initializers/fresh_connection.rb
44
+ FreshConnection::SlaveConnection.ignore_models = %w|Model1 Model2|
45
+
46
+ If models that ignore access to slave servers is exist, You can write model name at FreshConnection::SlaveConnection.ignore_models.
47
+
45
48
  == Synopis
46
49
  Read query will be access to slave server.
47
50
  Article.where(:id => 1)
@@ -2,12 +2,12 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{fresh_connection}
5
- s.version = "0.0.1"
5
+ s.version = "0.0.2"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Tsukasa OISHI"]
9
9
  s.date = %q{2010-10-16}
10
- s.description = %q{MiyazakiResistance is a library like ActiveRecord to use Tokyo Tyrant.}
10
+ s.description = %q{FreshConnection supports of connect with Mysql slave servers via Load Balancers.}
11
11
  s.email = ["tsukasa.oishi@gmail.com"]
12
12
  s.extra_rdoc_files = ["History.txt", "Manifest.txt", "README.rdoc"]
13
13
  s.files = %w|
@@ -19,11 +19,10 @@ Gem::Specification.new do |s|
19
19
  rails/initializers/active_record_base.rb
20
20
  |
21
21
  s.has_rdoc = true
22
- s.homepage = %q{http://www.kaeruspoon.net/keywords/MiyazakiResistance}
23
- s.post_install_message = %q{PostInstall.txt}
22
+ s.homepage = %q{https://github.com/tsukasaoishi/fresh_connection}
24
23
  s.rdoc_options = ["--main", "README.rdoc"]
25
24
  s.require_paths = ["lib"]
26
- s.rubyforge_project = %q{miyazakiresistance}
25
+ s.rubyforge_project = %q{fresh_connection}
27
26
  s.rubygems_version = %q{1.3.1}
28
- s.summary = %q{MiyazakiResistance is a library like ActiveRecord to use Tokyo Tyrant.}
27
+ s.summary = %q{FreshConnection supports of connect with Mysql slave servers via Load Balancers.}
29
28
  end
@@ -2,51 +2,49 @@ module FreshConnection
2
2
  class SlaveConnection
3
3
  class << self
4
4
  def connection
5
- slave_connections[slave_pointer] ||= new_connection
5
+ slave_connection
6
6
  end
7
7
 
8
8
  def clear_all_connections!
9
9
  if @slave_connections.present?
10
- @slave_connections.values.each{|conns| conns.each{|c| c.disconnect!}}
10
+ @slave_connections.each_value{|c| c && c.disconnect! rescue nil}
11
11
  end
12
12
  @slave_connections = {}
13
13
  end
14
14
 
15
15
  def slave_access_in
16
- Thread.current[:slave_access] = true
16
+ Thread.current[:fresh_connection_slave_access] = true
17
17
  end
18
18
 
19
19
  def slave_access_out
20
- Thread.current[:slave_access] = false
20
+ Thread.current[:fresh_connection_slave_access] = false
21
21
  end
22
22
 
23
23
  def slave_access?
24
- Thread.current[:slave_access] ||= false
24
+ Thread.current[:fresh_connection_slave_access] ||= false
25
25
  end
26
26
 
27
- def shift_slave_pointer
28
- Thread.current[:slave_pointer] = slave_pointer + 1
29
- Thread.current[:slave_pointer] = 0 if slave_pointer > max_slave_pointer
27
+ def ignore_models=(model_names)
28
+ @ignore_models = model_names
30
29
  end
31
-
32
- private
33
30
 
34
- def new_connection
35
- ActiveRecord::Base.send("#{spec["adapter"]}_connection", spec)
31
+ def ignore_model?(model_name)
32
+ (@ignore_models || []).include?(model_name)
36
33
  end
37
34
 
38
- def slave_connections
35
+ private
36
+
37
+ def slave_connection
39
38
  @slave_connections ||= {}
40
- @slave_connections[current_thread_id] ||= []
39
+ @slave_connections[current_thread_id] ||= new_connection
41
40
  end
42
41
 
43
-
44
- def slave_pointer
45
- Thread.current[:slave_pointer] ||= 0
42
+ def clear_slave_connection
43
+ @slave_connections[current_thread_id] = nil
46
44
  end
47
45
 
48
- def max_slave_pointer
49
- @max_slave_pointer ||= (spec["max_connection"] || 1) - 1
46
+ def new_connection
47
+ ActiveRecord::Base.send("#{spec["adapter"]}_connection", spec)
50
48
  end
51
49
 
52
50
  def spec
@@ -1,5 +1,5 @@
1
1
  module FreshConnection
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
4
4
 
5
5
  require "fresh_connection/slave_connection"
@@ -64,27 +64,34 @@ module ActiveRecord
64
64
  private
65
65
 
66
66
  def run_on_db(options)
67
- in_run_on_db[:go_slave] = go_slave?(options) if in_run_on_db[:count] == 0
68
- in_run_on_db[:count] += 1
69
-
70
- in_run_on_db[:go_slave] ? run_on_readonly_db{yield} : yield
67
+ in_run_on_db(options)
68
+ run_on_db_status[:go_slave] ? run_on_readonly_db{yield} : yield
71
69
  ensure
72
- in_run_on_db[:count] -= 1
70
+ out_run_on_db
71
+ end
72
+
73
+ def in_run_on_db(options)
74
+ run_on_db_status[:go_slave] = go_slave?(options) if run_on_db_status[:count] == 0
75
+ run_on_db_status[:count] += 1
76
+ end
77
+
78
+ def out_run_on_db
79
+ run_on_db_status[:count] -= 1
73
80
  end
74
81
 
75
- def in_run_on_db
76
- Thread.current[:in_run_on_db] ||= {:count => 0, :go_slave => false}
82
+ def run_on_db_status
83
+ Thread.current[:run_on_db_status] ||= {:count => 0, :go_slave => false}
77
84
  end
78
85
 
79
86
  def go_slave?(options)
80
- connection.open_transactions == 0 && (!options.is_a?(Hash) || !options.key?(:readonly) || options[:readonly].nil? || options[:readonly])
87
+ !FreshConnection::SlaveConnection.ignore_model?(self.name) && connection.open_transactions == 0 &&
88
+ (!options.is_a?(Hash) || !options.key?(:readonly) || options[:readonly].nil? || options[:readonly])
81
89
  end
82
90
 
83
91
  def run_on_readonly_db
84
92
  FreshConnection::SlaveConnection.slave_access_in
85
93
  yield
86
94
  ensure
87
- FreshConnection::SlaveConnection.shift_slave_pointer
88
95
  FreshConnection::SlaveConnection.slave_access_out
89
96
  end
90
97
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fresh_connection
3
3
  version: !ruby/object:Gem::Version
4
- hash: 29
4
+ hash: 27
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 1
10
- version: 0.0.1
9
+ - 2
10
+ version: 0.0.2
11
11
  platform: ruby
12
12
  authors:
13
13
  - Tsukasa OISHI
@@ -18,7 +18,7 @@ cert_chain: []
18
18
  date: 2010-10-16 00:00:00 Z
19
19
  dependencies: []
20
20
 
21
- description: MiyazakiResistance is a library like ActiveRecord to use Tokyo Tyrant.
21
+ description: FreshConnection supports of connect with Mysql slave servers via Load Balancers.
22
22
  email:
23
23
  - tsukasa.oishi@gmail.com
24
24
  executables: []
@@ -39,10 +39,10 @@ files:
39
39
  - History.txt
40
40
  - Manifest.txt
41
41
  - README.rdoc
42
- homepage: http://www.kaeruspoon.net/keywords/MiyazakiResistance
42
+ homepage: https://github.com/tsukasaoishi/fresh_connection
43
43
  licenses: []
44
44
 
45
- post_install_message: PostInstall.txt
45
+ post_install_message:
46
46
  rdoc_options:
47
47
  - --main
48
48
  - README.rdoc
@@ -68,10 +68,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
68
68
  version: "0"
69
69
  requirements: []
70
70
 
71
- rubyforge_project: miyazakiresistance
71
+ rubyforge_project: fresh_connection
72
72
  rubygems_version: 1.7.2
73
73
  signing_key:
74
74
  specification_version: 3
75
- summary: MiyazakiResistance is a library like ActiveRecord to use Tokyo Tyrant.
75
+ summary: FreshConnection supports of connect with Mysql slave servers via Load Balancers.
76
76
  test_files: []
77
77