mirror of
https://gitee.com/johng/gf
synced 2026-06-07 02:12:11 +08:00
修复gdb查询缓存失效问题
This commit is contained in:
@ -17,6 +17,7 @@ import (
|
||||
"gitee.com/johng/gf/g/container/gtype"
|
||||
"gitee.com/johng/gf/g/container/gring"
|
||||
"gitee.com/johng/gf/g/os/gcache"
|
||||
"gitee.com/johng/gf/g/container/gmap"
|
||||
)
|
||||
|
||||
const (
|
||||
@ -126,6 +127,9 @@ var linkMysql = &dbmysql{}
|
||||
// PostgreSQL接口对象
|
||||
var linkPgsql = &dbpgsql{}
|
||||
|
||||
// 数据库查询缓存对象map,使用数据库连接名称作为键名,键值为查询缓存对象
|
||||
var dbCaches = gmap.NewStringInterfaceMap()
|
||||
|
||||
// 使用默认/指定分组配置进行连接,数据库集群配置项:default
|
||||
func New(groupName...string) (*Db, error) {
|
||||
name := config.d
|
||||
@ -158,7 +162,7 @@ func New(groupName...string) (*Db, error) {
|
||||
if len(slaveList) > 0 {
|
||||
slaveNode = getConfigNodeByPriority(slaveList)
|
||||
}
|
||||
return newDb(masterNode, slaveNode)
|
||||
return newDb(masterNode, slaveNode, name)
|
||||
} else {
|
||||
return nil, errors.New(fmt.Sprintf("empty database configuration for item name '%s'", name))
|
||||
}
|
||||
@ -198,7 +202,7 @@ func getConfigNodeByPriority (cg ConfigGroup) *ConfigNode {
|
||||
}
|
||||
|
||||
// 创建数据库链接对象
|
||||
func newDb (masterNode *ConfigNode, slaveNode *ConfigNode) (*Db, error) {
|
||||
func newDb (masterNode *ConfigNode, slaveNode *ConfigNode, groupName string) (*Db, error) {
|
||||
var link Link
|
||||
switch masterNode.Type {
|
||||
case "mysql": link = linkMysql
|
||||
@ -217,14 +221,27 @@ func newDb (masterNode *ConfigNode, slaveNode *ConfigNode) (*Db, error) {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
return &Db {
|
||||
db := &Db {
|
||||
link : link,
|
||||
master : master,
|
||||
slave : slave,
|
||||
charl : link.getQuoteCharLeft(),
|
||||
charr : link.getQuoteCharRight(),
|
||||
debug : gtype.NewBool(),
|
||||
cache : gcache.New(),
|
||||
}, nil
|
||||
}
|
||||
if v := dbCaches.Get(groupName); v == nil {
|
||||
dbCaches.LockFunc(func(m map[string]interface{}) {
|
||||
if v, ok := m[groupName]; !ok {
|
||||
db.cache = gcache.New()
|
||||
m[groupName] = db.cache
|
||||
} else {
|
||||
db.cache = v.(*gcache.Cache)
|
||||
}
|
||||
})
|
||||
} else {
|
||||
db.cache = v.(*gcache.Cache)
|
||||
}
|
||||
|
||||
return db, nil
|
||||
}
|
||||
|
||||
|
||||
@ -20,7 +20,7 @@ import (
|
||||
// http客户端
|
||||
type Client struct {
|
||||
http.Client // 底层http client对象
|
||||
header map[string]string // header
|
||||
header map[string]string // HEADER信息Map
|
||||
authUser string // HTTP基本权限设置:名称
|
||||
authPass string // HTTP基本权限设置:密码
|
||||
}
|
||||
@ -63,7 +63,8 @@ func (c *Client) Put(url, data string) (*ClientResponse, error) {
|
||||
return c.DoRequest("PUT", url, []byte(data))
|
||||
}
|
||||
|
||||
// POST请求提交数据
|
||||
// POST请求提交数据,默认使用表单方式提交数据(绝大部分场景下也是如此)。
|
||||
// 如果服务端对Content-Type有要求,可使用Client对象进行请求,单独设置相关属性。
|
||||
// 支持文件上传,需要字段格式为:FieldName=@file:
|
||||
func (c *Client) Post(url, data string) (*ClientResponse, error) {
|
||||
var req *http.Request
|
||||
|
||||
@ -70,7 +70,7 @@ func (s *Server)parsePattern(pattern string) (domain, method, uri string, err er
|
||||
return
|
||||
}
|
||||
|
||||
// 注册服务处理方法
|
||||
// 路由注册处理方法
|
||||
func (s *Server) setHandler(pattern string, item *HandlerItem) error {
|
||||
domain, method, uri, err := s.parsePattern(pattern)
|
||||
if err != nil {
|
||||
@ -91,7 +91,9 @@ func (s *Server) setHandler(pattern string, item *HandlerItem) error {
|
||||
if _, ok := s.handlerTree[domain]; !ok {
|
||||
s.handlerTree[domain] = make(map[string]interface{})
|
||||
}
|
||||
// 用于遍历的指针
|
||||
p := s.handlerTree[domain]
|
||||
// 当前节点的规则链表
|
||||
lists := make([]*list.List, 0)
|
||||
array := strings.Split(uri[1:], "/")
|
||||
item.router.Priority = len(array)
|
||||
@ -117,7 +119,7 @@ func (s *Server) setHandler(pattern string, item *HandlerItem) error {
|
||||
}
|
||||
p = p.(map[string]interface{})[v]
|
||||
// 到达叶子节点,往list中增加匹配规则
|
||||
if v != "/" && k == len(array) - 1 {
|
||||
if k == len(array) - 1 && v != "/" {
|
||||
if v, ok := p.(map[string]interface{})["*list"]; !ok {
|
||||
p.(map[string]interface{})["*list"] = list.New()
|
||||
lists = append(lists, p.(map[string]interface{})["*list"].(*list.List))
|
||||
@ -127,7 +129,7 @@ func (s *Server) setHandler(pattern string, item *HandlerItem) error {
|
||||
}
|
||||
}
|
||||
}
|
||||
// 从头开始遍历链表,优先级高的放在前面
|
||||
// 从头开始遍历每个节点的模糊匹配链表,将该路由项插入进去(按照优先级高的放在前面)
|
||||
for _, l := range lists {
|
||||
for e := l.Front(); e != nil; e = e.Next() {
|
||||
if s.compareHandlerItemPriority(item, e.Value.(*HandlerItem)) {
|
||||
@ -147,6 +149,8 @@ func (s *Server) setHandler(pattern string, item *HandlerItem) error {
|
||||
s.handlerMap[s.handlerKey(domain, method, uri)] = item
|
||||
}
|
||||
}
|
||||
//b, _ := gparser.VarToJsonIndent(s.handlerTree)
|
||||
//fmt.Println(string(b))
|
||||
return nil
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user