From 0ddfdae20c8ae57df9bdbf9bf8d62048ac9ee957 Mon Sep 17 00:00:00 2001 From: John Date: Mon, 23 Jul 2018 19:17:17 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dgdb=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E7=BC=93=E5=AD=98=E5=A4=B1=E6=95=88=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- g/database/gdb/gdb.go | 27 ++++++++++++++++++++++----- g/net/ghttp/ghttp_client_request.go | 5 +++-- g/net/ghttp/ghttp_server_router.go | 10 +++++++--- 3 files changed, 32 insertions(+), 10 deletions(-) diff --git a/g/database/gdb/gdb.go b/g/database/gdb/gdb.go index 95db1948a..9abcda604 100644 --- a/g/database/gdb/gdb.go +++ b/g/database/gdb/gdb.go @@ -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 } diff --git a/g/net/ghttp/ghttp_client_request.go b/g/net/ghttp/ghttp_client_request.go index b44c24a94..1108587cc 100644 --- a/g/net/ghttp/ghttp_client_request.go +++ b/g/net/ghttp/ghttp_client_request.go @@ -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 diff --git a/g/net/ghttp/ghttp_server_router.go b/g/net/ghttp/ghttp_server_router.go index 4307bd88c..00b22ed38 100644 --- a/g/net/ghttp/ghttp_server_router.go +++ b/g/net/ghttp/ghttp_server_router.go @@ -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 }