我在哪里/如何托管我的小型数据库驱动的Sinatra支持的Ruby应用程序? Heroku限制数据库连接

时间:2012-08-27 22:49:28

标签: ruby database heroku hosting sinatra

这是我的应用:price inflation calculator。如果单击“计算”,则可能会收到与服务器相关的错误。当我在Sinatra测试应用程序时,我收到错误说

PG::Error: FATAL: too many connections for role "********"

在调查之后,结果是Heroku limits its free databases to 20 connections

我想继续在Heroku上开发小应用程序(尤其是数据库驱动的应用程序),但如果我无法绕过这个限制,我可能无法做到。我会花50美元/月来获得一个允许更多连接的数据库,但我还不知道它是否值得。

我的问题是:有没有人知道是否有可能免费解决这个限制,或者是否有可以托管数据库驱动的Sinatra应用程序的Heroku替代品?

以下是我使用的将通胀数据添加到数据库的代码:

require 'rubygems'
require 'rest-client'
require 'nokogiri'
require 'sequel'

### MAKE CPI DATABASE ###
db_name = 'DATABASE_NAME_HERE'
DB = Sequel.postgres(db_name,:user=>'USER_NAME',:password=>'PASSWORD',:host=>'HOST',:port=>5432,:sslmode=>'require')
    DB.create_table! :cpi_nsa_annual do
        primary_key :id
        Integer :year
        Float :cpi
    end # DONE: DB.create_table :cpi_nsa_annual do
cpi_annual = DB[:cpi_nsa_annual]
### DONE MAKING CPI DATABASE ###

post_url = "http://data.bls.gov/pdq/SurveyOutputServlet"

post_params = {
    'delimiter'=>'comma',
    'output_format'=>'html',
    'output_type'=>'column',
    'periods_option'=>'all_periods',
    'series_id'=>'CUUR0000SA0',
    'years_option'=>'all_years'
}

if page = RestClient.post(post_url,post_params)
    npage = Nokogiri::HTML(page)
    data = npage.css('table.regular-data tbody tr')

    data.each{|row|
        month_prefix = (row.css('th')[2].text)[0]
        year = row.css('th')[1].text
        month = (row.css('th')[2].text)[1..2]
        cpi = row.css('td').text

        if month_prefix=='M' and month=='13'
                cpi_annual.insert(
                    :year=>year,
                    :cpi=>cpi
                ) # DONE: cpi_annual_insert
                p ["YEAR",year,cpi]
        end # DONE: month_prefix=='M' and month!='13'
    }
end # DONE: if page
p cpi_annual.each{|row| p row}

2 个答案:

答案 0 :(得分:2)

看起来您似乎不需要数据库来完成您在该应用中所需的内容。您是否只是将年费率存储在红宝石代码中的数组中?

$inflation_rates = {"1999" => 2.19, "2000" => 2.97, "2001" => 3.73}

或许我误解了你的应用是如何运作的。

我已经在Heroku上托管了带有数据库的小型Sinatra应用程序而没有任何问题。 20连接限制已足够。你确定它不是你的应用程序的错吗?也许它使用过多的连接?你能发贴你的代码吗?

此外,OpenKeyVal是一个很棒的免费密钥/值数据存储,没有连接限制(唯一的限制是密钥必须低于64KB)。它可能会迫使你改变你的代码,但它至少值得研究。因为您可以使用JSONP调用存储数据,所以您可以构建一个在单个静态html文件中使用数据存储区的应用程序。

答案 1 :(得分:1)

meub的答案表明你将数据存储在数据库之外是合理的,但是如果你觉得你真的想坚持使用数据库,请尝试查看你的应用程序使用这么多连接的原因。

如果您运行select * from pg_stat_database WHERE datname = 'yourdbname','numbackends'字段将告诉您正在为您的数据库建立多少连接。如果您对heroku进行全新部署,然后几次访问您的应用程序,连接数量会增加吗?也许你需要关闭你的连接。

如果在代码末尾添加DB[:cpi_nsa_annual].disconnect,每次加载页面时连接数是否会停止?