Such database code is OK in Java environment (without binded value 'c'), but in Groovy console can't properly use jdbc, with exception
java.sql.SQLException: No suitable driver found for jdbc:sqlserver://localhost;databaseName=
Driver class is known for script (is loaded without null etc) but probably not registered in Drivermanager ?
code (i try with and without Class.forname()
)
import groovy.sql.Sql
import groovy.sql.DataSet
c = Class.forName('com.microsoft.sqlserver.jdbc.SQLServerDriver')
def db = [url:'jdbc:sqlserver://localhost;databaseName=... ,driver:'com.microsoft.sqlserver.jdbc.SQLServerDriver']
def sql = Sql.newInstance(db )
EDIT: what I had checked already:
- fresh started Groovy console hasn't sqljdbc4.jar on classpath.
Natural exception java.lang.ClassNotFoundException
on line 4 Class.forName()
, or if line 4 commented and parameters db with driver name the exception on line 7 Sql.newInstance(db )
Its logical, driver class not found etc ...
1a. if db parameters with 3 arguments (without driver), I assume its legal (and working in other situations) exception changes to SQLException: No suitable driver
on line 7 Sql.newInstance(db )
It is logical too, DriverManager don't know how to resolve key jdbc:sqlserver
. Driver isn't registered and DriverManager have not magical knowledge what class implements.
2.
when I add jar to console classpath (Script / Add jar(s) to classpath) things are somewhat changed. No more ClassNotFoundException
and variable c
has non-null value (driver class) but SQLException: No suitable driver
continues.
My understanding of JDBC philosophy: (modern) JAR driver uses technique with file META-INF/services/java.sql.Driver
to be known for DriverManager
.
So in correct situation 4th argument (driver class name) is not required because is discovered automatically.
Please correct my understanding if I'm wrong.
I have used word 'active' in this sense ("non active" means class exist and is loaded, but can be used as jdbc driver).
My maximal code is:
import groovy.sql.Sql
import groovy.sql.DataSet
import java.sql.DriverManager;
import java.util.ServiceLoader;
c = Class.forName('com.microsoft.sqlserver.jdbc.SQLServerDriver')
DriverManager.getDrivers()
ServiceLoader.load(java.sql.Driver.class)
def db = [url:'jdbc:sqlserver://localhost;...,driver:'com.microsoft.sqlserver.jdbc.SQLServerDriver']
def sql = Sql.newInstance(db )
but still no suitable driver
Exception
EDIT2: I enumerate things with such code (before newInstance() ):
StringBuilder sb = new StringBuilder();
String grVersion = "brak";
Enumeration<Driver> dri = DriverManager.getDrivers();
for (Enumeration<Driver> e = dri; e.hasMoreElements();) {
Driver e1 = e.nextElement();
sb.append(e1.getClass().getName()).append(' ');
sb.append(e1.getMajorVersion()).append('.').append(e1.getMinorVersion());
}
// get LOADED drivers niesetty
ServiceLoader<java.sql.Driver> codecSetLoader = ServiceLoader.load(java.sql.Driver.class);
for (Driver e1 : codecSetLoader) {
sb.append(e1.getClass().getName()).append('!');
sb.append(e1.getMajorVersion()).append('.').append(e1.getMinorVersion());
sb.append("# ");
}
and get
com.mysql.jdbc.Driver 5.1com.mysql.fabric.jdbc.FabricMySQLDriver 5.1com.mysql.jdbc.Driver!5.1# com.mysql.fabric.jdbc.FabricMySQLDriver!5.1# com.microsoft.sqlserver.jdbc.SQLServerDriver!4.0#
Exception thrown
java.sql.SQLException: No suitable driver found for jdbc:sqlserver://localhost;databaseName=....
at ConsoleScript11.run(ConsoleScript11:32)
My (basic) code executed is Tomcat environment still working ok. What's the matter?