2014-10-18 16 views
7

Làm thế nào có thể lấy tên của tên cơ sở dữ liệu từ đối tượng kết nốiLấy tên cơ sở dữ liệu kết nối mysql (JDBC)

try { 
    this.ds = (DataSource) new InitialContext().lookup("java:comp/env/jdbc/amger"); 
} catch (NamingException ne) { 
} 
Connection conObj = ds.getConnection(); 

Làm thế nào để nhận được rằng tên cơ sở dữ liệu từ con

+0

thể trùng lặp của http://stackoverflow.com/questions/5718952/how-to-get-database-url-from- java-sql-connection – SMA

+0

@almasshaikh "Làm cách nào để lấy url cơ sở dữ liệu từ java.sql.Connection?" không bao giờ có thể giống như tên cơ sở dữ liệu – Paullo

+0

ý tưởng là từ url bạn có thể nhận được tên cơ sở dữ liệu? – SMA

Trả lời

11

Có lẽ cách đơn giản nhất để có được những tên cơ sở dữ liệu từ các JDBC đối tượng kết nối chính nó là thông qua getCatalog() phương pháp:

Connection#getCatalog()

Tuy nhiên, như đã chỉ ra trong Konstantin bel bình luận của mình ow, giá trị đó sẽ không thay đổi nếu cơ sở dữ liệu MySQL hiện tại được thay đổi bằng cách phát hành câu lệnh USE dbname.

getCatalog() vẫn có thể có ích trong một ứng dụng mà

  • không thay đổi cơ sở dữ liệu, hoặc
  • không điều "Các JDBC Way" bằng cách sử dụng setCatalog() để thay đổi cơ sở dữ liệu hiện tại,

nhưng đối với MySQL, việc sử dụng SELECT DATABASE() có vẻ an toàn hơn.

Cũng lưu ý rằng chênh lệch tiềm năng giữa getCatalog() và cơ sở dữ liệu hiện tại thực tế phụ thuộc vào hành vi của trình điều khiển JDBC cụ thể. Trong tò mò tôi đã thử một cái gì đó tương tự với Microsoft JDBC Driver 4.0 cho SQL Server và .getCatalog() đã thực sự nhận thức được sự thay đổi cơ sở dữ liệu hiện tại ngay lập tức sau khi chạy một tuyên bố USE dbname. Đó là, mã

String connectionUrl = "jdbc:sqlserver://localhost:52865;" 
     + "databaseName=myDb;" + "integratedSecurity=true"; 
try (Connection con = DriverManager.getConnection(connectionUrl)) { 
    System.out.println(String.format(
      "getCatalog() returns: %s", 
      con.getCatalog())); 
    try (Statement s = con.createStatement()) { 
     System.out.println("   Executing: USE master"); 
     s.execute("USE master"); 
    } 
    System.out.println(String.format(
      "getCatalog() returns: %s", 
      con.getCatalog())); 
} catch (Exception e) { 
    e.printStackTrace(System.out); 
} 

sản xuất kết quả như sau:

getCatalog() returns: myDb 
      Executing: USE master 
getCatalog() returns: master 
+2

Điều đó có thể gây nguy hiểm đôi khi http://bugs.mysql.com/bug.php?id=1599 –

+1

@Gord Thompson, tôi đồng ý với bạn. Tín dụng cho Konstantin V. Salikhov cho điểm nổi bật của mình. Tôi cảm thấy thoải mái hơn với cách tiếp cận Konstantin V. Salikhov (SELECT DATABASE()) đặc biệt là cho giải pháp cụ thể của MySQL. Nhưng khi bạn nói đúng "làm mọi thứ" Cách JDBC ""; Connection # getCatalog() sẽ được chấp nhận nhiều hơn cho tính di động là một trong những điểm mạnh của Java. – Paullo

+2

@ KonstantinV.Salikhov Đó là một trong những lý do khiến JDBC api doc nói rõ ràng không sử dụng các lệnh cơ sở dữ liệu (như 'USE') nếu có một tương đương JDBC (' setCatalog'). –

2

Nếu bạn biết rằng DB là Mysql bạn chỉ có thể thực hiện SELECT DATABASE() trên kết nối của bạn và đọc resulset với tên cơ sở dữ liệu hiện tại trong đó.

Đây là description chức năng DATABASE.

+0

bạn đã đề cập "Nếu bạn biết DB là Mysql". Điều gì khiến bạn nói vậy? – Paullo

+1

Tôi đánh giá cao đầu vào và con trỏ của bạn đến vấn đề được assoiciated với cách tiếp cận @Gord Thompson. Giải pháp của bạn là tốt nhất cho tốt nhất khi nói đến mysql. Tôi chỉ chấp nhận Gord Thompson vì lý do di chuyển, mặc dù tôi biết về tác dụng phụ có thể có của nó. Cảm ơn rất nhiều anh trai – Paullo

+1

Bạn đang chào đón. Tôi đã đề cập đến 'Nếu bạn biết rằng DB là Mysql' bởi vì chỉ bất kỳ RDBMS nào có thể được kết nối với nguồn dữ liệu JDBC, nhưng câu hỏi cụ thể của bạn đã gắn thẻ mysql trong đó và DATABASE() là hàm mysql cụ thể. Tôi đã nghĩ giải pháp này có thể hữu ích. –

1

Giả sử bạn sử dụng url là "jdbc: mysql: // localhost/test"

Sau đó làm như sau:

DatabaseMetaData dmd = connection.getMetaData(); 
String url = dmd.getURL(); 
System.out.println(url.substring(url.lastIndexOf("/") + 1)); 
+1

Điều đó sẽ không hoạt động nếu cơ sở dữ liệu đã được thay đổi bằng cách sử dụng lệnh 'use' hoặc thông qua' setCatalog() 'JDBC API –

+0

Đồng ý nhưng tôi không nghĩ vậy nên OP đã đề cập đến như vậy. – SMA

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