我正在尝试使用Enum Singleton实现ConnectionFactory,并在加载数据库驱动程序(Class.forName)时遇到一个奇怪的问题。现在,我知道,辛格尔顿是一个有争议的模式,并不是每个人都喜欢它,是的,我也不是一个大粉丝。但这仅用于说明目的。
这是我的主要代码:
public class HelloWorld {
public static void main(String[] args) {
ConnectionFactory.getConnection();
}
}
ConnectionFactory:
public enum ConnectionFactory {
INSTANCE;
// Database details
private static final String JDBC_DRIVER_PARAM="org.h2.Driver";
private static final String DB_URL_PARAM="jdbc:h2:file:./h2database/homedb";
private static final String DB_USER_PARAM="admin";
private static final String DB_PASS_PARAM="pass";
private ConnectionFactory() {
try {
Class.forName(JDBC_DRIVER_PARAM);
System.out.println("Driver Loaded!");
} catch (ClassNotFoundException e) {
System.out.println(e);
}
}
private Connection createConnection() {
Connection conn = null;
try{
conn = DriverManager.getConnection(DB_URL_PARAM, DB_USER_PARAM, DB_PASS_PARAM);
}catch (Exception e) {
System.out.println(e);
}
return conn;
}
//public method to obtain connection
public static Connection getConnection() {
return INSTANCE.createConnection();
}
}
这是输出:
java.lang.ClassNotFoundException: org.h2.Driver
虽然,下面工作正常 - 所以它绝对不是类路径问题。我从Eclipse运行这两种方法,它是相同的maven项目,因此没有依赖项问题。
public class HelloWorld {
public static void main(String[] a) throws Exception {
Class.forName("org.h2.Driver");
Connection conn = DriverManager.getConnection("jdbc:h2:file:./h2database/homedb", "admin", "pass");
System.out.println("Connected");
conn.close();
}
}
这是输出:
Connected
我可以在两种方法之间看到唯一真正的区别是使用Enum Singleton。所以我的问题是:当我使用Enum Constructor中的Class.forName()
时,是否存在具体的问题?我想,当枚举由类加载器加载时,构造函数被调用,并且应该能够在类路径上使用其他类。我在这里错过了什么吗?