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-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 )操作系统