package xugu import ( "context" "database/sql/driver" "fmt" "net" "time" ) type connector struct { dsn string } // Driver implements driver.Connector interface. // Driver returns &XuguDriver{} func (conntor *connector) Driver() driver.Driver { fmt.Println(">>>>>(conntor *connector) Driver()") return &XuguDriver{} } // Connect implements driver.Connector interface. // Connect returns a connection to the database. /* dsn解析 创建连接 设置为 tcp 长连接( 创建连接缓冲区 设置连接超时配置 接收来自服务端的握手请求 */ func (conntor *connector) Connect(ctx context.Context) (driver.Conn, error) { fmt.Println(">>>>>(conntor *connector) Connect(ctx context.Context) ") dsnConfig := parseDSN(conntor.dsn) xgConn := &xuguConn{conn: nil} xgConn.dsnConfig = dsnConfig nd := net.Dialer{Timeout: 5 * time.Second} netConn, err := nd.DialContext(ctx, "tcp", fmt.Sprintf("%s:%s", xgConn.IP, xgConn.Port)) if err != nil { fmt.Println("tcp error", err) return nil, err } // 启用 TCP 保活 if tc, ok := netConn.(*net.TCPConn); ok { if err := tc.SetKeepAlive(true); err != nil { //c.cfg.Logger.Print(err) // 如果设置保活失败,记录错误但不终止 fmt.Println("SetKeepAlive error", err) } } xgConn.conn = netConn xgConn.Type = HT_CONN xgConn.readBuff = newBuffer(xgConn.conn) fmt.Println("连接串为: ", conntor.dsn) err = xgSockOpenConn(ctx, xgConn) if err != nil { return nil, err } return xgConn, nil }