这样的数据库代码在 Java 环境中是可以的(没有绑定值 'c'),但在 Groovy 控制台中不能正确使用 jdbc,有异常
java.sql.SQLException: No suitable driver found for jdbc:sqlserver://localhost;databaseName=
驱动程序类以脚本而闻名(加载时没有 null 等)但可能未在 Drivermanager 中注册?
代码(我尝试使用和不使用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 )
编辑:我已经检查过的内容:
- 新启动的 Groovy 控制台在类路径上没有 sqljdbc4.jar。
java.lang.ClassNotFoundException
第 4 行的自然异常Class.forName()
,或者如果第 4 行注释和参数 db 带有驱动程序名称,则第 7 行的异常 Sql.newInstance(db )
它的逻辑,未找到驱动程序类等......
1a。如果 db 参数带有 3 个参数(没有驱动程序),我假设它的合法(并且在其他情况下工作)异常更改为SQLException: No suitable driver
第 7 行 Sql.newInstance(db )
这也是合乎逻辑的, DriverManager 不知道如何解决 key jdbc:sqlserver
。Driver 未注册,DriverManager 不知道类实现了什么。
2. 当我将 jar 添加到控制台类路径(脚本/将 jar(s) 添加到类路径)时,事情发生了一些变化。没有更多ClassNotFoundException
变量c
具有非空值(驱动程序类)但SQLException: No suitable driver
继续。
我对 JDBC 哲学的理解:(现代)JAR 驱动程序使用文件技术META-INF/services/java.sql.Driver
以DriverManager
. 因此,在正确的情况下,不需要第 4 个参数(驱动程序类名称),因为它是自动发现的。如果我错了,请纠正我的理解。
我在这个意义上使用了“活动”一词(“非活动”表示类存在并已加载,但可以用作 jdbc 驱动程序)。
我的最大代码是:
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 )
但仍然no suitable driver
例外
EDIT2:我用这样的代码枚举事物(在 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("# ");
}
并得到
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)
我执行的(基本)代码是 Tomcat 环境仍然可以正常工作。怎么了?