summaryrefslogtreecommitdiff
path: root/wiki/java/stop-using-class-dot-forname.md
diff options
context:
space:
mode:
Diffstat (limited to 'wiki/java/stop-using-class-dot-forname.md')
-rw-r--r--wiki/java/stop-using-class-dot-forname.md69
1 files changed, 0 insertions, 69 deletions
diff --git a/wiki/java/stop-using-class-dot-forname.md b/wiki/java/stop-using-class-dot-forname.md
deleted file mode 100644
index b01e972..0000000
--- a/wiki/java/stop-using-class-dot-forname.md
+++ /dev/null
@@ -1,69 +0,0 @@
-# JDBC Drivers and `Class.forName()`
-
-The short version: stop using `Class.forName(driverClass)` to load JDBC
-drivers. You don't need this, and haven't since Java 6. You arguably never
-needed this.
-
-This pattern appears all over the internet, and it's wrong.
-
-## Backstory
-
-JDBC has more or less always provided two ways to set up `Connection` objects:
-
-1. Obtain them from a driver-provided `DataSource` class, which applications or
- containers are expected to create for themselves.
-
-2. Obtain them by passing a URL to `DriverManager`.
-
-Most people start with the latter, since it's very straightforward to use.
-However, `DriverManager` needs to be able to locate `Driver` subclasses, and
-the JVM doesn't permit class enumeration at runtime.
-
-In the original JDBC release, `Driver` subclasses were expected to register
-themselves on load, similar to
-
- public class ExampleDriver extends Driver {
- static {
- DriverManager.registerDriver(ExampleDriver.class);
- }
- }
-
-Obviously, applications _can_ force drivers to load using
-`Class.forName(driverName)`, but this hasn't ever been the only way to do it.
-`DriverManager` also provides [a mechanism to load a set of named classes at
-startup](https://docs.oracle.com/javase/8/docs/api/java/sql/DriverManager.html),
-via the `jdbc.drivers` [system property](http://docs.oracle.com/javase/tutorial/essential/environment/sysprop.html).
-
-## JDBC 4 Fixed That
-
-JDBC 4, which came out with Java 6 in the Year of our Lord _Two Thousand and
-Six_, also loads drivers using the [service
-provider](https://docs.oracle.com/javase/8/docs/technotes/guides/jar/jar.html#Service%20Provider)
-system, which requires no intervention at all from deployers or application
-developers.
-
-_You don't need to write any code to load a JDBC 4 driver._
-
-## What's The Harm?
-
-It's harmless in the immediate sense: forcing a driver to load immediately
-before JDBC would load it itself has no additional side effects. However, it's
-a pretty clear indicator that you've copied someone else's code without
-thoroughly understanding what it does, which is a bad habit.
-
-## But What About My Database?
-
-You don't need to worry about it. All of the following drivers support JDBC
-4-style automatic discovery:
-
-* PostgreSQL (since version 8.0-321, in 2007)
-
-* Firebird (since [version 2.2, in 2009](http://tracker.firebirdsql.org/browse/JDBC-140))
-
-* [MySQL](../mysql/choose-something-else) (since [version 5.0, in 2005](http://dev.mysql.com/doc/relnotes/connector-j/en/news-5-0-0.html))
-
-* H2 (since day 1, as far as I can tell)
-
-* Derby/JavaDB (since [version 10.2.1.6, in 2006](https://issues.apache.org/jira/browse/DERBY-930))
-
-* SQL Server (version unknown, because MSDN is archaeologically hostile)