Hi,

So the example from MySQL is:
[justin@localhost calcite.old]$ cat LoadDriver.java
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

// Notice, do not import com.mysql.jdbc.*
// or you will have problems!

public class LoadDriver {
    public static void main(String[] args) {
    // The newInstance() call is a work around for some
    // broken Java implementations
      try{
              Class.forName("com.mysql.jdbc.Driver").newInstance();
      } catch(Exception ex) {
    }
  }
}

The code ignores an exception that is thrown when using .newInstance().
The program outputs:
Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver
class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered
via the SPI and manual loading of the driver class is generally unnecessary.
(it outputs nothing if the new driver name is used)

So it seems that the MySQL driver throws an exception when used this way
that has to be ignored, and Calcite is not ignoring it?

If that is the case, it seems like a problem with the MySQL driver, but I
just want to confirm with you before I go report a bug and look silly :)

On Wed, Oct 6, 2021 at 2:59 PM Justin Swanhart <greenl...@gmail.com> wrote:

> Hi,
>
> The class.forName doesn't work for me though (tried
> org.mysql.cj.jdbc.Driver and org.mysql.jdbc.Driver), but just using a
> "jdbc:mysql://" connection string does work.
>
> It makes sense that class.forName throws the same exception for me as
> Calcite, but I don't understand why just using a connection string works,
> so I am really confused.  I assume some other class name is being used when
> I just use the connection string, but I don't know how to figure out what
> that class name is.
>
> On Wed, Oct 6, 2021 at 2:55 PM Julian Hyde <jhyde.apa...@gmail.com> wrote:
>
>> Does your environment use shading? Maybe Class.forName with a constant
>> argument is handled by the shading, but Calcite is calling Class.forName
>> with a dynamic argument.
>>
>> > On Oct 6, 2021, at 11:41 AM, Justin Swanhart <greenl...@gmail.com>
>> wrote:
>> >
>> > Hi,
>> >
>> > The jar is in the classpath, and I can run the java command that the
>> > sqlline script runs directly, and I get the same error.
>> >
>> > The following works in a test java program with the CLASSPATH set:
>> >
>> >    conn =
>> >       DriverManager.getConnection("jdbc:mysql://localhost/ssb?" +
>> >                                   "user=root");
>> > I can create a resultset from a SELECT statement and fetch the results.
>> >
>> > But this does not (throws ClassNotFound exception):
>> > Class.forName("com.mysql.cj.jdbc.Driver").newInstance();
>> > neither does
>> > Class.forName("com.mysql.cj.jdbc.Driver").newInstance();
>> >
>> > I am confused, because the JDBC connection works as long as I don't use
>> > Class.forName.  I don't know how to figure out the name of the class
>> that
>> > is actually being used.  I'm sorry if this is silly, but I do not have
>> much
>> > java experience.  The MySQL documentation says to use
>> > com.mysql.cj.jdbc.Driver:
>> >
>> https://dev.mysql.com/doc/connector-j/8.0/en/connector-j-usagenotes-connect-drivermanager.html
>> >
>> > I suppose this is some kind of MySQL JDBC problem, so this may not be
>> the
>> > right mailing list, but if you have any suggestions before I start
>> looking
>> > elsewhere, I would appreciate it.
>> >
>> > On Wed, Oct 6, 2021 at 1:59 PM Julian Hyde <jhyde.apa...@gmail.com>
>> wrote:
>> >
>> >> It looks as if com.mysql.cj.jdbc.Driver is not on your class path.
>> >>
>> >> If you are launching via SQLLine, you will need to edit the sqlline
>> shell
>> >> script to add a jar (or jars) to your class path.
>> >>
>> >> Julian
>> >>
>> >>
>> >>> On Oct 6, 2021, at 10:43 AM, Justin Swanhart <greenl...@gmail.com>
>> >> wrote:
>> >>>
>> >>> I am probably making some obvious mistake, but I am having a problem
>> >>> getting a simple MySQL JDBC connection working.
>> >>>
>> >>> I have the latest version of the Connector/J MySQL java client
>> driver.  I
>> >>> have a MySQL 8 server running on the local machine, and the following
>> >> model
>> >>> JSON:
>> >>> {
>> >>> version: '1.0',
>> >>> defaultSchema: 'ssb',
>> >>> schemas: [
>> >>>   {
>> >>>     name: 'ssb',
>> >>>     type: 'custom',
>> >>>     factory: 'org.apache.calcite.adapter.jdbc.JdbcSchema$Factory',
>> >>>     operand: {
>> >>>       jdbcDriver: 'com.mysql.cj.jdbc.Driver',
>> >>>       jdbcUrl: 'jdbc:mysql://localhost/ssb',
>> >>>       jdbcUser: 'root',
>> >>>       jdbcPassword: ''
>> >>>     }
>> >>>   }
>> >>> ]
>> >>> }
>> >>>
>> >>> I have the MySQL driver in my CLASSPATH. I can compile a simple test
>> >>> program which verifies that the class com.mysql.jdbc.Driver exists.
>> >>>
>> >>> While the test program works, sqlline does not:
>> >>> $ ./sqlline -d com.mysql.cj.jdbc.Driver -u jdbc:mysql://root@localhost
>> >> /ssb
>> >>> Building Apache Calcite 1.28.0-SNAPSHOT
>> >>> scan complete in 1ms
>> >>> Could not find driver com.mysql.cj.jdbc.Driver
>> >>>
>> >>> Any suggestions about what I might be doing wrong?
>> >>>
>> >>> Using the !connect command yields a large backtrace (while probably
>> not
>> >>> useful, included for completeness):
>> >>> sqlline version 1.11.0
>> >>> sqlline> !connect jdbc:calcite:model=test.json admin admin
>> >>> WARNING: An illegal reflective access operation has occurred
>> >>> WARNING: Illegal reflective access by com.google.protobuf.UnsafeUtil
>> >>>
>> >>
>> (file:/home/justin/.gradle/caches/modules-2/files-2.1/com.google.protobuf/protobuf-java/3.6.1/d06d46ecfd92ec6d0f3b423b4cd81cb38d8b924/protobuf-java-3.6.1.jar)
>> >>> to field java.nio.Buffer.address
>> >>> WARNING: Please consider reporting this to the maintainers of
>> >>> com.google.protobuf.UnsafeUtil
>> >>> WARNING: Use --illegal-access=warn to enable warnings of further
>> illegal
>> >>> reflective access operations
>> >>> WARNING: All illegal access operations will be denied in a future
>> release
>> >>> java.lang.RuntimeException: Error instantiating
>> >> JsonCustomSchema(name=ssb)
>> >>> at org.apache.calcite.model.ModelHandler.visit(ModelHandler.java:277)
>> >>> at
>> >>>
>> >>
>> org.apache.calcite.model.JsonCustomSchema.accept(JsonCustomSchema.java:66)
>> >>> at org.apache.calcite.model.ModelHandler.visit(ModelHandler.java:200)
>> >>> at org.apache.calcite.model.ModelHandler.<init>(ModelHandler.java:106)
>> >>> at org.apache.calcite.jdbc.Driver$1.onConnectionInit(Driver.java:101)
>> >>> at
>> >>>
>> >>
>> org.apache.calcite.avatica.UnregisteredDriver.connect(UnregisteredDriver.java:139)
>> >>> at sqlline.DatabaseConnection.connect(DatabaseConnection.java:135)
>> >>> at
>> sqlline.DatabaseConnection.getConnection(DatabaseConnection.java:192)
>> >>> at sqlline.Commands.connect(Commands.java:1481)
>> >>> at sqlline.Commands.connect(Commands.java:1355)
>> >>> at
>> java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native
>> >>> Method)
>> >>> at
>> >>>
>> >>
>> java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
>> >>> at
>> >>>
>> >>
>> java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>> >>> at java.base/java.lang.reflect.Method.invoke(Method.java:566)
>> >>> at
>> >>>
>> >>
>> sqlline.ReflectiveCommandHandler.execute(ReflectiveCommandHandler.java:44)
>> >>> at sqlline.SqlLine.dispatch(SqlLine.java:818)
>> >>> at sqlline.SqlLine.begin(SqlLine.java:596)
>> >>> at sqlline.SqlLine.start(SqlLine.java:269)
>> >>> at sqlline.SqlLine.main(SqlLine.java:208)
>> >>> Caused by:
>> com.google.common.util.concurrent.UncheckedExecutionException:
>> >>> java.lang.RuntimeException: java.sql.SQLException: Cannot load JDBC
>> >> driver
>> >>> class 'com.mysql.cj.jdbc.Driver'
>> >>> at
>> com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2051)
>> >>> at com.google.common.cache.LocalCache.get(LocalCache.java:3951)
>> >>> at com.google.common.cache.LocalCache.getOrLoad(LocalCache.java:3974)
>> >>> at
>> >>>
>> >>
>> com.google.common.cache.LocalCache$LocalLoadingCache.get(LocalCache.java:4958)
>> >>> at
>> >>>
>> >>
>> com.google.common.cache.LocalCache$LocalLoadingCache.getUnchecked(LocalCache.java:4964)
>> >>> at
>> >>>
>> >>
>> org.apache.calcite.adapter.jdbc.JdbcUtils$DialectPool.get(JdbcUtils.java:116)
>> >>> at
>> >>>
>> >>
>> org.apache.calcite.adapter.jdbc.JdbcSchema.createDialect(JdbcSchema.java:200)
>> >>> at
>> org.apache.calcite.adapter.jdbc.JdbcSchema.create(JdbcSchema.java:136)
>> >>> at
>> org.apache.calcite.adapter.jdbc.JdbcSchema.create(JdbcSchema.java:123)
>> >>> at
>> org.apache.calcite.adapter.jdbc.JdbcSchema.create(JdbcSchema.java:175)
>> >>> at
>> >>>
>> >>
>> org.apache.calcite.adapter.jdbc.JdbcSchema$Factory.create(JdbcSchema.java:570)
>> >>> at org.apache.calcite.model.ModelHandler.visit(ModelHandler.java:272)
>> >>> ... 18 more
>> >>> Caused by: java.lang.RuntimeException: java.sql.SQLException: Cannot
>> load
>> >>> JDBC driver class 'com.mysql.cj.jdbc.Driver'
>> >>> at
>> >>>
>> >>
>> org.apache.calcite.adapter.jdbc.JdbcUtils$DialectPool.dialect(JdbcUtils.java:101)
>> >>> at
>> >>>
>> >>
>> com.google.common.cache.CacheLoader$FunctionToCacheLoader.load(CacheLoader.java:165)
>> >>> at
>> >>>
>> >>
>> com.google.common.cache.LocalCache$LoadingValueReference.loadFuture(LocalCache.java:3529)
>> >>> at
>> >>
>> com.google.common.cache.LocalCache$Segment.loadSync(LocalCache.java:2278)
>> >>> at
>> >>>
>> >>
>> com.google.common.cache.LocalCache$Segment.lockedGetOrLoad(LocalCache.java:2155)
>> >>> at
>> com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2045)
>> >>> ... 29 more
>> >>> Caused by: java.sql.SQLException: Cannot load JDBC driver class
>> >>> 'com.mysql.cj.jdbc.Driver'
>> >>> at
>> >>>
>> >>
>> org.apache.commons.dbcp2.BasicDataSource.createConnectionFactory(BasicDataSource.java:489)
>> >>> at
>> >>>
>> >>
>> org.apache.commons.dbcp2.BasicDataSource.createDataSource(BasicDataSource.java:599)
>> >>> at
>> >>>
>> >>
>> org.apache.commons.dbcp2.BasicDataSource.getConnection(BasicDataSource.java:809)
>> >>> at
>> >>>
>> >>
>> org.apache.calcite.adapter.jdbc.JdbcUtils$DialectPool.dialect(JdbcUtils.java:94)
>> >>> ... 34 more
>> >>> Caused by: java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver
>> >>> at
>> >>>
>> >>
>> java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
>> >>> at
>> >>>
>> >>
>> java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
>> >>> at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
>> >>> at
>> >>>
>> >>
>> org.apache.commons.dbcp2.BasicDataSource.createConnectionFactory(BasicDataSource.java:483)
>> >>> ... 37 more
>> >>
>> >>
>>
>>

Reply via email to