我有一个简单的 Go 文件,目的是返回客户端信息的 json 响应。当我用 apache 基准测试这个脚本时,请求保持事件状态
ab -t 10s -kc 1000 http://127.0.0.1:8080/clients/show/1
但是当请求没有保持活跃时,我不会遭受这种 panic
ab -t 10s -c 1000 http://127.0.0.1:8080/clients/show/1
错误:
2018/10/26 03:26:42 http: panic serving 127.0.0.1:44800: Error 1040: Too many connections goroutine 220522 [running]: net/http.(*conn).serve.func1(0xc001779e00)
我的代码:
package main
import (
"database/sql"
"encoding/json"
"fmt"
_ "github.com/go-sql-driver/mysql"
"github.com/gorilla/mux"
"net/http"
"runtime"
)
type Client struct {
ID int `json:"id"`
UserID int `json:"user_id"`
Name string `json:"name"`
Telephone string `json:"telephone"`
Email string `json:"email"`
Category sql.NullString `json:"string"`
Notes string `json:"notes"`
Additional sql.NullString `json:"additional"`
CreatedAt sql.NullString `json:"created_at"`
UpdatedAt sql.NullString `json:"updated_at"`
DeletedAt sql.NullString `json:"deleted_at"`
}
func main() {
runtime.GOMAXPROCS(runtime.NumCPU())
r := mux.NewRouter()
r.HandleFunc("/clients/show/{id}", showClient).Methods("GET")
http.ListenAndServe(":8080", r)
}
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello World!")
}
func showClient(w http.ResponseWriter, r *http.Request) {
db, err := sql.Open("mysql", "root@tcp(127.0.0.1:3306)/crm")
if err != nil {
panic(err.Error())
}
var client Client
// Execute the query
err = db.QueryRow("SELECT * FROM clients where id = ?", 1).Scan(
&client.ID,
&client.UserID,
&client.Name,
&client.Telephone,
&client.Email,
&client.Category,
&client.Notes,
&client.Additional,
&client.CreatedAt,
&client.UpdatedAt,
&client.DeletedAt,
)
if err != nil {
panic(err.Error())
}
db.Close()
json.NewEncoder(w).Encode(client)
}
有人可以解释为什么在如此低的并发请求率下会发生这种情况,以及解决此问题的正确方法是什么。
最佳答案
有两个问题,sockets的程序使用和服务器配置
每个连接可能需要 2 个套接字,一个到数据库,一个到 http 客户端。将 sql.Open() 移动到不同的范围,这样它就不会被重复调用,这将有助于数据库套接字。对于 http 服务器,默认值实际上非常低 - 如果有超过 2 个未使用的保持连接,则关闭连接
此外,您的服务器可能需要修改
作为this answer讨论,Linux 的默认每秒连接数相当保守,一个小型简单的 Go 服务器很可能会超过它。
根据上述答案调整服务器,这应该会有所帮助。
关于go - 当连接保持事件状态时,我得到太多打开的连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53000582/
我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta
我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以
当我的预订模型通过rake任务在状态机上转换时,我试图找出如何跳过对ActiveRecord对象的特定实例的验证。我想在reservation.close时跳过所有验证!叫做。希望调用reservation.close!(:validate=>false)之类的东西。仅供引用,我们正在使用https://github.com/pluginaweek/state_machine用于状态机。这是我的预订模型的示例。classReservation["requested","negotiating","approved"])}state_machine:initial=>'requested
我使用的是Firefox版本36.0.1和Selenium-Webdrivergem版本2.45.0。我能够创建Firefox实例,但无法使用脚本继续进行进一步的操作无法在60秒内获得稳定的Firefox连接(127.0.0.1:7055)错误。有人能帮帮我吗? 最佳答案 我遇到了同样的问题。降级到firefoxv33后一切正常。您可以找到旧版本here 关于ruby-无法在60秒内获得稳定的Firefox连接(127.0.0.1:7055),我们在StackOverflow上找到一个类
对于作为String#tr参数的单引号字符串文字中反斜杠的转义状态,我觉得有些神秘。你能解释一下下面三个例子之间的对比吗?我特别不明白第二个。为了避免复杂化,我在这里使用了'd',在双引号中转义时不会改变含义("\d"="d")。'\\'.tr('\\','x')#=>"x"'\\'.tr('\\d','x')#=>"\\"'\\'.tr('\\\d','x')#=>"x" 最佳答案 在tr中转义tr的第一个参数非常类似于正则表达式中的括号字符分组。您可以在表达式的开头使用^来否定匹配(替换任何不匹配的内容)并使用例如a-f来匹配一
我目前正在使用以下方法获取页面的源代码:Net::HTTP.get(URI.parse(page.url))我还想获取HTTP状态,而无需发出第二个请求。有没有办法用另一种方法做到这一点?我一直在查看文档,但似乎找不到我要找的东西。 最佳答案 在我看来,除非您需要一些真正的低级访问或控制,否则最好使用Ruby的内置Open::URI模块:require'open-uri'io=open('http://www.example.org/')#=>#body=io.read[0,50]#=>"["200","OK"]io.base_ur
是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s
我正在尝试将以下SQL查询转换为ActiveRecord,它正在融化我的大脑。deletefromtablewhereid有什么想法吗?我想做的是限制表中的行数。所以,我想删除少于最近10个条目的所有内容。编辑:通过结合以下几个答案找到了解决方案。Temperature.where('id这给我留下了最新的10个条目。 最佳答案 从您的SQL来看,您似乎想要从表中删除前10条记录。我相信到目前为止的大多数答案都会如此。这里有两个额外的选择:基于MurifoX的版本:Table.where(:id=>Table.order(:id).
我想为我的Task模型创建一个status属性,该属性将按以下顺序指示它在三部分进度中的位置:打开=>进行中=>完成。它的工作方式类似于亚马逊包裹的交付方式:已订购=>已发货=>已交付。我想知道设置此属性的最佳方法是什么。我可能是错的,但创建三个独立的bool属性似乎有点多余。实现此目标的最佳方法是什么? 最佳答案 Rails4有一个内置的enummacro.它使用单个整数列并映射到键列表。classOrderenumstatus:[:ordered,:shipped,:delivered]end状态映射如下:{ordered:0,