Support Questions

Find answers, ask questions, and share your expertise

Not able to connect to MySQL database when using Apache NiFi in Linux Ubuntu

avatar
Contributor

Hi!

 

I am trying to connect to a MySQL RDS instance in AWS with Apache NiFi on Linux Ubuntu.

 

The MySQL database is behind a SSH tunnel which is working in a dedicated terminal. The MySQL database is accessible through another Linux terminal.

 

$ ssh -i /home/bernardo/.ssh/sshbernardo3.pem -N -L 33061:<db_name>.<id>.eu-west-1.rds.amazonaws.com:3306 <user>@<ip_address> -p <port>

 

I have uploaded and unzipped the JDBC driver from https://downloads.mysql.com/archives/c-j/

 

The file java.sql.Driver is located in the directory /usr/share/java/META-INF/services in Linux

 

I have installed the jdbc connector in Linux and set up the user to use JDBC

$ sudo apt-get install libmysql-java

$ cd /home/bernardo

$ gedit .bashrc

 

Added the following lines at the end of the file:

 

# Setting up the user to use JDBC

CLASSPATH=$CLASSPATH:/usr/share/java/mysql-connector-java-8.0.26.jar

export CLASSPATH

 

$ source .bashrc

 

In NiFi I have used a DBCPConnectionPool1.15.2 controller service which is configured as follows:

 

• Database Connection URL: jbdc:mysql://127.0.0.1:33061/<db_name>
• Database Driver Class Name: java.sql.Driver
• Database Driver Location: /usr/share/java/META-INF/services
• Database User: <user>
• Password: <password>

 

When enabling the controller service, I get the following error:

 

StandardControllerServiceNode[service=DBCPConnectionPool[id=2440f624-017e-1000-9467-8bb12dda6ca6], name=<controller_service_name>, active=true] Failed to invoke @OnEnabled method due to java.lang.NoSuchMethodException: java.sql.Driver.<init>()
causes: java.lang.InstantiationException: java.sql.Driver
causes: org.apache.nifi.processor.exception.ProcessException: Creating driver instance is failed: Creating driver instance is failed

 

Any hint?

 

This is the SW I have installed:

 

Ubuntu 18.04.6
openjdk version "11.0.13" 2021-10-19
javac 11.0.13
nifi-1.15.2

 

Thanks,

 

Bernardo

1 ACCEPTED SOLUTION

avatar
Contributor

I managed to fix the issue. It was related to the version of the jdbc driver.

 

I did the following:

 

In Linux browser go to https://dev.mysql.com/downloads/connector/j/

 

Select

 

• Ubuntu Linux

• 18.04

 

Download

 

In a CLI terminal go to the Downloads directory

 

$ cd /home/bernardo/Downloads

Unpack the deb file

 

$ sudo dpkg -i mysql-connector-java_8.0.26-1ubuntu18.04_all.deb

Check where is the connector location in the file system

 

$ dpkg -L mysql-connector-java | fgrep jar

/usr/share/java/mysql-connector-java-8.0.26.jar

Clean /usr/share/java from the previous jdbc driver

 

$ sudo rm mysql-connector-java-5.1.45.jar
$ sudo rm -r com
$ sudo rm -r META-INF/

Install the connector: unpack the .jar file

 

$ sudo jar xvf /usr/share/java/mysql-connector-java-8.0.26.jar

To find the driver class name, open /usr/share/java/META-INF/services/java.sql.Driver

 

$ cat /usr/share/java/META-INF/services/java.sql.Driver
com.mysql.cj.jdbc.Driver

The driver class name is: com.mysql.jdbc.Driver

 

Restart Apache Ni-Fi

 

Modify the configuration of the controller service with:

 

• Database Driver Class Name: com.mysql.cj.jdbc.Driver

• Database Driver Location: /usr/share/java/mysql-connector-java-8.0.26.jar

View solution in original post

5 REPLIES 5

avatar
Contributor

My Linux is running on VirtualBox 6.1 on top of Windows 10 Pro.

avatar
Contributor

The file mysql-connector-java-8.0.26.jar is in /usr/share/java

 

Also:

 

$ cat /usr/share/java/META-INF/services/java.sql.Driver

com.mysql.cj.jdbc.Driver

 

SO, I have made the following changes to the DBCPConnectionPool1.15.2 controller service configuration:

 

• Database Driver Class Name: com.mysql.cj.jdbc.Driver
• Database Driver Location: /usr/share/java/mysql-connector-java-8.0.26.jar

 

The other parameters are not changed:

 

• Database Connection URL: jbdc:mysql://127.0.0.1:33061/<db_name>

• Database User: <user>
• Password: <password>

 

$ netstat -nplt

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name

tcp 0 0 127.0.0.1:33061 0.0.0.0:* LISTEN 4873/ssh
tcp6 0 0 ::1:33061 :::* LISTEN 4873/ssh

 

Still I get an error:

 

causes: org.apache.nifi.processor.exception.ProcessException: No suitable driver for the given Database Connection URL

avatar
Contributor

I thought it could be an issue related to the driver version so I re-installed the jdbc driver. I have cleaned /home/bernardo/Download and /usr/share/java from the old sql related files. Then I have done the installation again.

 

Install the jdbc connector

 

$ sudo apt-get install libmysql-java

 

The .jar file is in /usr/share/java/mysql-connector-java-5.1.45.jar Unpack the .jar file

 

$ sudo jar xvf /usr/share/java/mysql-connector-java-5.1.45.jar

 

To find the driver class name, open /usr/share/java/META-INF/services/java.sql.Driver

 

$ cat /usr/share/java/META-INF/services/java.sql.Driver

com.mysql.jdbc.Driver

com.mysql.fabric.jdbc.FabricMySQLDriver

 

The driver class name is: com.mysql.jdbc.Driver

 

This is the updated configuration in the DBCPConnectionPool1.15.2 controller service in Apache Ni-Fi:

 

• Database Driver Class Name: com.mysql.jdbc.Driver

• Database Driver Location: /usr/share/java/mysql-connector-java-5.1.45.jar

• Database Connection URL: jbdc:mysql://127.0.0.1:33061/<db_name>

• Database User: <db_user>

• Password: <db_password>

 

I have obtained the same result:

 

causes: org.apache.nifi.processor.exception.ProcessException: No suitable driver for the given Database Connection URL

Then I checked if the problem was in the SSH tunnel.

 

$ netstat -nplt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address          State       PID/Program name    
tcp        0      0 127.0.0.1:33061         0.0.0.0:*               LISTEN      4497/ssh
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      -                              
tcp6       0      0 ::1:33061               :::*                    LISTEN      4497/ssh     

$ cat /proc/4497/status

Name:   ssh
State:  S (sleeping)

 

The SSH process is in sleeping state.

 

In a separate terminal I accessed the remote MySQL database:

 

$ mysql -u <db_user> -p -h 127.0.0.1 -P 33061

 

Finally, I tried to connect to my local mysql database in my local Linux instance by using the following Ni-Fi settings:

 

• Database Driver Class Name: com.mysql.jdbc.Driver

• Database Driver Location: /usr/share/java/mysql-connector-java-5.1.45.jar

• Database Connection URL: jbdc:mysql://127.0.0.1:3306/<local_db_name>

• Database User: <local_db_user>

• Password: <local_db_password>

 

I have obtained the same result:

 

causes: org.apache.nifi.processor.exception.ProcessException: No suitable driver for the given Database Connection URL

Still, in a separate Linux terminal I am able to access the local mysql database

:

$ mysql -u <local_db_user> -p -h 127.0.0.1 -P 3306

 

 

avatar
Contributor

Hi have corrected a typo in Ni-Fi controller service configuration:

 

• Database Connection URL: jdbc:mysql://127.0.0.1:33061/<local_db_name>

 

This way I solved the controller service problem and I have been able to enable it.

 

However, when I run the processor QueryDatabaseTable, I get the following error: Cannot create PoolableConnectionFactory - Communications link failure

 

QueryDatabaseTable[id=017e1003-c2d8-14cf-4e34-feee76411595] Unable to execute SQL select query SELECT * FROM periodic_measurements_test due to java.sql.SQLException: Cannot create PoolableConnectionFactory (Communications link failure

The last packet successfully received from the server was 1 milliseconds ago. The last packet sent successfully to the server was 1 milliseconds ago.): javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate) ↳ causes: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

The last packet successfully received from the server was 1 milliseconds ago. The last packet sent successfully to the server was 1 milliseconds ago. ↳ causes: java.sql.SQLException: Cannot create PoolableConnectionFactory (Communications link failure

The last packet successfully received from the server was 1 milliseconds ago. The last packet sent successfully to the server was 1 milliseconds ago.) ↳ causes: org.apache.nifi.processor.exception.ProcessException: java.sql.SQLException: Cannot create PoolableConnectionFactory (Communications link failure

The last packet successfully received from the server was 1 milliseconds ago. The last packet sent successfully to the server was 1 milliseconds ago.)

The processor configuration is default, except for:

 

• Database Connection Pooling Service: < DBCPConnectionPool controller service name >

• Database Type: MySQL

• Table Name: periodic_measurements_test

 

The problem might be due to the SSH tunnel but I cannot understand where the problem is.

 

netstat -nplt

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 127.0.0.1:33061         0.0.0.0:*               LISTEN      29483/ssh           
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      -                                      
tcp        0      0 127.0.0.1:8443          0.0.0.0:*               LISTEN      -     

 

And in Linux terminal I can still access the MySQL database thorough CLI:

 

$ mysql -u <db_user> -p -h 127.0.0.1 -P 33061

 

The controller service configuration is still:

 

• Database Connection URL: jdbc:mysql://127.0.0.1:33061/<db_name>

• Database Driver Class Name: com.mysql.jdbc.Driver

• Database Driver Location: /usr/share/java/mysql-connector-java-5.1.45.jar

• Database User: <db_user>

• Password: <db_password>

avatar
Contributor

I managed to fix the issue. It was related to the version of the jdbc driver.

 

I did the following:

 

In Linux browser go to https://dev.mysql.com/downloads/connector/j/

 

Select

 

• Ubuntu Linux

• 18.04

 

Download

 

In a CLI terminal go to the Downloads directory

 

$ cd /home/bernardo/Downloads

Unpack the deb file

 

$ sudo dpkg -i mysql-connector-java_8.0.26-1ubuntu18.04_all.deb

Check where is the connector location in the file system

 

$ dpkg -L mysql-connector-java | fgrep jar

/usr/share/java/mysql-connector-java-8.0.26.jar

Clean /usr/share/java from the previous jdbc driver

 

$ sudo rm mysql-connector-java-5.1.45.jar
$ sudo rm -r com
$ sudo rm -r META-INF/

Install the connector: unpack the .jar file

 

$ sudo jar xvf /usr/share/java/mysql-connector-java-8.0.26.jar

To find the driver class name, open /usr/share/java/META-INF/services/java.sql.Driver

 

$ cat /usr/share/java/META-INF/services/java.sql.Driver
com.mysql.cj.jdbc.Driver

The driver class name is: com.mysql.jdbc.Driver

 

Restart Apache Ni-Fi

 

Modify the configuration of the controller service with:

 

• Database Driver Class Name: com.mysql.cj.jdbc.Driver

• Database Driver Location: /usr/share/java/mysql-connector-java-8.0.26.jar