web-dev-qa-db-ja.com

Java Linux(Mageia)上のNetBeansのアプリケーションからMariaDBに接続する

単純な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

インターネットでヘルプを検索し、Javaアプリケーション用のMariaDBクライアントライブラリが提供するドライバークラスを使用しました。com.mysql.jdbc.Driverではなく、org.mariadb.jdbc.Driverです。それに応じて変更しましたが、tryブロック内の最初の行に問題があるようです。ドライバーがまったくロードされていません。また、以下のスクリーンショットのように、mysql jarファイルをJavaアプリケーションのライブラリに追加しました。これを助けてください。enter image description here

13
Nitish Pareek

_jdbc:mariadb://..._を使用して、MySQL JDBCドライバーを使用してMariaDBサーバーインスタンスへの接続を確立しようとしているようです。 MySQLサーバーまたはMariaDBサーバーに接続しているかどうかに関係なく、MySQL JDBCドライバーは_jdbc:mysql://..._を使用するため、おそらく動作しません。つまり、接続文字列は、(アクセスされているデータベースサーバーではなく)使用されているdriverと一致する必要があります。

MySQLとMariaDBドライバーはある程度互換性があるはずですが、MariaDBサーバーにアクセスするときにMariaDBコネクターを使用するのが賢明なようです。価値があるものについては、_mariadb-Java-client-1.1.7.jar_の組み合わせ

projectProperties.png

そして

_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のデフォルト設定には、_skip-networking_に_/etc/my.cnf_ディレクティブが含まれる場合があります。 JDBC接続は、localhostからの接続であっても、常にMySQL/MariaDBへの「ネットワーク」接続のように見えるため、JDBC経由でデータベースに接続する場合は、このディレクティブを削除(またはコメントアウト)する必要があります。 (_bind-address_値を_0.0.0.0_のようなものに調整する必要があるかもしれません。)

19
Gord Thompson

追加のメモ: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);
    ....
12
Basil Musa