What happens if you remove the line

      jdbcDriver: 'com.mysql.cj.jdbc.Driver’,

from your Calcite model? Hopefully, it just works. Most drivers load 
automatically these days, and if you don’t specify the class name, Calcite 
won’t try to load it manually.

> On Oct 6, 2021, at 12:07 PM, Justin Swanhart <greenl...@gmail.com> wrote:
> 
> 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