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 <[email protected]> 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 <[email protected]> > 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 <[email protected]> > 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 <[email protected]> > >> 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 > >> > >> > >
