1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.dbcp2;
18
19 import java.sql.Driver;
20 import java.sql.DriverManager;
21 import java.sql.SQLException;
22
23
24
25
26
27
28 final class DriverFactory {
29
30 static Driver createDriver(final BasicDataSource basicDataSource) throws SQLException {
31
32 Driver driverToUse = basicDataSource.getDriver();
33 final String driverClassName = basicDataSource.getDriverClassName();
34 final ClassLoader driverClassLoader = basicDataSource.getDriverClassLoader();
35 final String url = basicDataSource.getUrl();
36
37 if (driverToUse == null) {
38 Class<?> driverFromCCL = null;
39 if (driverClassName != null) {
40 try {
41 try {
42 if (driverClassLoader == null) {
43 driverFromCCL = Class.forName(driverClassName);
44 } else {
45 driverFromCCL = Class.forName(driverClassName, true, driverClassLoader);
46 }
47 } catch (final ClassNotFoundException cnfe) {
48 driverFromCCL = Thread.currentThread().getContextClassLoader().loadClass(driverClassName);
49 }
50 } catch (final Exception t) {
51 final String message = "Cannot load JDBC driver class '" + driverClassName + "'";
52 basicDataSource.log(message, t);
53 throw new SQLException(message, t);
54 }
55 }
56
57 try {
58 if (driverFromCCL == null) {
59 driverToUse = DriverManager.getDriver(url);
60 } else {
61
62
63
64
65 driverToUse = (Driver) driverFromCCL.getConstructor().newInstance();
66 if (!driverToUse.acceptsURL(url)) {
67 throw new SQLException("No suitable driver", "08001");
68 }
69 }
70 } catch (final Exception t) {
71 final String message = "Cannot create JDBC driver of class '"
72 + (driverClassName != null ? driverClassName : "") + "' for connect URL '" + url + "'";
73 basicDataSource.log(message, t);
74 throw new SQLException(message, t);
75 }
76 }
77 return driverToUse;
78 }
79
80 }