Tải xuống cộng đồng MySQL
Đầu nối/j
- Tính khả dụng chung [GA] phát hành
- Lưu trữ
Đầu nối/j 8.0.31
Chọn hệ điều hành:
Tải xuống Windows được đề xuất:
Trình kết nối MySQL/J là trình điều khiển JDBC chính thức cho MySQL. Trình kết nối MySQL/J 8.0 tương thích với tất cả các phiên bản MySQL bắt đầu bằng MySQL 5.6. Ngoài ra, Trình kết nối MySQL/J 8.0 hỗ trợ X Devapi mới để phát triển với MySQL Server 8.0.
Tài liệu trực tuyến:
- Trình kết nối MySQL/Hướng dẫn cài đặt J
- Tài liệu
- Trình kết nối MySQL/j x tham chiếu devapi [yêu cầu đầu nối/j 8.0]
- thay đổi lịch sử
Trình kết nối MySQL/J 8.0 rất được khuyến khích sử dụng với MySQL Server 8.0, 5.7 và 5.6. Vui lòng nâng cấp lên đầu nối MySQL/J 8.0.
Vui lòng báo cáo bất kỳ lỗi hoặc sự không nhất quán nào bạn quan sát thấy cơ sở dữ liệu lỗi của chúng tôi. Cảm ơn bạn đã hỗ trợ của bạn!
Thank you for your support!
trừu tượng
Hướng dẫn này mô tả cách cài đặt, định cấu hình và phát triển các ứng dụng cơ sở dữ liệu bằng Trình kết nối MySQL/J 8.0, trình điều khiển JDBC và X Devapi để liên lạc với các máy chủ MySQL.
Trình kết nối MySQL/J 8.0 rất được khuyến khích sử dụng với MySQL Server 8.0 và 5.7. Vui lòng nâng cấp lên đầu nối MySQL/J 8.0.
Để biết ghi chú chi tiết các thay đổi trong mỗi bản phát hành của Trình kết nối/J 8.0, hãy xem Ghi chú phát hành MYSQL Connect/J 8.0.
Để biết thông tin pháp lý, bao gồm thông tin cấp phép, hãy xem lời nói đầu và thông báo pháp lý.
Để được giúp đỡ trong việc sử dụng MySQL, vui lòng truy cập diễn đàn MySQL, nơi bạn có thể thảo luận về các vấn đề của mình với người dùng MySQL khác.
Tài liệu được tạo vào ngày: 2022-11-14 [Sửa đổi: 74517]
Trình kết nối MySQL/J, như một triển khai nghiêm ngặt của API JDBC, vượt qua tất cả các thử nghiệm trong phiên bản có sẵn công khai của bộ kiểm tra tuân thủ JDBC của Oracle. Thông số kỹ thuật của JDBC linh hoạt về cách thực hiện chức năng nhất định. Phần này cung cấp chi tiết về cấp độ giao diện theo các quyết định thực hiện có thể ảnh hưởng đến cách bạn mã hóa các ứng dụng với Trình kết nối MYSQL/J.
BÃI
Bạn có thể mô phỏng các đốm màu với các trình định vị bằng cách thêm thuộc tính
emulateLocators=true
vào URL JDBC của bạn. Sử dụng phương pháp này, trình điều khiển sẽ trì hoãn tải dữ liệu BLOB thực tế cho đến khi bạn truy xuất dữ liệu khác và sau đó sử dụng các phương thức truy xuất [getInputStream[]
,getBytes[]
, v.v.] trên luồng dữ liệu Blob.Bạn phải sử dụng bí danh cột với giá trị của cột với tên thực tế của Blob, ví dụ:
SELECT id, 'data' as blob_data from blobtable
Bạn cũng phải tuân theo các quy tắc sau:
SELECT
phải tham khảo chỉ một bảng. Bảng phải có một khóa chính.SELECT
phải bí danh tên cột Blob ban đầu, được chỉ định là một chuỗi, thành một tên thay thế.SELECT
phải bao gồm tất cả các cột tạo nên khóa chính.
Việc triển khai Blob không cho phép sửa đổi tại chỗ [chúng là các bản sao, theo báo cáo của phương pháp
DatabaseMetaData.locatorsUpdateCopies[]
]. Do đó, hãy sử dụng các phương thức
0 hoặcstmt = conn.createStatement[java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_READ_ONLY]; stmt.setFetchSize[Integer.MIN_VALUE];
1 [trong trường hợp các bộ kết quả có thể cập nhật] để lưu các thay đổi trở lại cơ sở dữ liệu.stmt = conn.createStatement[java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_READ_ONLY]; stmt.setFetchSize[Integer.MIN_VALUE];
Sự liên quan
Phương thức
2 không ping máy chủ để xác định xem nó có khả dụng không. Theo thông số kỹ thuật của JDBC, nó chỉ trả về true nếustmt = conn.createStatement[java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_READ_ONLY]; stmt.setFetchSize[Integer.MIN_VALUE];
3 đã được gọi trên kết nối. Nếu bạn cần xác định xem kết nối có còn hợp lệ hay không, hãy đưa ra một truy vấn đơn giản, chẳng hạn nhưstmt = conn.createStatement[java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_READ_ONLY]; stmt.setFetchSize[Integer.MIN_VALUE];
4. Trình điều khiển sẽ ném một ngoại lệ nếu kết nối không còn hợp lệ.stmt = conn.createStatement[java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_READ_ONLY]; stmt.setFetchSize[Integer.MIN_VALUE];
Databasemetadata
Thông tin chính của nước ngoài [________ 15/________ 16 và
7] chỉ có sẵn từ các bảngstmt = conn.createStatement[java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_READ_ONLY]; stmt.setFetchSize[Integer.MIN_VALUE];
8. Trình điều khiển sử dụngstmt = conn.createStatement[java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_READ_ONLY]; stmt.setFetchSize[Integer.MIN_VALUE];
9 để truy xuất thông tin này, vì vậy nếu bất kỳ công cụ lưu trữ nào khác thêm hỗ trợ cho các khóa nước ngoài, người lái cũng sẽ hỗ trợ họ một cách minh bạch.stmt = conn.createStatement[java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_READ_ONLY]; stmt.setFetchSize[Integer.MIN_VALUE];
Đã chuẩn bị
Hai biến thể của các câu lệnh đã chuẩn bị được thực hiện bởi Trình kết nối/J, các câu lệnh được chuẩn bị phía máy khách và phía máy chủ. Các câu lệnh được chuẩn bị phía máy khách được sử dụng theo mặc định vì các phiên bản MySQL sớm không hỗ trợ tính năng câu lệnh đã chuẩn bị hoặc có vấn đề với việc thực hiện nó. Các câu lệnh được chuẩn bị phía máy chủ và bộ kết quả được mã hóa nhị phân được sử dụng khi máy chủ hỗ trợ chúng. Để cho phép sử dụng các câu lệnh được chuẩn bị phía máy chủ, hãy đặt
0.conn = DriverManager.getConnection["jdbc:mysql://localhost/?useCursorFetch=true", "user", "s3cr3t"]; stmt = conn.createStatement[]; stmt.setFetchSize[100]; rs = stmt.executeQuery["SELECT * FROM your_table_here"];
Hãy cẩn thận khi sử dụng câu lệnh được chuẩn bị phía máy chủ với các tham số lớn được đặt bằng cách sử dụng
1,conn = DriverManager.getConnection["jdbc:mysql://localhost/?useCursorFetch=true", "user", "s3cr3t"]; stmt = conn.createStatement[]; stmt.setFetchSize[100]; rs = stmt.executeQuery["SELECT * FROM your_table_here"];
2, ________ 23, ________ 24,conn = DriverManager.getConnection["jdbc:mysql://localhost/?useCursorFetch=true", "user", "s3cr3t"]; stmt = conn.createStatement[]; stmt.setFetchSize[100]; rs = stmt.executeQuery["SELECT * FROM your_table_here"];
5,conn = DriverManager.getConnection["jdbc:mysql://localhost/?useCursorFetch=true", "user", "s3cr3t"]; stmt = conn.createStatement[]; stmt.setFetchSize[100]; rs = stmt.executeQuery["SELECT * FROM your_table_here"];
6,conn = DriverManager.getConnection["jdbc:mysql://localhost/?useCursorFetch=true", "user", "s3cr3t"]; stmt = conn.createStatement[]; stmt.setFetchSize[100]; rs = stmt.executeQuery["SELECT * FROM your_table_here"];
7 hoặcconn = DriverManager.getConnection["jdbc:mysql://localhost/?useCursorFetch=true", "user", "s3cr3t"]; stmt = conn.createStatement[]; stmt.setFetchSize[100]; rs = stmt.executeQuery["SELECT * FROM your_table_here"];
8. Để thực hiện lại câu lệnh với bất kỳ tham số lớn nào được thay đổi thành tham số không quy định, hãy gọiconn = DriverManager.getConnection["jdbc:mysql://localhost/?useCursorFetch=true", "user", "s3cr3t"]; stmt = conn.createStatement[]; stmt.setFetchSize[100]; rs = stmt.executeQuery["SELECT * FROM your_table_here"];
9 và đặt lại tất cả các tham số. Lý do cho điều này là như sau:large parameters that are set usingconn = DriverManager.getConnection["jdbc:mysql://localhost/?useCursorFetch=true", "user", "s3cr3t"]; stmt = conn.createStatement[]; stmt.setFetchSize[100]; rs = stmt.executeQuery["SELECT * FROM your_table_here"];
1,conn = DriverManager.getConnection["jdbc:mysql://localhost/?useCursorFetch=true", "user", "s3cr3t"]; stmt = conn.createStatement[]; stmt.setFetchSize[100]; rs = stmt.executeQuery["SELECT * FROM your_table_here"];
2,conn = DriverManager.getConnection["jdbc:mysql://localhost/?useCursorFetch=true", "user", "s3cr3t"]; stmt = conn.createStatement[]; stmt.setFetchSize[100]; rs = stmt.executeQuery["SELECT * FROM your_table_here"];
3,conn = DriverManager.getConnection["jdbc:mysql://localhost/?useCursorFetch=true", "user", "s3cr3t"]; stmt = conn.createStatement[]; stmt.setFetchSize[100]; rs = stmt.executeQuery["SELECT * FROM your_table_here"];
4,conn = DriverManager.getConnection["jdbc:mysql://localhost/?useCursorFetch=true", "user", "s3cr3t"]; stmt = conn.createStatement[]; stmt.setFetchSize[100]; rs = stmt.executeQuery["SELECT * FROM your_table_here"];
5,conn = DriverManager.getConnection["jdbc:mysql://localhost/?useCursorFetch=true", "user", "s3cr3t"]; stmt = conn.createStatement[]; stmt.setFetchSize[100]; rs = stmt.executeQuery["SELECT * FROM your_table_here"];
6,conn = DriverManager.getConnection["jdbc:mysql://localhost/?useCursorFetch=true", "user", "s3cr3t"]; stmt = conn.createStatement[]; stmt.setFetchSize[100]; rs = stmt.executeQuery["SELECT * FROM your_table_here"];
7, orconn = DriverManager.getConnection["jdbc:mysql://localhost/?useCursorFetch=true", "user", "s3cr3t"]; stmt = conn.createStatement[]; stmt.setFetchSize[100]; rs = stmt.executeQuery["SELECT * FROM your_table_here"];
8. To re-execute the statement with any large parameter changed to a nonlarge parameter, callconn = DriverManager.getConnection["jdbc:mysql://localhost/?useCursorFetch=true", "user", "s3cr3t"]; stmt = conn.createStatement[]; stmt.setFetchSize[100]; rs = stmt.executeQuery["SELECT * FROM your_table_here"];
9 and set all parameters again. The reason for this is as follows:conn = DriverManager.getConnection["jdbc:mysql://localhost/?useCursorFetch=true", "user", "s3cr3t"]; stmt = conn.createStatement[]; stmt.setFetchSize[100]; rs = stmt.executeQuery["SELECT * FROM your_table_here"];
Trong cả hai câu lệnh được chuẩn bị phía máy chủ và mô phỏng phía máy khách, dữ liệu lớn chỉ được trao đổi khi
emulateLocators=true
0 được gọi.
Khi đã được thực hiện, luồng được sử dụng để đọc dữ liệu ở phía máy khách được đóng [theo thông số kỹ thuật JDBC] và không thể đọc lại từ đó.
Nếu một tham số thay đổi từ lớn sang không phải, trình điều khiển phải đặt lại trạng thái phía máy chủ của câu lệnh đã chuẩn bị để cho phép tham số đang được thay đổi để thay thế giá trị lớn trước đó. Điều này loại bỏ tất cả các dữ liệu lớn đã được gửi đến máy chủ, do đó yêu cầu dữ liệu phải được trình bày lại, sử dụng
1,conn = DriverManager.getConnection["jdbc:mysql://localhost/?useCursorFetch=true", "user", "s3cr3t"]; stmt = conn.createStatement[]; stmt.setFetchSize[100]; rs = stmt.executeQuery["SELECT * FROM your_table_here"];
2, ________ 23, ________ 34,conn = DriverManager.getConnection["jdbc:mysql://localhost/?useCursorFetch=true", "user", "s3cr3t"]; stmt = conn.createStatement[]; stmt.setFetchSize[100]; rs = stmt.executeQuery["SELECT * FROM your_table_here"];
5,conn = DriverManager.getConnection["jdbc:mysql://localhost/?useCursorFetch=true", "user", "s3cr3t"]; stmt = conn.createStatement[]; stmt.setFetchSize[100]; rs = stmt.executeQuery["SELECT * FROM your_table_here"];
6,conn = DriverManager.getConnection["jdbc:mysql://localhost/?useCursorFetch=true", "user", "s3cr3t"]; stmt = conn.createStatement[]; stmt.setFetchSize[100]; rs = stmt.executeQuery["SELECT * FROM your_table_here"];
7 hoặcconn = DriverManager.getConnection["jdbc:mysql://localhost/?useCursorFetch=true", "user", "s3cr3t"]; stmt = conn.createStatement[]; stmt.setFetchSize[100]; rs = stmt.executeQuery["SELECT * FROM your_table_here"];
8.conn = DriverManager.getConnection["jdbc:mysql://localhost/?useCursorFetch=true", "user", "s3cr3t"]; stmt = conn.createStatement[]; stmt.setFetchSize[100]; rs = stmt.executeQuery["SELECT * FROM your_table_here"];
Do đó, để thay đổi loại tham số thành một tham số thành một tham số, bạn phải gọi
9 và đặt tất cả các tham số của câu lệnh đã chuẩn bị một lần nữa trước khi nó có thể được thực hiện lại.conn = DriverManager.getConnection["jdbc:mysql://localhost/?useCursorFetch=true", "user", "s3cr3t"]; stmt = conn.createStatement[]; stmt.setFetchSize[100]; rs = stmt.executeQuery["SELECT * FROM your_table_here"];
Kết quả
Theo mặc định, các kết quả được truy xuất hoàn toàn và lưu trữ trong bộ nhớ. Trong hầu hết các trường hợp, đây là cách hiệu quả nhất để vận hành và do thiết kế giao thức mạng MYSQL, dễ thực hiện hơn. Nếu bạn đang làm việc với các kết quả có một số lượng lớn hàng hoặc giá trị lớn và không thể phân bổ không gian heap trong JVM của bạn cho bộ nhớ cần thiết, bạn có thể yêu cầu trình điều khiển phát trực tuyến kết quả trở lại một hàng cùng một lúc.
Để kích hoạt chức năng này, hãy tạo một thể hiện
getInputStream[]
0 theo cách sau:stmt = conn.createStatement[java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_READ_ONLY]; stmt.setFetchSize[Integer.MIN_VALUE];
Sự kết hợp của một tập kết quả chỉ đọc, chỉ đọc, với kích thước tìm nạp
getInputStream[]
1 đóng vai trò là tín hiệu cho trình điều khiển để truyền kết quả đặt hàng từng hàng. Sau đó, bất kỳ bộ kết quả nào được tạo với câu lệnh sẽ được truy xuất từng hàng.Có một số cảnh báo với phương pháp này. Bạn phải đọc tất cả các hàng trong tập kết quả [hoặc đóng nó] trước khi bạn có thể phát hành bất kỳ truy vấn nào khác trên kết nối hoặc một ngoại lệ sẽ được ném.
Các khóa này sớm nhất có thể được phát hành [cho dù chúng là khóa cấp bảng hoặc khóa cấp độ hàng trong một số công cụ lưu trữ khác như
8] là khi câu lệnh hoàn tất.stmt = conn.createStatement[java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_READ_ONLY]; stmt.setFetchSize[Integer.MIN_VALUE];
Nếu câu lệnh nằm trong phạm vi giao dịch, thì khóa được phát hành khi giao dịch hoàn thành [ngụ ý rằng câu lệnh cần hoàn thành trước]. Như với hầu hết các cơ sở dữ liệu khác, các câu lệnh không hoàn tất cho đến khi tất cả các kết quả đang chờ xử lý trên câu lệnh được đọc hoặc kết quả hoạt động được đóng cho câu lệnh được đóng.
Do đó, nếu sử dụng kết quả phát trực tuyến, hãy xử lý chúng càng nhanh càng tốt nếu bạn muốn duy trì quyền truy cập đồng thời vào các bảng được tham chiếu bởi câu lệnh tạo ra tập kết quả.
Một cách khác là sử dụng phát trực tuyến dựa trên con trỏ để truy xuất số lượng hàng đã đặt mỗi lần. Điều này có thể được thực hiện bằng cách đặt thuộc tính kết nối
getInputStream[]
4 thành TRUE, sau đó gọigetInputStream[]
5 vớigetInputStream[]
6 là số lượng hàng mong muốn được tìm nạp mỗi lần:conn = DriverManager.getConnection["jdbc:mysql://localhost/?useCursorFetch=true", "user", "s3cr3t"]; stmt = conn.createStatement[]; stmt.setFetchSize[100]; rs = stmt.executeQuery["SELECT * FROM your_table_here"];
Bản tường trình
Trình kết nối/J bao gồm hỗ trợ cho cả
getInputStream[]
7 vàgetInputStream[]
8. Cả hai đều yêu cầu một kết nối riêng để đưa ra câu lệnhgetInputStream[]
9. Trong trường hợpgetBytes[]
0, việc triển khai tạo ra một luồng bổ sung để xử lý chức năng hết thời gian.Ghi chú
Thất bại trong việc hủy tuyên bố cho
getBytes[]
0 có thể tự biểu hiện làgetBytes[]
2 thay vì không im lặng, vì hiện tại không có cách nào để bỏ chặn các chủ đề đang thực hiện truy vấn bị hủy do hết hạn thời gian chờ và thay vào đó là ném ngoại lệ.MySQL không hỗ trợ con trỏ SQL và trình điều khiển JDBC không mô phỏng chúng, vì vậy
getBytes[]
3 không có hiệu lực.Trình kết nối/J cũng cung cấp hai phương pháp bổ sung:
getBytes[]
4 đặt một ví dụgetBytes[]
5 sẽ được sử dụng để gửi dữ liệu đến máy chủ MySQL cho câu lệnhgetBytes[]
6 thay vìgetBytes[]
7 hoặcgetBytes[]
8 đại diện cho đường dẫn được đưa ra như một đối số cho câu lệnh.Luồng này sẽ được đọc để hoàn thành khi thực hiện câu lệnh
getBytes[]
6 và sẽ tự động đóng bởi trình điều khiển, vì vậy nó cần được đặt lại trước mỗi cuộc gọi đếnSELECT
0 sẽ khiến máy chủ MySQL yêu cầu dữ liệu thực hiện yêu cầu chogetBytes[]
6.Nếu giá trị này được đặt thành
SELECT
2, trình điều khiển sẽ trở lại bằng cách sử dụnggetBytes[]
7 hoặcgetBytes[]
8 theo yêu cầu.SELECT
5 Trả về ví dụgetBytes[]
5 sẽ được sử dụng để gửi dữ liệu để phản hồi câu lệnhgetBytes[]
6.Phương thức này trả về
SELECT
2 nếu không có luồng như vậy được đặt bằnggetBytes[]
4.