2009-01-23 48 views
16

Tôi có một chương trình Java bao gồm khoảng 15 phương pháp. Và, các phương thức này được gọi rất thường xuyên trong quá trình exeuction của chương trình. Hiện tại, tôi đang tạo một kết nối mới trong mọi phương thức và gọi các câu lệnh trên chúng (Cơ sở dữ liệu được thiết lập trên một máy khác trên mạng). Điều tôi muốn biết là: Tôi có nên tạo chỉ một kết nối trong phương thức chính và truyền nó như một đối số cho tất cả các phương thức yêu cầu đối tượng kết nối vì nó sẽ làm giảm đáng kể số lượng đối tượng kết nối trong chương trình hay không. , thay vì tạo và đóng kết nối rất thường xuyên trong mọi phương thức.Có bao nhiêu kết nối JDBC trong Java?

Tôi nghi ngờ tôi không sử dụng các tài nguyên rất hiệu quả với thiết kế hiện tại, và có rất nhiều phạm vi để cải thiện, xem xét rằng chương trình này có thể phát triển rất nhiều trong tương lai.

Trả lời

21

Có, bạn nên cân nhắc sử dụng lại kết nối thay vì tạo kết nối mới mỗi lần. Thủ tục thông thường là:

  • hãy đoán xem có bao nhiêu kết nối đồng thời mà cơ sở dữ liệu của bạn có thể xử lý một cách hợp lý (ví dụ:bắt đầu bằng 2 hoặc 3 trên mỗi CPU trên máy cơ sở dữ liệu cho đến khi bạn phát hiện ra rằng quá ít hoặc quá nhiều-- nó sẽ có xu hướng phụ thuộc vào cách truy vấn của bạn bị ràng buộc theo đĩa)
  • tạo một pool nhiều kết nối: về cơ bản là một lớp mà bạn có thể yêu cầu "kết nối miễn phí tiếp theo" ở đầu mỗi phương thức và sau đó "chuyển lại" vào hồ bơi ở cuối mỗi phương thức
  • phương thức getFreeConnection() của bạn cần trả về kết nối miễn phí nếu có, hoặc (1) tạo mới, tối đa số kết nối bạn đã quyết định cho phép, hoặc (2) nếu giá trị tối đa đã được tạo, hãy chờ một để trở thành miễn phí
  • Tôi muốn giới thiệu lớp Semaphore để quản lý các kết nối; Tôi thực sự có một bài báo ngắn trên trang web của tôi trên managing a resource pool with a Semaphore với một ví dụ tôi nghĩ bạn có thể thích ứng với mục đích của bạn

Một vài cân nhắc thực hiện:

  • Đối với hiệu suất tối ưu, bạn cần phải cẩn thận không phải để "hog" một kết nối trong khi bạn không thực sự sử dụng nó để chạy truy vấn. Nếu bạn có một kết nối từ các hồ bơi một lần và sau đó vượt qua nó để phương pháp khác nhau, bạn cần phải chắc chắn rằng bạn không vô tình làm điều này.
  • Đừng quên trả lại kết nối của bạn với hồ bơi! (thử/cuối cùng là bạn của bạn ở đây ...)
  • Trên nhiều hệ thống, bạn không thể giữ kết nối mở 'mãi mãi': O/S sẽ đóng chúng sau một khoảng thời gian tối đa. Vì vậy, trong phương thức 'return a connection to the pool', bạn sẽ cần phải suy nghĩ về các kết nối 'retiring' to the pool '' retiring 'đã tồn tại trong một thời gian dài (xây dựng trong một số cơ chế để ghi nhớ, ví dụ như có một đối tượng bao bọc wrapper xung quanh một đối tượng kết nối JDBC thực tế mà bạn có thể sử dụng để lưu trữ các số liệu như thế này)
  • Bạn có thể cân nhắc sử dụng các câu lệnh đã chuẩn bị.
  • Qua thời gian, có thể bạn sẽ cần phải tinh chỉnh kích thước hồ bơi kết nối
+0

Bạn có thể giải thích cách Báo cáo chuẩn bị có thể trợ giúp ở đây không? – Epitaph

+0

@neilCoffey nếu 'nghỉ hưu' các kết nối không được xem xét; Tại sao chúng ta cần nhiều kết nối? một kết nối duy nhất có thể được sử dụng ở mọi nơi; kể từ khi objs tuyên bố luôn khác nhau? Khi chúng tôi yêu cầu nhiều kết nối trong ứng dụng? –

+0

Một kết nối duy nhất được sử dụng để chạy một số lượng truy vấn vô hạn (theo lý thuyết) như bạn nói. Nhưng nó chỉ có thể chạy một truy vấn tại một thời điểm. Trên một hệ thống phức tạp vừa phải, bạn thường cần cho phép khả năng chạy một số truy vấn đồng thời. –

8

Bạn nên sử dụng hồ bơi kết nối cho điều đó.

Bằng cách đó bạn có thể yêu cầu kết nối và giải phóng nó khi bạn đang kết thúc với nó và gửi lại cho hồ bơi

Nếu thread khác muốn có một kết nối mới và là một trong sử dụng, một cái mới có thể tạo. Nếu không có chủ đề nào khác đang sử dụng kết nối thì có thể sử dụng lại.

Bằng cách này, bạn có thể rời ứng dụng của bạn bằng cách nào đó theo cách của nó (và không chuyển kết nối xung quanh) và vẫn sử dụng tài nguyên đúng cách. Không may là lớp đầu tiên ConnectionPools không phải là rất dễ sử dụng trong các ứng dụng độc lập (chúng là mặc định trong các máy chủ ứng dụng) Có thể là một microcontainer (như Sping) hoặc một framework tốt (chẳng hạn như Hibernate) có thể cho phép bạn sử dụng nó.

Chúng không quá khó để mã hóa từ đầu.

:)

This google search sẽ giúp bạn tìm hiểu thêm về cách sử dụng.

Lướt qua

+0

nếu không còn xem xét kết nối 'nghỉ hưu'; Tại sao chúng ta cần nhiều kết nối? một kết nối duy nhất có thể được sử dụng ở mọi nơi; kể từ khi objs tuyên bố luôn khác nhau? Khi chúng tôi yêu cầu nhiều kết nối trong ứng dụng? –

0

Nếu ứng dụng của bạn là đơn luồng, hoặc làm tất cả các hoạt động cơ sở dữ liệu của mình từ một chủ đề duy nhất, đó là ok để sử dụng một đơn kết nối. Giả sử bạn không cần nhiều kết nối vì bất kỳ lý do nào khác, điều này sẽ là việc triển khai đơn giản nhất.

Tùy thuộc vào trình điều khiển của bạn, bạn cũng có thể chia sẻ kết nối giữa các chủ đề - điều này cũng được, nếu bạn tin tưởng trình điều khiển không nói dối về an toàn luồng của nó. Xem tài liệu trình điều khiển của bạn để biết thêm thông tin. Thông thường các đối tượng bên dưới "Kết nối" không thể được sử dụng an toàn từ nhiều chủ đề, vì vậy thường không nên chia sẻ ResultSet, đối tượng Statement vv giữa chủ đề - chính sách tốt nhất là sử dụng chúng trong cùng một chuỗi đã tạo chúng ; điều này thường dễ dàng bởi vì những vật thể này thường không được giữ quá lâu.

3

Nhiều trình điều khiển JDBC thực hiện kết nối tổng hợp cho bạn, do đó, có rất ít lợi thế khi thực hiện bổ sung tổng hợp trong trường hợp này. Tôi đề nghị bạn kiểm tra tài liệu cho bạn trình điều khiển JDBC.

cách tiếp cận khác để hồ kết nối là để

  • Có một kết nối cho tất cả các truy cập cơ sở dữ liệu với truy cập đồng bộ.Điều này không cho phép đồng thời nhưng rất đơn giản.
  • Lưu trữ các kết nối trong một biến ThreadLocal (ghi đè initialValue()) Điều này hoạt động tốt nếu có một số cố định nhỏ của chủ đề.

Nếu không, tôi khuyên bạn nên sử dụng hồ bơi kết nối.

Các vấn đề liên quan