在 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的主要内容,如果未能解决你的问题,请参考以下文章
为啥我的 public void Constructor 不能编译?