[ 
https://issues.apache.org/jira/browse/KAFKA-5953?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16193156#comment-16193156
 ] 

Randall Hauch commented on KAFKA-5953:
--------------------------------------

No, that's not the source of the problem. It has more to do with the timing of 
the first code to cause DriverManager to be loaded and initialized, at which 
point it attempts to scan for all the Driver classes using the system 
classloader. But when JDBC driver JARs are located within a plugin, the 
DriverManager only finds their Driver implementation if that plugin happened to 
be the first plugin to access DriverManager and/or use JDBC. Debezium's MySQL 
connector doesn't have a problem because it directly loads the MySQL Driver 
class, which like all Driver implementations registers itself with the 
DriverManager. 

A possible workaround is to have all the JDBC drivers on the classpath so that 
no matter when DriverManager is loaded it will always find the JDBC drivers. Of 
course, this is not ideal, which is why [~kkonstantine] is looking into a fix 
for this.

> Connect classloader isolation may be broken for JDBC drivers
> ------------------------------------------------------------
>
>                 Key: KAFKA-5953
>                 URL: https://issues.apache.org/jira/browse/KAFKA-5953
>             Project: Kafka
>          Issue Type: Bug
>          Components: KafkaConnect
>    Affects Versions: 0.11.0.0
>            Reporter: Jiri Pechanec
>            Priority: Critical
>
> Let's suppose there are two connectors deployed
> # using JDBC driver (Debezium MySQL connector)
> # using PostgreSQL JDBC driver (JDBC sink).
> Connector 1 is started first - it executes a statement
> {code:java}
> Connection conn = DriverManager.getConnection(url, props);
> {code}
> As a result a {{DriverManager}} calls {{ServiceLoader}} and searches for all 
> JDBC drivers. The postgres driver from connector 2) is found associated with 
> classloader from connector 1).
> Connector 2 is started after that - it executes a statement
> {code:java}
> connection = DriverManager.getConnection(url, username, password);
> {code}
> DriverManager finds the connector that was loaded in step before but becuase 
> the classloader is different - now we use classloader 2) so it refuses to 
> load the class and no JDBC driver is found.



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

Reply via email to