- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
不久前,我正在实现 JDBC 驱动程序。但在开始工作之前,我研究了一些 MySQL JDBC 驱动程序源代码,发现它们包含 java.sql.Driver
接口(interface)的两个实现:com.mysql.jdbc.Driver和 com.mysql.jdbc.NonRegisteringDriver ,其中 Driver
还扩展了 NonRegisteringDriver
。
Driver
类只包含一个调用 DriverManager.registerDriver()
来注册类的静态 block :
static {
try {
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
而NonRegisteringDriver
实现了所有的java.sql.Driver
接口(interface)方法。
我的第一个想法是,通过这种方式实现驱动程序,MySQL 驱动程序的开发人员将遵循 java.sql.Driver说明以下内容的指南:
It is strongly recommended that each Driver class should be small and standalone so that the Driver class can be loaded and queried without bringing in vast quantities of supporting code.
但是如果我正确地理解了 Java 类加载,那么拥有单独的 com.mysql.jdbc.Driver
类绝对没有意义,因为它的所有实现代码的父级无论如何都会在执行之前加载静态 block 。
我是不是漏掉了什么?
最佳答案
不,实际上如果没有 com.mysql.jdbc.Driver
类,mysql
JDBC 驱动程序的当前实现将无法满足 java.sql.Driver
协议(protocol),claims :
When a Driver class is loaded, it should create an instance of itself and register it with the DriverManager. This means that a user can load and register a driver by calling
Class.forName("foo.bah.Driver")}
com.mysql.jdbc.NonRegisteringDriver
类不包含创建自实例和注册它的这一部分。
为什么 mysql
开发人员决定将实现本身与本质上注册其实例的类区分开来?很难准确地说,但如果他们决定在同一个包中提供多个实现,那可能会很方便。然后 com.mysql.jdbc.Driver
类将扩展默认的一个。
更新:基本上事情就像我上面描述的那样。至少有 3 个派生类扩展 com.mysql.jdbc.NonRegisteringDriver
:
虽然 com.mysql.jdbc.Driver
是默认实现,但其他实现会覆盖基类中的一些方法。如果 NonRegisteringDriver
包含用于创建其实例并注册它的静态 block ,则不可能在内存中恰好有一个需要的 mysql
驱动程序和派生类。
但总的来说,没有充分的理由这样做。例如org.postgresql.Driver
实现contains java.sql.Driver
本身的完整实现。
关于java - JDBC Driver实现和类加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39319346/
我正在尝试获取此亚马逊页面中列出的每台笔记本电脑的图像 URL ( https://www.amazon.com/s?rh=n%3A565108%2Cp_72%3A4-&pf_rd_i=565108&
我正在设置 Atlassian Confluence,在选择数据库时,我在选择“使用外部 Mysql 数据库”时卡住了我看过一些教程,但对我来说,它并没有按照应有的方式工作。我使用 ubuntu 12
我是 Neo4J 的新手,正在尝试通过 java 连接到 Neo4J 服务器。 我的一个独立项目的pom入口如下: org.neo4j neo4j-o
所有这些有什么区别和用途? spark.local.ip spark.driver.host spark.driver.bind地址 spark.driver.hostname 如何将机器修复为 Sp
我在旧的 Inspiron 6400 计算机(GeForce 7300 笔记本电脑版)上安装了 Lubuntu 19.04,通过网络草稿编辑器教我儿子 Scratch。每次我通过 Firefox 打开
我使用 qt 开发了一个 c++ 库。在本文中,我使用 QSqlDatabase 从 SQLite 数据库中查询信息。注意:我的库在 qt 桌面应用程序中运行良好(我在 Linux 上开发)。 现在我
存在类似的问题,但没有帮助。 在 Apache 2.4 上安装 php5-fpm 通过 SSL 连接到远程 MySql 数据库。 可以通过命令行连接MySQL mysql -u myname -p'p
使用以下配置 (doctrine.yaml) 在 Symfony 4 中使用 Doctrine DBAL: dbal: # configure these for your database
使用以下配置 (doctrine.yaml) 在 Symfony 4 中使用 Doctrine DBAL: dbal: # configure these for your database
我有一个用 Java 编写的 Selenium Web 驱动程序测试,目标是 Liferay 站点。 // Login driver.get(baseUrl + "/"); driver.findEl
在driver.findElements()中,我们获得了另一个用于查找size()的函数,该函数在driver.findElement()中不可用。 这是唯一的区别吗? 最佳答案 driver.fi
这个问题已经有答案了: java.lang.IllegalStateException: The driver executable does not exist: while trying to e
简短描述:我有一个通过 SignTool 验证的签名驱动程序,但 Windows 拒绝加载它并出现错误:CodeIntegrity 3004 - 在系统上找不到文件哈希。我该如何解决这个问题? 详细说
我正在设置一些 Geb 测试,但出现“geb.driver.DriverCreationException:无法从回调创建驱动程序”错误。 Geb 将尝试启动测试浏览器窗口,但一旦启动,我的所有测试都
我想通过应用对象存储库概念在 Chrome 驱动程序中打开 url。下面给出的是我的 selenium 程序,其中包含两个文件,一个是 testng 文件,另一个是 config.property 文
我在 Ubuntu Linux、Spring Tools 2.7.1、Spring Roo 1.1.5 上运行 Eclipse Indigo。我正在阅读 Getting Started with Ro
打开 Url 的首选方法是什么(它们之间是否存在任何差异): driver.Url = "http://example.com"; 或 driver.Navigate().GoToUrl("http:
我使用 python 脚本传递给 cassandra 批处理查询,如下所示: query = 'BEGIN BATCH ' + 'insert into ... ; insert into ... ;
我在 Protractor 中执行脚本时出现以下错误。 System info: host: '8888', ip: '88888', os.name: 'Mac OS X', os.arch: 'x
我收到错误 KeyError:'driver'。 我想使用scrapy-selenium 创建一个网络爬虫。我的代码如下所示: class TestSpider(Spider): name="test
我是一名优秀的程序员,十分优秀!