在 Linux (Mageia) 上的 NetBeans 中从 Java 应用程序连接到 MariaDB

Posted

技术标签:

【中文标题】在 Linux (Mageia) 上的 NetBeans 中从 Java 应用程序连接到 MariaDB【英文标题】:Connect to MariaDB from Java application in NetBeans on Linux (Mageia) 【发布时间】: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 应用程序的库中,如下面的屏幕截图所示。请帮我解决这个问题。

【问题讨论】:

【参考方案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/

补充说明:

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

    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/…

以上是关于在 Linux (Mageia) 上的 NetBeans 中从 Java 应用程序连接到 MariaDB的主要内容,如果未能解决你的问题,请参考以下文章

在 Grails 中为 ShiroUser 指定包

从 CLI 部署 Maven 项目?

用户和组管理类命令的使用方法及描述

为啥我的 public void Constructor 不能编译?

JavaFXPorts MySqlDB-Driver 包含在项目中:dex 错误

比较 c#、c++ 和 java 的性能(c# 的奇怪行为)