go version go1.8.1 windows/amd64 我正在导入

"github.com/mattn/go-oci8"  
"database/sql"  

用于连接到我的 oracle 数据库。在这里,当我在连接字符串中提供数据库用户名、密码、端口和表名时

func openAndConnectToDb(sbconfig ConnectorConfig) *sql.DB { 
    logger := sbgoclient.Log 
    logger.Println("Open the database") 
    //  oraprop := LoadConfig("oraproperties.yml") 
    fmt.Println("Load config complete") 
    orrrr := sbconfig.DB_Username + "/" + sbconfig.DB_Password + "@" + "//" + sbconfig.DB_Ip + ":" + sbconfig.DB_Port + "/" + sbconfig.DB_Schema 
    fmt.Println("orrr formed: ", orrrr) 
    db, err := sql.Open(sbconfig.DbType, orrrr) 
    if err != nil { 
        logger.Println("database connection failed...") 
        logger.Fatal(err) 
    } 
 
    //Use a backoff/retry strategy - we can start this client before 
    //the database is started, and see it eventually connect and process 
    //queries 
    var dbError error 
    maxAttempts := 20 
    for attempts := 1; attempts <= maxAttempts; attempts++ { 
        logger.Println("pinging database...") 
        dbError = db.Ping() 
        if dbError == nil { 
            logger.Println("database ping successfull........") 
            fmt.Println("database ping successfull........") 
            break 
        } 
        logger.Println("Ping failed: ", dbError, "retry in ", attempts, " seconds.") 
        time.Sleep(time.Duration(attempts) * time.Second) 
    } 
    if dbError != nil { 
        logger.Fatal(dbError) 
    } 
 
    return db 
} 

它无法连接,而在 java 中,如果我在 JDBC 连接字符串中指定用户名、密码、端口、服务名和表名,它会成功连接。

输出是

time="2017-10-10T13:43:02+05:30" level=info msg="Open the database"  
time="2017-10-10T13:43:02+05:30" level=info msg="pinging database..."  
time="2017-10-10T13:43:24+05:30" level=info msg="Ping failed:  ORA-12170: TNS:Connect timeout occurred 
retry in  1  seconds."  
time="2017-10-10T13:43:25+05:30" level=info msg="pinging database..."  
time="2017-10-10T13:43:46+05:30" level=info msg="Ping failed:  ORA-12170: TNS:Connect timeout occurred  
retry in  2  seconds."  

请您参考如下方法:

我无法确切地告诉您为什么您的代码无法正常工作,但我可以为您提供一些我以顾问身份参与的示例代码:

https://github.com/odbaeu/oracledb_metricbeat/blob/master/oracledb.go

这里是创建新连接的代码片段:

// NewDB returns a new oracle database handle. The dsn value (data source name) 
// must be valid, otherwise an error will be returned. 
// 
//   DSN Format: username/password@host:port/service_name 
func NewDB(ociURL string) (*sql.DB, error) { 
    // NLS_LANG is set to American format. At least NLS_NUMERIC_CHARACTERS has to be ".,". 
    os.Setenv("NLS_LANG", "AMERICAN_AMERICA.AL32UTF8") 
    os.Setenv("NLS_DATE_FORMAT", "YYYY-MM-DD\"T\"HH24:MI:SS") 
 
    // Open DB connection 
    oConn, err := sql.Open("oci8", ociURL) 
    if err != nil { 
        return oConn, errors.Wrap(err, "sql open failed") 
    } 
 
    return oConn, nil 
} 


评论关闭
IT虾米网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!