java.sql.SQLException: No Suitable Driver Foundの解決方法

beginner Java2026-04-26| Java SE/EE, Spring Boot, MySQL, PostgreSQL, Oracle, IntelliJ IDEA, Maven, Gradle

Error Message

java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost:3306/db_name
#java#jdbc#mysql#postgresql#トラブルシューティング

このエラーが発生する理由

DriverManagerを、電話交換手のようなものだと考えてみてください。jdbc:mysql://...のようなURLを使用して接続を要求すると、交換手は登録されているすべてのドライバーに対して「これを処理できますか?」と尋ねます。すべてのドライバーが「いいえ」と答えた場合、JavaはNo suitable driver found例外をスローします。これはロジックのバグではありません。Javaが接続文字列を認識できるドライバーを単に見つけられないことを示しています。

ほとんどの開発者がこの壁にぶつかる理由は3つあります。プロジェクトにドライバーのJARファイルが不足しているか、URLにわずかなタイポ(打ち間違い)があるか、あるいはレガシーな環境でドライバーが正しくロードされていないかのいずれかです。

一般的な根本原因

  • 依存関係の不足: プロジェクトのビルドパスにドライバーライブラリ(mysql-connector-jなど)が含まれていません。
  • 不正な形式のJDBC URL: コロンの欠落やプロトコルのスペルミス(例:jdbc:mysql://の代わりにjdbc:mysql//としている)により、URLが認識不能になっています。
  • クラスパスの分離: TomcatやWildFlyなどの環境では、ドライバーがウェブアプリのWEB-INF/libにあっても、サーバーのグローバルなlibフォルダに必要な場合があります。
  • バージョンの不一致: 最新のデータベースに対して古いドライバーを使用すると、登録に失敗することがあります。

解決策1:依存関係を更新する

MavenやGradleを使用している場合、通常は30秒で解決できます。最新のMySQL設定(バージョン8.0以降)では、mysql-connector-javaからmysql-connector-jに変更されています。互換性の問題を避けるため、最新の安定版を使用していることを確認してください。

Mavenの設定 (MySQL 8.x)

<dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-j</artifactId>
    <version>8.3.0</version>
</dependency>

Gradleの設定 (PostgreSQL)

dependencies {
    implementation 'org.postgresql:postgresql:42.7.2'
}

ビルドツールを使用していない場合は、手動で.jarファイルをダウンロードする必要があります。IntelliJ IDEAでは、Project Structure > Librariesから追加します。Eclipseでは、プロジェクトを右クリックしてBuild Path > Configure Build Pathを選択します。

解決策2:JDBC URLを再確認する

ドライバーは接続文字列のプレフィックスによって自身を識別します。ここにタイポがあると、DriverManagerはどのドライバーを呼び出せばよいか判断できません。お使いの文字列を以下の標準的な形式と比較してください:

  • MySQL: jdbc:mysql://localhost:3306/my_database
  • PostgreSQL: jdbc:postgresql://localhost:5432/my_database
  • Oracle Thin: jdbc:oracle:thin:@localhost:1521:xe
  • SQL Server: jdbc:sqlserver://localhost:1433;databaseName=my_db

些細なミスが重要です。例えば、jdbc:mysql:localhost(スラッシュの欠落)やjdbc-mysql://(ハイフンの使用)は、即座にエラーを引き起こします。

解決策3:手動でのドライバー読み込み(レガシーコード)

JDBC 4.0(Java 6でリリース)以降、ドライバーはSPI(Service Provider Interface)を介して自動的にロードされるようになっています。しかし、古いコードを保守している場合や、特定のレガシーなアプリケーションサーバーを使用している場合は、接続を開く前に手動でクラスをロードする必要があるかもしれません。

try {
    // MySQL 8.x の場合は com.mysql.cj.jdbc.Driver を使用
    // MySQL 5.x の場合は com.mysql.jdbc.Driver を使用
    Class.forName("com.mysql.cj.jdbc.Driver");
    
    Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db", "user", "pass");
} catch (ClassNotFoundException e) {
    System.err.println("The driver JAR is missing from your classpath!");
} catch (SQLException e) {
    e.printStackTrace();
}

解決策4:サーバーサイドの問題を解決する

アプリはローカルでは動作するのに、Tomcat上では失敗しませんか?これは通常、クラスパスの分離が原因で発生します。Tomcatのcontext.xmlDataSourceを定義している場合、ドライバーのJARは$CATALINA_HOME/libに配置されている必要があります。.warファイルの中に含まれているだけでは機能しません。

Spring Bootユーザーの場合は、依存関係が<scope>provided</scope>としてマークされていないことを確認してください。もしマークされていると、最終的な実行可能JARにドライバーが含まれず、本番環境でエラーが発生します。

クイック検証スクリプト

環境をテストするために、この小さなコード断片を実行してみてください。複雑なフレームワークを介さずに、コアとなるJDBC接続が機能するかどうかを確認できます。

import java.sql.*;

public class TestJdbc {
    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/your_db";
        try (Connection conn = DriverManager.getConnection(url, "root", "password")) {
            System.out.println("Success! Connected to " + conn.getMetaData().getDatabaseProductName());
        } catch (SQLException e) {
            System.err.println("Failed: " + e.getMessage());
        }
    }
}

予防のためのプロのヒント

  • ドライバーをログに出力する: 起動時にDriverManager.getDrivers().asIterator().forEachRemaining(System.out::println);を使用して、Javaが実際に何を認識しているかを確認します。
  • .envファイルを使用する: URLのハードコーディングはタイポの原因になります。環境変数やapplication.propertiesを使用して、文字列を一元管理してください。
  • バージョンを合わせる: MySQL 8.0を使用している場合は、ドライバーのバージョンも8.0以上であることを確認してください。古いドライバーは、新しい認証プロトコルを処理できないことがよくあります。

Related Error Notes