2017-10-10 104 views
0

去版本go1.8.1窗/ amd64和我進口Golang使用JDBC或ODBC或者是什麼連接類型

"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." 
+2

'在這裏,當我給db用戶名......在哪裏?你的代碼失敗了,錯誤在哪裏? –

+0

@NicholasKrasnov我已經用代碼和輸出更新了我的問題 – vijay

+1

你確定連接字符串是正確的嗎? 'user/pass @ // 127.0.0.1'對我來說似乎很奇怪。 – Peter

回答

1

我不能告訴你到底爲什麼你的代碼IST不工作,但我可以爲您提供一些示例代碼,我參與了一個顧問的身份:

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/[email protected]: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 
} 
+0

我需要設置NLS_LANG是這個必修 – vijay

+0

最好的建議:先讓它工作,然後嘗試沒有。我的朋友寫這個軟件包是一位oracle專家,我更喜歡去程序員。所以我不能真的回答,對不起。 – TehSphinX

+0

它適用於sid,如xe,但如果sid是xe.DATA,那麼它無法連接 – vijay