2014-04-11 22 views
9

我试图通过一个简单的java应用程序连接到Mariadb中的数据库,但连接被告知不成功并引发异常。我使用mysql完成了类似的连接,并且它工作正常。问题可能是这里的司机。从NetBeans on Linux(Mageia)上的Java应用程序连接到MariaDB

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的客户端库的Java应用程序提供的驱动程序类就不是com.mysql.jdbc.Driver但org.mariadb.jdbc.Driver!我相应地改变了它,但似乎问题出在try块的第一行。该驱动程序根本没有加载。 另外,我在下面的屏幕截图中添加了mysql jar文件到我的java应用程序的库中。请帮助我解决这个问题。 enter image description here

回答

14

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

MySQL和MariaDB驱动程序应该有些可以互换,但在访问MariaDB服务器时使用MariaDB连接器似乎是谨慎的。对于什么是值得的mariadb-java-client-1.1.7.jar

projectProperties.png

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

为我工作的结合。我下载了MariaDB的客户端库的Java从这里:

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为好。)

+0

做了更改,然后只有在重新启动后,事情奏效。只是在/etc/my.cnf文件中注释掉skip-networking指令,并将该库添加到项目属性中。 –

+0

但是,使用Java Web应用程序时问题仍然存在。在那里显示驾驶员失踪。 –

+0

@NitishPareek快速搜索显示了几个答案,如[这一个](http://stackoverflow.com/a/2862260/2144390)。这有帮助吗? –

10

附加的注释: 探索MariaDB的JDBC驱动程序,我发现这个网址解析文件中:

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); 
    .... 
+0

伟大的提示!谢谢。 – Marco

+0

对于连接字符串,mysql和mariadb都是有效的,在MariaDB驱动程序文档中也声明为'jdbc:(mysql | mariadb):[replication:| failover:| sequential:| aurora:] // [, ...]/[数据库] [? = [& = ]'另请参阅https://mariadb.com/kb/en/mariadb/about-mariadb-connector-j/#connection-strings – kap

相关问题