【问题标题】:JDBC: Connection returning NULL, what to do?JDBC:连接返回NULL,怎么办?
【发布时间】:2014-06-11 18:19:18
【问题描述】:

这是下面给出的程序的输出:

Connection made!
Schema Name:null

Successfully connected to null
Releasing all open resources ...

在establishConnection() 中,conn 被初始化为null。那么 try 块中的第一条语句应该与数据库建立连接,然后第三条语句打印 conn 的当前模式的名称。

根据APIgetSchema() 返回当前模式名称,如果没有则返回 null。

这意味着没有与conn关联的架构(我认为架构名称与数据库名称相同)?谁能建议我的预期是否正确,并建议为什么没有与 conn 关联的架构或 null?

public class ConnectDB {

    private Connection establishConnection() throws SQLException {
        Connection conn = null;
        try {
            conn = DriverManager.getConnection(
                    "jdbc:mysql://localhost:3306/test_final1", "root", "password");
            System.out.println("Connection made!");
            System.out.println("Schema Name:"+conn.getSchema()+"\n");
        } catch (SQLException sqle) {
            System.err.println("SQL Exception thrown while making connection");
            printSQLException(sqle);
        }
        return conn;
    }

    public static void main(String[] args) {
        ConnectDB cdb= new ConnectDB();
        Connection myconn=null;
        try{
            myconn=cdb.establishConnection();
            if(myconn!=null) System.out.println("Successfully connected to " + myconn.getSchema());
        }catch (SQLException e) {
              ConnectDB.printSQLException(e);
        } catch (Exception e) {
          e.printStackTrace(System.err);
        } finally {
          ConnectDB.closeConnection(myconn);
        }

    }

【问题讨论】:

  • 这个问题不是重复的。另一个问题是关于 Android 的,非常关于 JTDs 驱动程序(我没有使用过)。我发布这条评论是为了澄清,因为我收到一条评论说它是重复的,在我解释后被删除了。
  • 你加载MYSQL Driver的代码在哪里
  • 人!问题不在于获得null 连接,而在于从执行Connection#getSchema 方法获得null 返回值。

标签: java mysql jdbc null database-connection


【解决方案1】:

MySQL 不支持 schema 的概念。对于 MySQL,模式实际上就是数据库。来自MySQL Glossary

架构

从概念上讲,模式是一组相互关联的数据库对象,例如表、表列、列的数据类型、索引、外键等。 (...)

基于this answer from MySQL forums,您无法通过Connection#getSchema 方法(自Java 7 和JDBC 4 起添加)获取当前数据库(或多个数据库),但使用Connection#getCatalog 除非您使用最新的JDBC jar 驱动程序

JDBC 驱动程序(由于遗留问题,mysql 直到 5.0 才称它们为“模式”,而 JDBC 在 JDBC4 之前没有选择模式的方法),调用数据库“目录”,因此您必须调用getCatalogs() 获取数据库列表

为了证明上面的斜体语句,我做了一个肮脏的快速证明(除非你使用最新的 JDBC jar 驱动程序)。使用 getCatalog() 使用 Java 6:

public class DirtyQuickTest {
    private static final String url = "jdbc:mysql://localhost:7841/test";
    private static final String user = "lmendozaj";
    private static final String password = "s3cr3t"; //I won't show you my password
    public static void main(String[] args) throws Exception {
        Connection con = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            con = DriverManager.getConnection(url, user, password);
            //commented since doesn't exists in Java 6
            //System.out.println(con.getSchema());
            System.out.println(con.getCatalog());
        } finally {
            con.close();
        }
    }
}

输出:

test

然后我在 Java 8 中执行了相同的代码,并使用 mysql-connector-java-5.1.31-bin.jar(当前最新的 MySQL 的 Java 连接器驱动程序)取消了包含 getSchema 的语句的注释。这是输出:

null
test

这意味着他们仍然不支持getSchema 方法。

相关:

【讨论】:

    猜你喜欢
    • 2012-02-21
    • 1970-01-01
    • 1970-01-01
    • 2019-01-10
    • 1970-01-01
    • 2023-03-26
    • 2019-06-20
    • 2019-05-10
    • 1970-01-01
    相关资源
    最近更新 更多