- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
In previous versions of JDBC, to obtain a connection, you first had to initialize your JDBC driver by calling the method Class.forName.
Any JDBC 4.0 drivers that are found in your class path are automatically loaded. (However, you must manually load any drivers prior to JDBC 4.0 with the method Class.forName.)
我有一个连接到 SQL Server Express 2016 的 jersey Webservice。它在 CLASSPATH 中有 sqljdbc42.jar,它是 4.2 驱动程序
但是,如果我省略 Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver")
调用,我的 DriverManager.getConnection
会抛出一个 SQLException
(未找到适合 jdbc 的驱动程序:sqlserver://localhost:1433;....)
添加 Class.forName
调用后,getConnection
开始成功。
我正在使用 Java 8。
我错过了什么?
更新:我刚刚尝试了一个命令行程序,它在没有 forName
的情况下也能正常工作。但是,在我的 Eclipse IDE 中,我在本地主机上将 REST 服务作为 Tomcat 8.0 服务器运行,但它不起作用。
最佳答案
由于 SPI(服务提供者接口(interface)),当 DriverManager 类自身初始化时,驱动程序会自动初始化。这意味着在内部它将尝试在上下文类加载器中找到任何可用的文件 META-INF/services/java.sql.Driver
并且对于找到的每个文件,它将创建一个类的实例在文件中定义,在本例中实际上是 JDBC 驱动程序的 FQN,这就是 JDBC 驱动程序从 JDBC 4.0.
但这只有在您的驱动程序在初始化类 DriverManager 时可从上下文类加载器中获得时才有效。确保这一点的一个好方法是使您的驱动程序可从层次结构中足够高的类加载器获得。在您的情况下,您应该将驱动程序放在 tomcat/lib
中。实际上,这样您的驱动程序就可以从应该足够高的 Common CL 获得。有关 Tomcat 中 CL 层次结构的更多详细信息 here .
关于java - Class.forName 似乎仍然是必要的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37876684/
我正在使用 this solution在二进制矩阵中找到与图像边界对齐的矩形。假设现在我想找到一个不与图像边框对齐的矩形,并且我不知道它的方向;找到它的最快方法是什么? 为了示例,让我们寻找一个仅包含
else: 行在这个 Python 程序中是否正确/必要? from random import randrange for n in range(10): r = randrange(0,1
在 TDPL 7.1.5.1 中讨论了将 Widget w2 分配给 w1 并且作者指出“将 w2 逐个字段分配给 w1 会将 w2.array 分配给 w1.array——一个简单的数组边界分配,而
我是一名优秀的程序员,十分优秀!