2011-11-07 19 views
6

Tôi có một thiết lập cơ bản trong đó cơ sở dữ liệu được đọc bởi nhiều ứng dụng web và định kỳ tôi có một ứng dụng lô. Trong quá trình viết, sự thiếu hiểu biết của các ứng dụng web làm suy giảm rất nhiều (đọc cơ sở dữ liệu của họ rất chậm).Cập nhật mức độ ưu tiên thấp trên MySQL bằng JDBC - cách kiểm tra xem chúng hoạt động như thế nào

Điều khoản là MySQL db sử dụng công cụ MYISAM, ứng dụng hàng loạt là một ứng dụng Java SE, sử dụng Spring-batch và SimpleJDBCTemplate để phát hành các lệnh SQL thông qua JDBC. Tôi thấy rằng MySQL có một tham số làm giảm mức độ ưu tiên của các thao tác ghi trên động cơ MYISAM: low_priority_updates. Để trích dẫn tài liệu, trong số những tài liệu khác, bạn có thể "SET LOW_PRIORITY_UPDATES = 1 để thay đổi mức ưu tiên trong một chuỗi". Tôi đã chọn điều này vì nó dễ dàng nhất từ ​​quan điểm cấu hình của ứng dụng của tôi. Những gì tôi đã làm được cấu hình DataSource của tôi như vậy mà nó exectutes rằng "SET ..." cho mỗi kết nối nó sẽ mở ra, như vậy:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
     <!-- other props omitted --> 
     <property name="connectionInitSqls"> 
      <list> 
       <value>SET low_priority_updates="ON"</value> 
      </list> 
     </property> 
    </bean> 

Bây giờ câu hỏi của tôi là, làm thế nào để thực sự kiểm tra xem một SQL ban hành thông qua nguồn dữ liệu này thực sự chạy với mức độ ưu tiên thấp? Nếu tôi làm SHOW FULL PROCESSLIST trong MySQL trong khi chèn đang xảy ra nó chỉ cho tôi biết những gì SQL họ đang thực hiện, không có gì về ưu tiên:

enter image description here

Nếu tôi kiểm tra các biến máy chủ low_priority_updates là "OFF", nhưng đó chỉ là biến máy chủ, nó không có gì về giá trị thread-local.

Vì vậy, một lần nữa, có cách nào thực sự để kiểm tra xem mỗi giá trị của truy vấn/luồng low_priority_updates có được tính đến không?

Trả lời

1

Bằng cách phát hành lệnh SET LOW_PRIORITY_UPDATES = 1, bạn đang ảnh hưởng đến giá trị biến cho phiên. Do đó có thể thấy điều này bằng cách kiểm tra giá trị của biến trong phiên.

Tôi biết trong hai cách để làm điều đó:

1- HIỂN THỊ PHIÊN VARIABLES LIKE 'low_priority_dapdates'

này cho thấy ON/OFF

2- chọn @@ session.low_priority_updates

số này cho 0/1

Quan trọng: các câu lệnh/cuộc gọi trên sẽ hiển thị y ou giá trị của các biến trong phiên mà chúng chạy. Vì vậy, bạn sẽ cần phải chạy chúng bằng cách sử dụng các kết nối để xem các giá trị. Tôi không biết một cách trong MySQL, nơi bạn có thể chọn giá trị cho các biến thuộc về một phiên khác.

Nếu bạn muốn xem chúng dưới dạng danh sách, bạn có thể cần thực hiện công việc xung quanh bằng cách tạo bảng và tự mình đăng nhập thông tin đó. ví dụ:

CREATE TABLE `mydb`.`my_low_priority_updates` (
    `connection_id` INT , 
    `low_priority_updates_value` INT NOT NULL 
) 
ENGINE = MyISAM; 

sau đó bạn cần một tuyên bố rằng chèn id kết nối và các giá trị vào bảng:

insert into my_low_priority_updates(connection_id,low_priority_updates_value) 
select connection_id(),@@session.low_priority_updates 
from dual 
where not exists (select 1 from my_low_priority_updates where connection_id=connection_id()) 

bạn có thể đặt tuyên bố này trong một thủ tục và chắc chắn gọi của nó, hoặc thêm nó trong một kích hoạt trên một bảng mà bạn biết được cập nhật/chèn vào.

sau đó, truy vấn bảng my_low_priority_updates sau sẽ hiển thị cho bạn các giá trị của biến trong mỗi kết nối.

+0

Đúng, nó hoạt động rất tốt. Tôi có thể sử dụng JDBC để kiểm tra xem kết nối có low_priority_value đúng không bằng cách phát hành 'select connection_id(), @@ session.low_priority_updates từ kép'. Và thực sự nó hoạt động ok, giá trị phiên của biến thay đổi theo cách tôi khởi tạo nó tại init kết nối. Cảm ơn! –

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