【问题标题】:Connect to MariaDB from Java application in NetBeans on Linux (Mageia)在 Linux (Mageia) 上的 NetBeans 中从 Java 应用程序连接到 MariaDB
【发布时间】:2014-05-26 02:19:39
【问题描述】:

我正在尝试通过一个简单的 java 应用程序连接到 Mariadb 中的数据库,但连接被告知不成功并引发异常。我已经使用 mysql 完成了类似的连接,并且它工作正常。问题可能出在这里的驱动程序上。

 try{
          Class.forName("org.mariadb.jdbc.Driver");  

        Connection connection = DriverManager.getConnection(  
                "jdbc:mariadb://localhost:3306/project", "root", "");  
        Statement statement = connection.createStatement(); 

        String uname="xyz",pass="abc";
       statement.executeUpdate("insert into user values('"+uname+"','"+pass+"')");}//end of try block

我在网上寻找帮助,发现 MariaDB Client Library for Java Applications 提供的驱动程序类不是 com.mysql.jdbc.Driver 而是 org.mariadb.jdbc.Driver!我相应地对其进行了更改,但似乎问题出在 try 块内的第一行。驱动程序根本没有加载。 此外,我已将 mysql jar 文件添加到我的 java 应用程序的库中,如下面的屏幕截图所示。请帮我解决这个问题。

【问题讨论】:

    标签: java mysql netbeans jdbc mariadb


    【解决方案1】:

    您似乎正在尝试使用jdbc:mariadb://... 建立与使用 MySQL JDBC 驱动程序的 MariaDB 服务器实例的连接。这可能不起作用,因为 MySQL JDBC 驱动程序将使用jdbc:mysql://...,无论它是连接到 MySQL 服务器还是 MariaDB 服务器。也就是说,连接字符串必须匹配正在使用的驱动程序(而不是正在访问的数据库服务器)。

    MySQL 和 MariaDB 驱动程序应该在某种程度上可以互换,但在访问 MariaDB 服务器时使用 MariaDB 连接器似乎是谨慎的做法。对于它的价值,mariadb-java-client-1.1.7.jar的组合

    Connection con = DriverManager.getConnection(
            "jdbc:mariadb://localhost/project", 
            "root", 
            "whatever");
    

    为我工作。我从这里下载了适用于 Java 的 MariaDB 客户端库:

    https://downloads.mariadb.org/client-java/1.1.7/

    我是通过

    https://downloads.mariadb.org/

    补充说明:

    1. Java 代码中不需要Class.forName() 语句。

    2. Mageia 下 MariaDB 的默认配置可能包括 /etc/my.cnf 中的 skip-networking 指令。如果您想通过 JDBC 连接到数据库,则需要删除(或注释掉)该指令,因为 JDBC 连接总是看起来像与 MySQL/MariaDB 的“网络”连接,即使它们是来自 localhost 的连接。 (您可能还需要将bind-address 的值调整为0.0.0.0 之类的值。)

    【讨论】:

    • 进行了更改,然后仅在重新启动后,一切正常。仅注释掉 /etc/my.cnf 文件中的 skip-networking 指令,就可以将库添加到项目属性中。
    • 但是使用 Java Web 应用程序时问题仍然存在。那里显示驱动程序丢失。
    • @NitishPareek 快速搜索发现了几个答案,例如this one。这有帮助吗?
    • 感谢您的帮助,但这不是我遇到的。在一个简单的 Java 应用程序中,您之前的解决方案可以工作,但是对于 Java Web 应用程序,在我们添加 jar 文件之后,还有一个表示一些“包”的复选框。我找不到这个的解决方案。
    • 这可能不相关,但是当尝试使用 mariadb-driver 将我的数据库添加到 Netbeans 时,我实际上不得不使用 mysql: 而不是 mariadb: (例如 jdbc:mysql://my_host:3306 /数据库)。否则我收到 jdbc url 无效的消息。关于为什么会这样的任何想法?
    【解决方案2】:

    补充说明: 探索 MariaDB JDBC 驱动,我在 url 解析文件中发现了这个:

    Project: https://github.com/MariaDB/mariadb-connector-j.git
    File: src/main/java/org/mariadb/jdbc/UrlParser.java
    
    public static UrlParser parse(final String url, Properties prop) throws SQLException {
    ....
            if (url.startsWith("jdbc:mysql:")) {
                UrlParser urlParser = new UrlParser();
                parseInternal(urlParser, url, prop);
                return urlParser;
            } else {
                if (url.startsWith("jdbc:mariadb:")) {
                    UrlParser urlParser = new UrlParser();
                    parseInternal(urlParser, "jdbc:mysql:" + url.substring(13), prop);
                    return urlParser;
                }
            }    
    

    如您所见,字符串"jdbc:mariadb:" 在内部总是替换为"jdbc:mysql:"。因此,当涉及到 MariaDB 驱动程序时,无论是 :mariadb: 还是 :mysql: 总是被解析为 "jdbc:mysql:"

    没有区别。

    if (url.startsWith("jdbc:mariadb:")) {
        ....
        parseInternal(urlParser, "jdbc:mysql:" + url.substring(13), prop);
        ....
    

    【讨论】:

    • 很棒的提示!谢谢。
    • mysql 和 mariadb 都对连接字符串有效,这在 MariaDB 驱动程序文档中也有说明为jdbc:(mysql|mariadb):[replication:|failover:|sequential:|aurora:]//<hostDescription>[,<hostDescription>...]/[database][?<key1>=<value1>[&<key2>=<value2>]] 另见mariadb.com/kb/en/mariadb/about-mariadb-connector-j/…
    猜你喜欢
    • 2019-05-19
    • 2019-04-18
    • 1970-01-01
    • 1970-01-01
    • 2019-08-20
    • 2014-01-21
    • 1970-01-01
    • 2020-04-18
    相关资源
    最近更新 更多