2

这是我的应用程序:价格通胀计算器。如果单击“计算”,您可能会收到与服务器相关的错误。当我在 Sinatra 中测试应用程序时,我收到一条错误消息

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

经过调查,Heroku 将其免费数据库限制为 20 个连接

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

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

这是我使用的将通货膨胀数据添加到数据库的代码:

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}
4

2 回答 2

2

看起来你真的不需要一个数据库来完成你在那个应用程序中想要的东西。您不能将年费率存储在您的 ruby​​ 代码中的数组中吗?

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

或者我可能误解了您的应用程序是如何工作的。

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

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

于 2012-08-27T23:50:48.517 回答
1

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

如果您运行select * from pg_stat_database WHERE datname = 'yourdbname'“numbackends”字段,将告诉您有多少连接正在连接到您的数据库。如果您对 Heroku 进行全新部署,然后访问您的应用几次,连接数是否会增加?也许您需要关闭连接。

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

于 2012-08-28T02:29:53.297 回答