2012-06-11 16 views
9

Tôi đang thiết lập một cụm chuyển đổi dự phòng trên MySQL, trong kiến ​​trúc master/slave. Tôi cũng đang cấu hình JBoss Datasource của mình, và tôi đang tìm cách tốt hơn để kiểm tra kết nối của tôi, biết rằng nó là dành cho Alfresco (đang sử dụng Ibatis).Kiểm tra tính hợp lệ của kết nối MySQL trong nguồn dữ liệu: CHỌN 1 hoặc cái gì đó tốt hơn?

Thậm chí tôi praticed MySQL nhiều lần, tôi không biết rất rõ internals cơ chế thực hiện trong MySQL Server.

Cho đến nay, tôi đang sử dụng truy vấn này để kiểm tra kết nối SQL của tôi (như trong chủ đề này: Database Fail Over in Jboss Data sources)

SELECT 1; 

Ở đây đầy đủ các nguồn dữ liệu.

<?xml version="1.0" encoding="UTF-8"?> 
<datasources> 
<local-tx-datasource> 
    <jndi-name>alfresco-datasource</jndi-name> 
    <connection-url> 
     jdbc:mysql://10.1.2.13,10.1.2.14:3306/alfresco 
    </connection-url> 
    <driver-class>com.mysql.jdbc.Driver</driver-class> 
    <user-name>alfresco</user-name> 
    <password>alfresco</password> 
    <exception-sorter-class-name> 
     org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter 
    </exception-sorter-class-name> 


    <connection-property name="readOnly">false</connection-property> 
    <failOverReadOnly>false</failOverReadOnly> 

    <!-- Automatic reconnecion - desactivated to preserve transactions --> 
    <!-- http://dev.mysql.com/doc/refman/5.0/en/connector-j-reference-configuration-properties.html : 
    Failover happens when the driver determines that the connection has failed (checked before every query), and falls back to the first host when it determines that the host has become available again (after queriesBeforeRetryMaster queries have been issued). --> 
    <!--<autoReconnect>true</autoReconnect>--> 

    <check-valid-connection-sql>SELECT 1</check-valid-connection-sql> 
    <valid-connection-checker-class-name> 
     org.jboss.resource.adapter.jdbc.vendor.MySQLValidConnectionChecker 
    </valid-connection-checker-class-name> 


    <!-- If you're using Connector/J 3.1.8 or newer, you can use our implementation 
     of these to increase the robustness "mysql-ds.xml" 64L, 3683C of the connection 
     pool. --> 
    <exception-sorter-class-name> 
     com.mysql.jdbc.integration.jboss.ExtendedMysqlExceptionSorter 
    </exception-sorter-class-name> 
    <valid-connection-checker-class-name> 
     com.mysql.jdbc.integration.jboss.MysqlValidConnectionChecker 
    </valid-connection-checker-class-name> 

    <metadata> 
     <type-mapping>mySQL</type-mapping> 
    </metadata> 
</local-tx-datasource> 

</datasources> 

Tôi có nhiều câu hỏi mà tôi không thể trả lời bằng bản thân mình:

  • Sẽ không truy vấn đơn giản này được lưu trữ bởi iBATIS (hoặc bất cứ loại nào hoặc ORM)? Điều này có nghĩa là nó có thể trả lại cho tôi kết quả sai.
  • Truy vấn đó có quá đơn giản không? Có thực sự cố gắng thực hiện các cơ chế nội bộ có thể đại diện cho sức khỏe máy chủ không? Hay nó sẽ chỉ kiểm tra kết nối?
  • Đây có thực sự là một thử nghiệm đáng tin cậy không?
  • Có loại thử nghiệm nào khác (đã được tích hợp với Trình kết nối/J chẳng hạn) không?
  • Hiệu suất cũng rất quan trọng đối với tôi, như vậy là CHỌN 1 là một sự thỏa hiệp tốt giữa kiểm tra sức khỏe và hiệu suất

Đừng ngần ngại để chỉ cho tôi một số liên kết (bên Stackoverflow hay không). Nếu câu hỏi này có đậu đã được trả lời (có vẻ như không, theo như tôi tìm kiếm), tôi rõ ràng sẽ xóa chủ đề này.

tôi sẽ nhiều đánh giá cao lợi nhuận của exeperience của developpers mysql hoặc quản trị viên. Tôi đang tìm cách tốt nhất để làm điều đó.

Cảm ơn sự giúp đỡ của bạn.

Trả lời

15

Trích dẫn liên kết này: Ping MySQL Server Using JDBC

bạn phải:

Các MySQL JDBC driver (Connector/J) cung cấp một cơ chế ping.

Nếu bạn làm một truy vấn SQL prepended với/* ping */như:

"/ * ping */SELECT 1" Điều này thực sự sẽ làm cho tài xế gửi một ping đến máy chủ và trả về một giả , trọng lượng nhẹ, bộ kết quả.

(Bạn có thể thấy điều này bị chôn vùi khá sâu trong tài liệu Trình kết nối/J ; tìm kiếm "ping" trên trang đó.Đọc kỹ: cơ chế này rất nhạy cảm với cú pháp được sử dụng. Không giống như hầu hết các câu lệnh SQL, việc phân tích cú pháp "ping" của xảy ra trong trình điều khiển JDBC phía máy khách chính nó.).

+1

Tuyệt vời! Đó chính là loại mẹo tôi đang tìm kiếm! –

+0

bạn là người đàn ông chào đón, tôi hy vọng nó sẽ phù hợp với cấu hình jdbc của bạn. – Sebas

+0

Tôi sẽ thử ASAP. Il rơi này sẽ là câu trả lời;). Cảm ơn rất nhiều. –

2

Truy vấn chúng tôi sử dụng tại nơi làm việc để kiểm tra kết nối với máy chủ MySQL là SHOW databases;, thật đơn giản và đơn giản vì không cần bạn phải chọn một cơ sở dữ liệu cụ thể. Tôi muốn nói nó khá đáng tin cậy và một truy vấn như thế là khá hiệu quả.

+0

Thật vậy, giống như trong Oracle, khi bạn sử dụng các lệnh như SELECT 1 FROM DUAL +1 để trả lời. Điều đó có vẻ đáng tin cậy và hiệu quả, nhưng tôi sẽ điều tra thêm về thủ thuật ping. –

+2

Tôi thực sự không chắc chắn tại sao bất kỳ truy vấn chọn nào sẽ được lưu trong bộ nhớ cache bằng ORM. Nếu bạn sợ điều đó, bạn chỉ nên sử dụng 'SELECT SQL_NO_CACHE 1;'. Tôi không nghĩ rằng 'SHOW DATABASES;' tốt hơn 'select 1;'. – Sebas

+0

@Sebas Điểm công bằng. Tôi đã xóa thông tin không rõ ràng. – deadly

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