TeamSnap Logo
Log inFind My Team
  • Products
    • Organizations logoClubs & Leagues

      For clubs, leagues & associations with multiple teams

      • Sports
      • Features
      • Get a demo
    • Teams logoTeams

      The easiest way to manage a team

      • Sports
      • Features
    • Tournaments logoTournaments

      Build and manage your events in a snap

      • Scheduling
      • Registration
  • Pricing
  • Company
    • About
    • Careers Hiring!
  • Resources
    • Blog
    • Community Impact
    • Off-Season
    • Coaches’ Corner
    • Clubs & Leagues Resources
    • TeamSnap Updates
    • Help Center
    • API Docs
  • For Brands

Find My Team

Sign upLog in
Sign upLog in
  • Home
  • Ruby SDK
  • API
  • API Help / Feedback
Blog/ Ruby / Client Compression in mysql2…

Client Compression in mysql2

Image of engineering blog author: Shane EmmonsShane Emmons
  • Ruby
  • MySQL
  • Rails

Recently our Ops team has wanted to experiment with client compression on MySQL to help alleviate some internal network congestion. After much trial and error we hit upon a solution for the mysql2 gem in Rails 2.x, 3.x, 4.x and Sequel. I hope this helps others struggling to find a way to do this. Comeback soon to see what effect Client Compression had on our network.

Rails 2.x

# config/initializers/enable_connection_flags.rb
module ActiveRecord
  class Base
    def self.mysql2_connection(config)
      config[:username] = 'root' if config[:username].nil?

      if Mysql2::Client.const_defined? :FOUND_ROWS
        config[:flags] = config[:flags] ? config[:flags] | Mysql2::Client::FOUND_ROWS : Mysql2::Client::FOUND_ROWS
      end

      client = Mysql2::Client.new(config.symbolize_keys)
      options = [config[:host], config[:username], config[:password], config[:database], config[:port], config[:socket], 0]
      ConnectionAdapters::Mysql2Adapter.new(client, logger, options, config)
    end
  end
end

# config/database.yml
development:
  adapter: mysql2
  database: teamsnap
  username: root
  password:
  host: localhost
  flags: <%= require"mysql2";Mysql2::Client::COMPRESS %>

Rails 3.x

# config/initializers/enable_connection_flags.rb
module ActiveRecord
  class Base
    def self.mysql2_connection(config)
      config[:username] = 'root' if config[:username].nil?

      if Mysql2::Client.const_defined? :FOUND_ROWS
        config[:flags] = config[:flags] ? config[:flags] | Mysql2::Client::FOUND_ROWS : Mysql2::Client::FOUND_ROWS
      end

      client = Mysql2::Client.new(config.symbolize_keys)
      options = [config[:host], config[:username], config[:password], config[:database], config[:port], config[:socket], 0]
      ConnectionAdapters::Mysql2Adapter.new(client, logger, options, config)
    end
  end
end

# config/database.yml
development:
  adapter: mysql2
  database: teamsnap
  username: root
  password:
  host: localhost
  flags: <%= Mysql2::Client::COMPRESS %>

Rails 4.x

ActiveRecord::Base.define_singleton_method(:mysql2_connection) do |config|
  config = config.symbolize_keys

  config[:username] = 'root' if config[:username].nil?

  if Mysql2::Client.const_defined? :FOUND_ROWS
    config[:flags] = config[:flags] ? config[:flags] | Mysql2::Client::FOUND_ROWS : Mysql2::Client::FOUND_ROWS
  end

  client = Mysql2::Client.new(config)
  options = [config[:host], config[:username], config[:password], config[:database], config[:port], config[:socket], 0]
  ActiveRecord::ConnectionAdapters::Mysql2Adapter.new(client, logger, options, config)
end

# config/database.yml
development:
  adapter: mysql2
  database: teamsnap
  username: root
  password:
  host: localhost
  flags: <%= Mysql2::Client::COMPRESS %>

Sequel

# config/initializers/sequel.rb
database_url = Rails.application.secrets.database_url
DB = Sequel.connect(
  database_url,
  :flags => Rails.application.secrets.database_flags
)
Sequel.default_timezone = :utc

# config/secrets.yml
database_url: <%= ENV["DATABASE_URL"] %>
database_flags: <%= eval(ENV["DATABASE_FLAGS"] || "") %>

# .env
DATABASE_URL="mysql2://root:@localhost/teamsnap?wait_timeout=31536000&reconnect=true"
DATABASE_FLAGS="Mysql2::Client::COMPRESS"
Products
Club or League Administrators
  • Get a demo
  • Features
  • Pricing
  • Tournaments
  • FAQs
Coaches or Team Managers
  • Features
  • Pricing
  • Tournaments
  • Get Started
Parents or Athletes
  • Features
  • Pricing
  • Find My Team
  • Get Started
Sports
Clubs & Leagues
  • Baseball
  • Basketball
  • Football
  • Ice Hockey
  • Lacrosse
  • Soccer
  • Softball
  • Volleyball
Teams
  • Baseball
  • Basketball
  • Football
  • Ice Hockey
  • Soccer
  • Softball
  • +100s more
Resources
  • Blog
  • Coaches’ Corner
  • Return To Play
  • Clubs & Leagues Resource Library
  • Skills & Drills
  • Press Releases
  • TeamSnap Updates
  • TeamSnap Help Center
  • Community
  • Why TeamSnap?
Company
  • About
  • CareersHiring!
  • For Brands
  • Partners
  • TeamSnap API
  • Responsible Disclosure Policy
  • Youth sports team and sports org app Apple App Store Logo
  • Youth sports team and sports org app Google Play Store Logo
  • social-media-facebook
  • social-media-twitter
  • social-pinterest
  • social-instagram
  • social-video-youtube
  • professional-network-linkedin

TeamSnap Footer Logo

Copyright © 2005–2023 TeamSnap, Inc.

  • Sitemap
  • Terms
  • Privacy
  • California Privacy
  • Do not sell my personal information – CA resident only