sql.Open() trả về một biến kiểu * sql.DBGo/Golang sql.DB tái sử dụng trong các chức năng
Tôi có một chức năng mà các cuộc gọi 10 chức năng khác mà tất cả cần phải thực hiện cơ sở dữ liệu gọi
là nó chính xác hơn/hiệu quả để:
- Gửi con trỏ * sql.DB đến từng chức năng, hoặc
- Tạo một đối tượng * sql.DB mới trong mỗi chức năng
Nghĩa
func DoLotsOfThings() {
db, _ := sql.Open()
defer db.Close()
DoTask1(db)
DoTask2(db)
}
hoặc
func DoLotsOfThings() {
DoTask1()
DoTask2()
}
func DoTask1() {
db, _ := sql.Open()
defer db.Close()
}
func DoTask1() {
db, _ := sql.Open()
defer db.Close()
}
Lý do tại sao tôi hỏi là vì tôi hiện đang gửi con trỏ đến từng chức năng và tài xế của tôi dường như phá vỡ. Tôi đang sử dụng http://code.google.com/p/odbc, điều này khiến tôi tin rằng mỗi chức năng cần phải có riêng của mình và tôi có thể dựa vào nội bộ của người lái xe.
EDIT
RE lái xe vỡ, nó chỉ xảy ra trong các môi trường giao thông cao. Và nó chỉ xảy ra sau khi nói, mười phút hoặc lâu hơn. Điều này khiến tôi tin rằng có một số loại rò rỉ bộ nhớ làm cho việc sử dụng trình điều khiển ngừng hoạt động. Tuy nhiên tôi trì hoãn db.Close() cho mỗi cá thể của * sql.DB, vì vậy tôi không biết những gì khác tôi có thể làm để giải quyết vấn đề này.
andybalholm nói tổng hợp kết nối được xử lý trong nội bộ, mà có vẻ là chính xác, bởi vì nó chỉ phá vỡ sau khi tôi cố gắng để thực hiện một cái gì đó, không phải khi tôi gọi sql.Open()
Nếu tôi rời Go ứng dụng của tôi chạy , nó sẽ không thể thực hiện bất kỳ loại truy vấn SQL nào, nhưng nếu tôi cố gắng chạy các kiểm tra Go khác kết nối riêng với MSSQL và chạy các truy vấn, nó hoạt động.
Nếu bạn có thể đăng một ví dụ tái sản xuất tại đây https://code.google.com/p/odbc/issues/list, tôi sẽ cố gắng khắc phục nó. – alex