thắc mắc [Java] Thắc mắc về Java

đương nhiên là nên dùng lock mysql. còn ví dụ của my fen ý là sao, tôi k hiểu lắm nhỉ? thằng thread đầu tiên update record thì nó lock row, những thread sau pending cho đến khi timeout hoặc thằng #1 done tùy điều kiện nào đến trước... nên là những thằng sau sửa được nhưng tính đúng đắn thì phụ thuộc vào thứ tự của transactions.
Em định để tất cả các luồng dùng chung 1 đối tượng kết nối, và khi luồng nào dùng phương thức kết nối thì các luồng khác sẽ phải chờ, và nếu k dùng cách đó thì e sẽ dùng mỗi luồng 1 đối tượng kết nối riêng, và sẽ lock table. Nhưng đang phân vân không biết các dev chuyên nghiệp, app lớn thì dùng cách nào để tối ưu hiệu suất và tránh đụng độ
 
Em định để tất cả các luồng dùng chung 1 đối tượng kết nối, và khi luồng nào dùng phương thức kết nối thì các luồng khác sẽ phải chờ, và nếu k dùng cách đó thì e sẽ dùng mỗi luồng 1 đối tượng kết nối riêng, và sẽ lock table. Nhưng đang phân vân không biết các dev chuyên nghiệp, app lớn thì dùng cách nào để tối ưu hiệu suất và tránh đụng độ
use case của fen là gì, chứ như này thì multi thread có tác dụng gì đâu, connection chỉ có 1 thằng hold còn lại chờ :angry:
 
Ở hcm thì rảnh rủ mình ra mình chỉ vài trick lỏ để newbie học cho nhanh
Trình minh kém nên chỉ chắc không master được như mấy thím khác
thím masterr java k ? e xin nhận làm đệ
JEWoIdl.png
 
Em định để tất cả các luồng dùng chung 1 đối tượng kết nối, và khi luồng nào dùng phương thức kết nối thì các luồng khác sẽ phải chờ, và nếu k dùng cách đó thì e sẽ dùng mỗi luồng 1 đối tượng kết nối riêng, và sẽ lock table. Nhưng đang phân vân không biết các dev chuyên nghiệp, app lớn thì dùng cách nào để tối ưu hiệu suất và tránh đụng độ
Bạn sử dụng pessimistic lock hoặc optimistic lock của Mysql
Pessimistic lock sẽ đảm bảo dữ liệu không bị dirty read, dirty write. Các request sẽ được xếp hàng hết request này đến request khác
Optimistic lock sẽ đảm bảo cho bạn không bị dirty write, khi bạn cố gắng update một row mà nó đã bị thay đổi từ lúc bạn đọc thì bạn sẽ nhận về error.

Use case:
Pessimistic lock: sử dụng khi đụng độ xảy ra nhiều, chi phí để retry transaction tốn kém. Ví dụ như trấnction giao dịch ngân hàng
Optimistic lock: sử dụng khi đụng độ it khi xảy ra và chi phí để retry transaction thấp

Còn có một pattern nâng cao nữa là sử dụng optimistic lock kết hợp retry pattern.

Chúc bạn chọn được giải pháp phù hợp
 
các bác cho em hỏi, em đang làm việc với Thread và mysql, e có thắc mắc là nên dùng lock table trong mysql hay dùng synchonized để đồng bộ trong ứng dụng java? Ví dụ các Thread đều kết nối đến cùng một cơ sở dữ liệu và cùng cập nhật ở 1 dòng của 1 table cùng một lúc, thằng đầu tiên sửa trước thì tất cả thằng sau sẽ không thể sửa được dòng đó nữa
Dùng optimistic lock (MySQL) là được nha bác, và nên lock trên row cần update chứ không cần phải lock cả table, Nhưng nếu tất cả các thread chỉ update 1 record trong thời gian dài thì dễ gây bottleneck. Synchronized sẽ không giải quyết được vấn đề khi bạn scale lên nhiều process trên môi trường production.

Em định để tất cả các luồng dùng chung 1 đối tượng kết nối, và khi luồng nào dùng phương thức kết nối thì các luồng khác sẽ phải chờ, và nếu k dùng cách đó thì e sẽ dùng mỗi luồng 1 đối tượng kết nối riêng, và sẽ lock table. Nhưng đang phân vân không biết các dev chuyên nghiệp, app lớn thì dùng cách nào để tối ưu hiệu suất và tránh đụng độ
Cách dễ nhất để tối ưu hiệu suất lúc làm việc với csdl là dùng connection pool để giảm thời gian thiết lập kết nối. Ngoài ra còn có thể sử dụng các thư viện bất đồng bộ - async (RxJava, SmallRye Mutiny) để tối ưu CPU utilization.

Theo kinh nghiệm cá nhân thì mình thấy optimistic locking đủ tốt để giải quyết phần lớn vấn đề.
 
Back
Top