summaryrefslogtreecommitdiff
path: root/.html/java/stop-using-class-dot-forname.html
diff options
context:
space:
mode:
authorOwen Jacobson <owen.jacobson@grimoire.ca>2015-07-03 22:31:49 -0400
committerOwen Jacobson <owen.jacobson@grimoire.ca>2015-07-03 22:35:09 -0400
commit76aed6ef732de38d82245b3d674f70bab30221e5 (patch)
treed50e9a296d91ef8a49bcb29c3e80096f200a3c26 /.html/java/stop-using-class-dot-forname.html
parent92f66d3e3a0996bb1fad9dc83d7e184f92673e5d (diff)
Fuck it, serve the files directly.
Diffstat (limited to '.html/java/stop-using-class-dot-forname.html')
-rw-r--r--.html/java/stop-using-class-dot-forname.html155
1 files changed, 155 insertions, 0 deletions
diff --git a/.html/java/stop-using-class-dot-forname.html b/.html/java/stop-using-class-dot-forname.html
new file mode 100644
index 0000000..85190e8
--- /dev/null
+++ b/.html/java/stop-using-class-dot-forname.html
@@ -0,0 +1,155 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <title>
+ The Codex »
+ Stop Using Class Dot Forname
+ </title>
+
+ <link
+ rel='stylesheet'
+ type='text/css'
+ href='http://fonts.googleapis.com/css?family=Buenard:400,700&amp;subset=latin,latin-ext'>
+ <link
+ rel="stylesheet"
+ type="text/css"
+ href="../media/css/reset.css">
+ <link
+ rel="stylesheet"
+ type="text/css"
+ href="../media/css/grimoire.css">
+</head>
+<body>
+
+<div id="shell">
+
+ <ol id="breadcrumbs">
+
+ <li class="crumb-0 not-last">
+
+ <a href="../">index</a>
+
+ </li>
+
+ <li class="crumb-1 not-last">
+
+ <a href="./">java</a>
+
+ </li>
+
+ <li class="crumb-2 last">
+
+ stop-using-class-dot-forname
+
+ </li>
+
+ </ol>
+
+
+
+ <div id="article">
+ <h1 id="jdbc-drivers-and-classforname">JDBC Drivers and <code>Class.forName()</code></h1>
+<p>The short version: stop using <code>Class.forName(driverClass)</code> to load JDBC
+drivers. You don't need this, and haven't since Java 6. You arguably never
+needed this.</p>
+<p>This pattern appears all over the internet, and it's wrong.</p>
+<h2 id="backstory">Backstory</h2>
+<p>JDBC has more or less always provided two ways to set up <code>Connection</code> objects:</p>
+<ol>
+<li>
+<p>Obtain them from a driver-provided <code>DataSource</code> class, which applications or
+ containers are expected to create for themselves.</p>
+</li>
+<li>
+<p>Obtain them by passing a URL to <code>DriverManager</code>.</p>
+</li>
+</ol>
+<p>Most people start with the latter, since it's very straightforward to use.
+However, <code>DriverManager</code> needs to be able to locate <code>Driver</code> subclasses, and
+the JVM doesn't permit class enumeration at runtime.</p>
+<p>In the original JDBC release, <code>Driver</code> subclasses were expected to register
+themselves on load, similar to</p>
+<pre><code>public class ExampleDriver extends Driver {
+ static {
+ DriverManager.registerDriver(ExampleDriver.class);
+ }
+}
+</code></pre>
+<p>Obviously, applications <em>can</em> force drivers to load using
+<code>Class.forName(driverName)</code>, but this hasn't ever been the only way to do it.
+<code>DriverManager</code> also provides <a href="https://docs.oracle.com/javase/8/docs/api/java/sql/DriverManager.html">a mechanism to load a set of named classes at
+startup</a>,
+via the <code>jdbc.drivers</code> <a href="http://docs.oracle.com/javase/tutorial/essential/environment/sysprop.html">system property</a>.</p>
+<h2 id="jdbc-4-fixed-that">JDBC 4 Fixed That</h2>
+<p>JDBC 4, which came out with Java 6 in the Year of our Lord <em>Two Thousand and
+Six</em>, also loads drivers using the <a href="https://docs.oracle.com/javase/8/docs/technotes/guides/jar/jar.html#Service%20Provider">service
+provider</a>
+system, which requires no intervention at all from deployers or application
+developers.</p>
+<p><em>You don't need to write any code to load a JDBC 4 driver.</em></p>
+<h2 id="whats-the-harm">What's The Harm?</h2>
+<p>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.</p>
+<h2 id="but-what-about-my-database">But What About My Database?</h2>
+<p>You don't need to worry about it. All of the following drivers support JDBC
+4-style automatic discovery:</p>
+<ul>
+<li>
+<p>PostgreSQL (since version 8.0-321, in 2007)</p>
+</li>
+<li>
+<p>Firebird (since <a href="http://tracker.firebirdsql.org/browse/JDBC-140">version 2.2, in 2009</a>)</p>
+</li>
+<li>
+<p><a href="../mysql/choose-something-else">MySQL</a> (since <a href="http://dev.mysql.com/doc/relnotes/connector-j/en/news-5-0-0.html">version 5.0, in 2005</a>)</p>
+</li>
+<li>
+<p>H2 (since day 1, as far as I can tell)</p>
+</li>
+<li>
+<p>Derby/JavaDB (since <a href="https://issues.apache.org/jira/browse/DERBY-930">version 10.2.1.6, in 2006</a>)</p>
+</li>
+<li>
+<p>SQL Server (version unknown, because MSDN is archaeologically hostile)</p>
+</li>
+</ul>
+ </div>
+
+
+
+<div id="comments">
+<div id="disqus_thread"></div>
+<script type="text/javascript">
+ /* * * CONFIGURATION VARIABLES: EDIT BEFORE PASTING INTO YOUR WEBPAGE * * */
+ var disqus_shortname = 'grimoire'; // required: replace example with your forum shortname
+
+ /* * * DON'T EDIT BELOW THIS LINE * * */
+ (function() {
+ var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
+ dsq.src = 'http://' + disqus_shortname + '.disqus.com/embed.js';
+ (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
+ })();
+</script>
+<noscript>Please enable JavaScript to view the <a href="http://disqus.com/?ref_noscript">comments powered by Disqus.</a></noscript>
+<a href="http://disqus.com" class="dsq-brlink">comments powered by <span class="logo-disqus">Disqus</span></a>
+</div>
+
+
+
+ <div id="footer">
+ <p>
+
+ The Codex —
+
+ Powered by <a href="http://markdoc.org/">Markdoc</a>.
+
+<a href="https://bitbucket.org/ojacobson/grimoire.ca/src/master/wiki/java/stop-using-class-dot-forname.md">See this page on Bitbucket</a> (<a href="https://bitbucket.org/ojacobson/grimoire.ca/history-node/master/wiki/java/stop-using-class-dot-forname.md">history</a>).
+
+ </p>
+ </div>
+
+</div>
+</body>
+</html> \ No newline at end of file