获取连接的mysql数据库名称(JDBC)

Pau*_*llo 9 java mysql jdbc

如何从连接对象获取数据库名称的名称

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

如何从con获取该数据库名称

Gor*_*son 16

从JDBC Connection对象本身获取数据库名称的最简单方法可能是通过以下getCatalog()方法:

连接#getCatalog()

但是,正如Konstantin在下面的评论中指出的那样,如果通过发出USE dbname声明来更改当前的MySQL数据库,那么该值将不会改变.

getCatalog() 可能仍然在一个应用程序中有用

  • 不会更改数据库,或
  • 通过使用setCatalog()更改当前数据库做"JDBC方式" ,

但是对于MySQL来说,SELECT DATABASE()整体使用似乎更安全.

另请注意,getCatalog()实际当前数据库之间的这种潜在差异取决于特定JDBC驱动程序的行为.出于好奇,我尝试了类似于Microsoft JDBC Driver 4.0 for SQL Server的东西,.getCatalog()并确实在运行USE dbname语句后立即意识到对当前数据库的更改.也就是代码

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);
}
Run Code Online (Sandbox Code Playgroud)

产生了以下结果:

getCatalog() returns: myDb
           Executing: USE master
getCatalog() returns: master
Run Code Online (Sandbox Code Playgroud)

  • 这有时可能很危险http://bugs.mysql.com/bug.php?id=1599 (2认同)
  • @ KonstantinV.Salikhov这就是JDBC api doc明确表示如果存在JDBC等价物(`setCatalog`)则不使用数据库命令(如`USE`)的原因之一. (2认同)