• go+postgresql服务器


      1 func AddGroup(w http.ResponseWriter, req *http.Request) {
      2 
      3     outputReq(req)
      4 
      5     responseJson := map[string]interface{}{jsonKeyMessage: "", jsonKeyResult: nil}
      6 
      7     initResponse(w)
      8     err := req.ParseForm()
      9     if err != nil {
     10         writeResponse(err.Error(), responseJson, w, http.StatusInternalServerError)
     11         return
     12     }
     13 
     14     nickname := toString(req.Form["nickname"])
     15     delete(req.Form, "nickname")
     16     icon := toString(req.Form["icon"])
     17     delete(req.Form, "icon")
     18 
     19     requestJson := initRequestJson(req.Form)
     20     customInfo, err := json.Marshal(requestJson)
     21     if err != nil {
     22         writeResponse(err.Error(), responseJson, w, http.StatusInternalServerError)
     23         return
     24     }
     25 
     26     db, err := openSql()
     27     defer db.Close()
     28     if err != nil {
     29         writeResponse(err.Error(), responseJson, w, http.StatusInternalServerError)
     30         return
     31     }
     32 
     33     tx, err := db.Begin()
     34     if err != nil {
     35         writeResponse(err.Error(), responseJson, w, http.StatusInternalServerError)
     36         return
     37     }
     38 
     39     stmt, err := tx.Prepare(`
     40     insert into objects(nickname,icon,custom,isUser)
     41     values ($1,$2,$3,false) returning id
     42     `)
     43     if err != nil {
     44         writeResponse(err.Error(), responseJson, w, http.StatusInternalServerError)
     45         return
     46     }
     47 
     48     rows, err := stmt.Query(nickname, icon, customInfo)
     49     if err != nil {
     50         errString := err.Error() + " " + errorString(tx.Rollback())
     51         writeResponse(errString, responseJson, w, http.StatusInternalServerError)
     52         return
     53     }
     54 
     55     if !rows.Next() {
     56         errString := "add group failed! " + errorString(tx.Rollback())
     57         writeResponse(errString, responseJson, w, http.StatusInternalServerError)
     58         return
     59     }
     60 
     61     var groupID int64
     62     err = rows.Scan(&groupID)
     63     ///fmt.Println("groupID:", +groupID)
     64     if err != nil {
     65         errString := err.Error() + " " + errorString(tx.Rollback())
     66         writeResponse(errString, responseJson, w, http.StatusInternalServerError)
     67         return
     68     }
     69 
     70     err = rows.Close()
     71     if err != nil {
     72         errString := err.Error() + " " + errorString(tx.Rollback())
     73         writeResponse(errString, responseJson, w, http.StatusInternalServerError)
     74         return
     75     }
     76     err = stmt.Close()
     77     if err != nil {
     78         errString := err.Error() + " " + errorString(tx.Rollback())
     79         writeResponse(errString, responseJson, w, http.StatusInternalServerError)
     80         return
     81     }
     82     stmt, err = tx.Prepare("insert into groups(id,createTime) values($1,now())")
     83     defer stmt.Close()
     84     if err != nil {
     85         errString := err.Error() + " " + errorString(tx.Rollback())
     86         writeResponse(errString, responseJson, w, http.StatusInternalServerError)
     87         return
     88     }
     89 
     90     result, err := stmt.Exec(groupID)
     91     //rows1, err := tx.Exec("insert into groups(id,createTime) values('" + fmt.Sprint(groupID) + "',now())")
     92     if err != nil {
     93         errString := err.Error() + " " + errorString(tx.Rollback())
     94         writeResponse(errString, responseJson, w, http.StatusInternalServerError)
     95         return
     96     }
     97 
     98     affect, err := result.RowsAffected()
     99     if err != nil {
    100         errString := err.Error() + " " + errorString(tx.Rollback())
    101         writeResponse(errString, responseJson, w, http.StatusInternalServerError)
    102         return
    103     }
    104     if affect != 1 {
    105         errString := "add group failed! " + errorString(tx.Rollback())
    106         writeResponse(errString, responseJson, w, http.StatusInternalServerError)
    107         return
    108     }
    109 
    110     _, err = tx.Exec("commit")
    111     if err != nil {
    112         writeResponse(err.Error(), responseJson, w, http.StatusInternalServerError)
    113         return
    114     }
    115     responseJson[jsonKeyResult] = fmt.Sprint(groupID)
    116     writeResponse("success", responseJson, w, http.StatusOK)
    117 }
    postgresql事务

     上面代码有一个大bug,事务最后执行tx.Exec("commit"),然后没有执行tx.Commit(),导致事务没有关闭,然后每次一执行就产生一个连接postgresql的tcp,一直没关闭,在线程里看到的是(idle)死进程,最后导致postgresql太多客户端,然后报错FATAL: sorry, too many clients already 

    用root进入psql,执行

    SELECT COUNT(*) from pg_stat_activity;

    发现结果是100(默认最大连接)

    执行sudo service postgresql-9.6重启postgresql,然后找代码bug

     解决:使用连接池channal,限定最大连接数,或者只用一个db,每次用的时候都加互斥锁

  • 相关阅读:
    cenos安装memcache
    微信开发——测试号申请,接口配置,JS接口安全域名,自定义菜单
    mysql设计-优化
    mysql设计-基本操作
    CI框架部署后访问出现404
    ueditor的bug
    git操作
    github基本操作
    基于SSH协议clone GitHub远端仓库到本地-git
    Thinkphp5.0 路由
  • 原文地址:https://www.cnblogs.com/cdyboke/p/6623044.html
Copyright © 2020-2023  润新知