golang SQLDriverConnect: {IM005} [Microsoft][ODBC 驅動程式管理器] 驅動程式的 SQLAllocHandle on SQL_HANDLE_DBC 失敗

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

問題:
2015/12/04 17:03:36 sqldb.go:2166: SQLDriverConnect: {IM005} [Microsoft][ODBC 驅動程式管理器] 驅動程式的 SQLAllocHandle on SQL_HANDLE_DBC 失敗

環境: go 語言編寫
SQL SERVER 資料庫
“code.google.com/p/odbc” 資料庫操作使用的包

程式剛啟動,運行一切正常,但是運行一段時間過後,總是會出現以上報錯資訊。仔細查看列印的報錯資訊,初步認為是資料庫出現異常資訊。
追蹤資料庫運行情況,其他的程式串連資料庫能串連上,排除資料庫問題。但是SQLDriverConnect 提醒明顯是提醒串連資料庫失敗。懷疑是否是因為資料庫連接池出現的問題。
查看此應用程式的資料庫連接情況,sql server資料庫的串連數情況,驚奇的發現,竟然有一千多個串連,查看詳細執行的語句情況,發現這一千多個串連,除了幾個串連其他的一千多個都是執行的 兩個語句。同樣的語句寫法

stmt, errs := Db.Prepare("select * from tbl")if errs!=nil {}defer stmt.Close()rows, err := stmt.Query()if err!=nil {}for rows.Next(){    var value int    if ers := rows.Scan(&value); ers == nil {        return value    }}

所有的sql 都一樣寫的但是為什麼只有這兩個語句會出現這麼多串連釋放不掉,查看資料 Prepare 的使用文法,才意外的發現 rows 需要自行關閉,其他的語句之所以沒有出現多串連情況是因為,其他的rows 都迴圈完畢了,rows若自動迴圈完畢,會自行釋放,否則需要手動關閉。

stmt, errs := Db.Prepare("select * from tbl")if errs!=nil {}defer stmt.Close()rows, err := stmt.Query()if err!=nil {}defer rows.Close() //必須手動關閉串連for rows.Next(){    var value int    if ers := rows.Scan(&value); ers == nil {        return value    }}

更改之後,程式運行正常。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.