Reputation: 5758
I'm trying to find out why I cannot connect to mariadb on my laptop. MariaDB is installed with several databases and I can connect using HeidiSQL without problem.
I'm trying to get a Java application connecting to the database, but I get:
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)
I have downloaded "mariadb-java-client-1.2.2.jar" and added this to the project.
My database URI is:
jdbc:mysql://localhost:3306/mysql
I've tried changing the using:
jdbc:mariadb://localhost:3306/mysql
With the same results. I've got this working before on another PC, but I don't know why its not working on the laptop? The user name and password are correct and the same as used to connect with HeidiSQL.
I've tried with both:
Class.forName("com.mysql.jdbc.Driver");
and
Class.forName("org.mariadb.jdbc.Driver");
to register the library and then I read that these aren't required....what am I missing?
Code:
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;
}
}
Upvotes: 4
Views: 2613
Reputation: 34608
It seems that the Mariadb driver 1.2.2 has a hidden dependency on org.slf4j.LoggerFactory
.
You can actually see this if you use the command
Class.forName("org.mariadb.jdbc.Driver");
and look at the resulting stack trace. That command is not necessary for JDBC 4 and above, but it is useful for tracking the reason for failed auto-registration of JDBC drivers.
So, the stack trace you get is:
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
This is a bug and it should be reported to the vendors of MariaDB, as they do not mention this requirement/dependency in their documentation.
Workaround
For now, your solution is simply to download the MariaDB driver 1.2.0.
Upvotes: 5