O que é caminho de classe para o emblema do driver do Groovy Console / jdbc?
Esse código de banco de dados está OK no ambiente Java (sem o valor vinculado 'c'), mas no console do Groovy não é possível usar o jdbc corretamente, com exceção
java.sql.SQLException: No suitable driver found for jdbc:sqlserver://localhost;databaseName=
A classe Driver é conhecida pelo script (é carregada sem nulo, etc.), mas provavelmente não está registrada no Drivermanager?
código (eu tento com e semClass.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: o que eu já tinha verificado:
O console do Groovy iniciado recentemente não possui sqljdbc4.jar no caminho de classe.Exceção naturaljava.lang.ClassNotFoundException
na linha 4Class.forName()
, ou se a linha 4 comentou e os parâmetros db com driver nomeiam a exceção na linha 7Sql.newInstance(db )
Sua classe lógica de driver não foi encontrada, etc ...
1a. se os parâmetros db com 3 argumentos (sem driver), eu assumo que sua exceção legal (e trabalhando em outras situações) mude paraSQLException: No suitable driver
na linha 7Sql.newInstance(db )
Também é lógico, o DriverManager não sabe como resolver a chavejdbc:sqlserver
. O driver não está registrado e o DriverManager não possui conhecimento mágico que classe implementa.
2. quando adiciono jar ao console do caminho de classe (Script / Adicionar jar (s) ao caminho de classe), as coisas mudam um pouco. Não maisClassNotFoundException
e variávelc
possui um valor não nulo (classe de driver), masSQLException: No suitable driver
continuou.
Meu entendimento da filosofia JDBC: o driver JAR (moderno) usa técnica com arquivoMETA-INF/services/java.sql.Driver
ser conhecido porDriverManager
. Portanto, na situação correta, o 4º argumento (nome da classe do driver) não é necessário porque é descoberto automaticamente. Por favor, corrija minha compreensão se estiver errado.
Eu usei a palavra 'active' nesse sentido ("inativo" significa que a classe existe e é carregada, mas pode ser usada como driver jdbc).
Meu código máximo é:
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 )
mas aindano suitable driver
Exceção
EDIT2: Enumero as coisas com esse código (antes de 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("# ");
}
e pegue
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)
Meu código (básico) executado é o ambiente Tomcat ainda funcionando ok. Qual é o problema?