2012-11-17 53 views
17

Tôi có kết nối chương trình Java với cơ sở dữ liệu MySQL, làm cách nào tôi có thể thay đổi cơ sở dữ liệu hiện tại sang một cơ sở dữ liệu khác trên cùng một kết nối?Java, cách thay đổi cơ sở dữ liệu hiện tại sang cơ sở dữ liệu khác?

tôi kết nối với MySQL như thế này:

DriverManager.getConnection("jdbc:mysql://"+server+"/",log,pass); 

Sau khi một số hoạt động Tôi muốn kết nối với một cơ sở dữ liệu mysql khác nhau trên cùng một kết nối. Làm thế nào tôi có thể làm điều đó?

Tôi cố gắng để sử dụng:

Statement stat= con.createStatement(); 
ResultSet r=stat.executeQuery("use mysql"); 

Nhưng điều đó không làm thay đổi cơ sở dữ liệu được sử dụng.

Trả lời

26

Như được mô tả trong MySQL documentation, bạn cần sử dụng Connection.setCatalog() để chuyển sang cơ sở dữ liệu khác. Nó cũng rõ ràng nói rằng bạn nên không thực hiện một USE <databasename> để chuyển đổi.

Lý do cho cảnh báo này là JDBC là giao diện chung cho cơ sở dữ liệu và cung cấp các phương thức cho các tác vụ phổ biến nhất, bao gồm chuyển đổi catalogs (hoặc databases khi chúng ở trong MySQL). Đặc tả JDBC/javadoc cũng nói rõ ràng rằng mọi người nên sử dụng API trên các lệnh cụ thể của cơ sở dữ liệu (nếu cả hai đều có sẵn). Có một số lý do cho điều này: 1) nó thúc đẩy mã độc lập với cơ sở dữ liệu, và 2) trình điều khiển có thể làm những điều bổ sung trong nội bộ để đáp ứng với một trong các phương thức API. Sử dụng các lệnh cơ sở dữ liệu cụ thể có thể khiến trình điều khiển bị lỗi vì trạng thái bên trong của nó không khớp với trạng thái cơ sở dữ liệu.

Một cuộc gọi đến setCatalog(String) sẽ không ảnh hưởng đến báo cáo hiện có, theo quy định trong tài liệu JDBC API:

Calling setCatalog không ảnh hưởng đến tạo ra trước đó hoặc chuẩn bị Statement đối tượng. Nó được thực hiện xác định liệu một DBMS chuẩn bị hoạt động diễn ra ngay lập tức khi Connection phương pháp prepareStatement hoặc prepareCall được gọi. Để có khả năng di động tối đa, nên gọi setCatalog trước khi Statement được tạo hoặc chuẩn bị.

+0

cảm ơn bạn rất nhiều :) – ognistysztorm

+0

Cũng cần nói thêm rằng báo cáo đã được tạo trước khi 'Connection.setCatalog() 'được gọi sẽ vẫn truy cập cơ sở dữ liệu trước đó. – Max

+0

@Max Bạn có biết liệu điều đó có được chỉ rõ trong đặc tả JDBC hay là một quy tắc cụ thể của việc triển khai MySQL? Tôi thường làm việc với Firebird và vì nó không có danh mục sản phẩm, tôi thường sử dụng các loại chi tiết này;) –

4

Bạn có thể đặt trước tên cơ sở dữ liệu trên tên bảng như thế này.

Ví dụ: db1 has table1db2 has table2

select * from db1.table1, db2.table2; 

này sẽ cho phép bạn để làm cơ sở dữ liệu chéo truy vấn

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