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