Java 1.8.0_60、MariaDB v10.0 和 mariadb-java-client 1.2.2,“找不到合适的驱动程序”

Posted

技术标签:

【中文标题】Java 1.8.0_60、MariaDB v10.0 和 mariadb-java-client 1.2.2,“找不到合适的驱动程序”【英文标题】:Java 1.8.0_60, MariaDB v10.0 and , mariadb-java-client 1.2.2, "No suitable driver found" 【发布时间】:2015-12-15 17:57:41 【问题描述】:

我正在尝试找出我的笔记本电脑上无法连接到 mariadb 的原因。 MariaDB 安装了多个数据库,我可以使用 HeidiSQL 毫无问题地连接。

我正在尝试让 Java 应用程序连接到数据库,但我得到:

java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost:3306/mysql
    at java.sql.DriverManager.getConnection(Unknown Source)
    at java.sql.DriverManager.getConnection(Unknown Source)

我已下载“mariadb-java-client-1.2.2.jar”并将其添加到项目中。

我的数据库 URI 是:

jdbc:mysql://localhost:3306/mysql

我已尝试更改使用:

jdbc:mariadb://localhost:3306/mysql

结果相同。我以前在另一台电脑上也有过这个功能,但我不知道为什么它不能在笔记本电脑上工作?用户名和密码正确,与连接HeidiSQL时使用的相同。

我都试过了:

Class.forName("com.mysql.jdbc.Driver");

Class.forName("org.mariadb.jdbc.Driver"); 

注册图书馆,然后我读到这些不是必需的......我错过了什么?

代码:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class clsDB 
//The name of this class    
    private static final String TAG = clsDB.class.toString();   
//Define database URL, user name and password
    private static final String SERVER_ADDR = "localhost";
//The database address on Windows development system    
    private static final String DB_URL = "jdbc:mariadb://" + SERVER_ADDR +  ":3306/mysql";
    private static final String USER_NAME = "root";
    private static final String PASSWORD = "RRCmcs2014";
//Database connection object    
    private Connection m_con = null;
/**
 * Class constructor    
 * @throws Exception 
 */
    public clsDB() throws Exception 
//Create connection to database     
        connect();
    
/**
 * @param strMethod the method the error occurs in
 * @param strMsg the message to display
 */
    private void errorMsg(String strMethod, String strMsg) 
        System.out.println(TAG + "." + strMethod + ": " + strMsg);
    
/**
 * Destructor
 */
    protected void finalize() throws Throwable 
        close();
    
/**
 * Attempts to close database connection    
 * @throws SQLException 
 */
    public void close() throws SQLException 
        if ( m_con != null && m_con.isClosed() == false ) 
            m_con.close();
               
    
/**
 * Commits any changes to the database  
 * @throws SQLException
 */
    public void commit() throws SQLException 
        if ( m_con != null && m_con.isClosed() == false ) 
            m_con.commit();
        
    
/**
 * Attempts to connect to database  
 * @throws Exception 
 */
    private void connect() throws Exception 
//Get a connection to the database
        m_con = (Connection)DriverManager.getConnection(DB_URL,     
                                                        USER_NAME, 
                                                        PASSWORD);
        if ( m_con == null ) 
            throw new Exception( "Cannot connect to database!" );
        
//Disable auto-commit       
        m_con.setAutoCommit(false);
    
/**
 * Performs SQL execute or update   
 * @param strSQL, the SQL statement to perform
 * @return If an insert was performed then the insert ID, 
 *         If an update then the number of effected rows
 */
    public long execute(String strSQL) throws SQLException 
        Statement st = null;
        long lngRC = 0;
        try
            if ( m_con != null ) 
                if ( m_con.isClosed() == true ) 
                    try
                        connect();
                     catch( Exception ex ) 
                        errorMsg("query", ex.getMessage());
                    
                
                st = (Statement)m_con.createStatement();

                if ( (lngRC = (int)st.executeUpdate(strSQL,    Statement.RETURN_GENERATED_KEYS)) > 0 ) 
                    if ( strSQL.toUpperCase().startsWith("INSERT") == true ) 
                        ResultSet keys = st.getGeneratedKeys();

                        if ( keys != null ) 
                            keys.next();
                            lngRC = keys.getLong(1);
                        
                                       
                    m_con.commit();
                
            
         catch( SQLException ex ) 
            errorMsg("execute", ex.getMessage());
         finally 
            if ( st != null ) 
                st.close();
            
        
        return lngRC;
           
/**
 * @return The database connection object
 */
    public Connection getConnection() 
        return m_con;
    
/**
 * Performs SQL query   
 * @param strSQL, the SQL statement to perform
 * @return the result of the query
 */
    public ResultSet query(String strSQL) throws SQLException 
        Statement st = null;
        ResultSet rs = null;
        try
            if ( m_con != null ) 
                if ( m_con.isClosed() == true ) 
                    try
                        connect();
                     catch( Exception ex ) 
                        errorMsg("query", ex.getMessage());
                    
                
                st = (Statement)m_con.createStatement();
                rs = st.executeQuery(strSQL);
            
         catch( SQLException ex ) 
            errorMsg("query", ex.getMessage());
        
        return rs;
       

【问题讨论】:

您是否已将 mariadb jar 添加到您的类路径中? 是的,该类在文件夹中:“C:\Program Files\Java\jre1.8.0_60\lib”和项目文件夹中。 这些都不是类路径。您必须将其添加到类路径中,这意味着在 IDE 中您应该使用项目首选项添加它,如果您从命令行运行,则添加到 -cp 参数或 CLASSPATH 环境变量。跨度> @RealSkeptic,在我的项目“Java 构建路径”中,我有 mariadb-java-client-1.2.2.jar”,它位于项目文件夹中,这在“库”选项卡中可见. 我还需要做什么? 检查它是否在运行配置的类路径中。 【参考方案1】:

看来Mariadb驱动1.2.2对org.slf4j.LoggerFactory有隐藏依赖。

如果你使用命令,你实际上可以看到这个

Class.forName("org.mariadb.jdbc.Driver");

并查看生成的堆栈跟踪。该命令对于 JDBC 4 及更高版本不是必需的,但对于跟踪 JDBC 驱动程序自动注册失败的原因很有用。

所以,你得到的堆栈跟踪是:

Exception in thread "main" java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory
    at org.mariadb.jdbc.Driver.<clinit>(Driver.java:71)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:264)
    at testing.clsDB.connect(clsDB.java:65)
    at testing.clsDB.<init>(clsDB.java:26)
    at testing.SimpleTest.main(SimpleTest.java:7)
Caused by: java.lang.ClassNotFoundException: org.slf4j.LoggerFactory
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 6 more

这是一个错误,应该报告给 MariaDB 的供应商,因为他们在 documentation 中没有提到这个要求/依赖关系。

解决方法

目前,您的解决方案只是下载MariaDB driver 1.2.0。

【讨论】:

以上是关于Java 1.8.0_60、MariaDB v10.0 和 mariadb-java-client 1.2.2,“找不到合适的驱动程序”的主要内容,如果未能解决你的问题,请参考以下文章

安装并初始化mariadb v10数据库

mariadb-server安装问题(Error: MariaDB-common conflicts with 1:mariadb-libs-5.5.60-1.el7_5.x86_64)

12_Linux ARM架构_安装JDK8-银河麒麟V10(Kylin Linux Advanced Server V10 )操作系统

Jenkins插件管理

centos 7.5 安装mysql

CentOS 7.4 如何安装 MariaDB 10.3.9 Stable 数据库