driver.connect()vs DriverManager.getConnection()

时间:2018-03-20 19:04:08

标签: java jdbc

DriverManager.getConnection在内部调用driver.connect()以获取数据库连接。 有没有直接使用driver.connect()的陷阱?

1 个答案:

答案 0 :(得分:0)

java.sql.Driver是一个接口,你需要一个实际的实现(例如Firebird的org.firebirdsql.jdbc.FBDriver)来实际做任何事情。另一方面,DriverManager是一个具体的类,它为您提取(隐藏)驱动程序加载,选择和使用。

通常,您不应直接使用Driver实施。坚持使用DriverManager或以其他方式使用DataSource实施(最好通过配置)。

使用DriverManager将代码与实际使用的驱动程序分离。这意味着您没有特定驱动程序的编译时依赖性。更改驱动程序甚至数据库系统(假设SQL兼容或兼容生成)只是在类路径上添加/替换驱动程序jar并在配置中指定正确的JDBC URL的方式。这是假设JDBC 4自动加载驱动程序,否则将特定的驱动程序名称添加到配置并使用Class.forName(<value from config>)也是必要的。

例如,对于SQL Server,您可以使用Microsoft的驱动程序或jTDS驱动程序(+其他第三方驱动程序)。在这些之间切换 - 基本上 - 是将正确的驱动程序添加到类路径并更改配置中的URL。

过去,Microsoft甚至对其JDBC驱动程序进行了重大更改,更改了驱动程序的类名 URL。如果您对Driver实现进行了硬编码依赖,那么如果您尝试升级驱动程序,代码就会中断。如果你刚刚使用了DriverManager(并且有一个配置选项用于URL,并且 - 这是在自动驱动程序加载之前 - 用于加载的驱动程序类名称),那么在配置更改后,事情就会继续工作。 / p>

您可以直接使用Driver实现(通常通过反射并且仍然没有硬编码),但这些情况很少见,除非您有充分的理由(并且知道您是什么&#39)然后就这样做了。