转载请注明来源-作者@loongshawn:http://blog.csdn.net/loongshawn/article/details/55252990,建议读者阅读原文,确保获得完整的信息
1.背景
beego的orm模块自带连接池功能,可以通过设置MaxIdleConns、MaxOpenConns来配置连接池属性
orm.SetMaxIdleConns("default",1000)
orm.SetMaxOpenConns("default",2000)
SetMaxOpenConns用于设置最大打开的连接数,默认值为0表示不限制。
SetMaxIdleConns用于设置闲置的连接数。
设置最大的连接数,可以避免并发太高导致连接mysql出现too many connections的错误。设置闲置的连接数则当开启的一个连接使用完成后可以放在池里等候下一次使用。
2.实例
main函数实现用户信息插入、查询、删除、更新,初始化数据库对象,在main函数中仅创建了一个orm.Ormer对象,而不是在具体方法中创建该对象。
package main
import (
"fmt"
"github.com/astaxie/beego/orm"
_ "github.com/go-sql-driver/mysql"
"helloapi/models"
)
func init() {
orm.RegisterDriver("mysql", orm.DRMySQL)
orm.RegisterDataBase("default", "mysql", "manager:123456@tcp(122.66.111.123:3306)/test?charset=utf8")
orm.SetMaxIdleConns("default",1000)
orm.SetMaxOpenConns("default",2000)
}
func main() {
o := orm.NewOrm()
user := models.User{
User_name:"loongshawn",
Age:29,
Email:"loongshawn@jjj.com",
Staff_id:"123456",
Position:"研发工程师",
Extension_number:"",
Telephone_number:"15642314234",
Office_location:"商会产业园",
}
// insert
o.Begin()
id, err := models.UserAdd(o,user)
fmt.Printf("ID: %d, ERR: %v\n", id, err)
if err != nil {
o.Rollback()
fmt.Println("插入user表出错,事务回滚")
} else {
o.Commit()
fmt.Println("插入user表成功,事务提交")
}
// search
u := [] interface{}{user.User_name,user.Age}
var sql = "select * from user where user_name = ? and age = ? and enabled = 1"
users,err := models.UserQuery(o,sql,u)
fmt.Println(users)
// delete
o.Begin()
num, err := models.UserCut(o,user)
fmt.Printf("NUM: %d, ERR: %v\n", num, err)
if err != nil {
o.Rollback()
fmt.Println("插入user表出错,事务回滚")
} else {
o.Commit()
fmt.Println("插入user表成功,事务提交")
}
// update
user.Id = 2
num1, err := models.UserUpdate(o,user)
fmt.Printf("NUM: %d, ERR: %v\n", num1, err)
}
用户model, user.go定义user结构体及插入、查询、删除、更新的方法。
package models
import (
"github.com/astaxie/beego/orm"
"fmt"
)
type User struct {
Id int
User_name string
Age int
Email string
Staff_id string
Position string
Extension_number string
Telephone_number string
Office_location string
}
func init() {
// 需要在init中注册定义的model
orm.RegisterModel(new(User))
}
func UserAdd(o orm.Ormer,user User) (int64, error){
// insert
return o.Insert(&user)
}
func UserQuery(o orm.Ormer,sql string,paras [] interface{}) ([] User,error){
// query
var users [] User
num,err := o.Raw(sql,paras).QueryRows(&users)
fmt.Printf("NUM: %d, ERR: %v\n", num, err)
return users,err
}
func UserCut(o orm.Ormer,user User) (int64, error){
// delete
return o.Delete(&user,"user_name")
}
func UserUpdate(o orm.Ormer,user User) (int64, error){
// update
return o.Update(&user,"user_name")
}
数据库操作效果
当然,还有其它的go持久层框架,因此需要大家使用过程中来比较那个框架合适。
参考资料:
[1]、Beego orm 模块理解困惑