【发布时间】:2019-01-07 10:01:19
【问题描述】:
我正在尝试配置一个单例数据库类,以允许使用 JDK8 和 Tomcat7 对 Oracle XE 18c 数据库进行连接池。
由于以下错误,我无法编译源代码:
未报告的异常 SQLException;必须被抓获或被宣布为 扔了
类源代码:
package com.example.webapp.db;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import org.apache.tomcat.jdbc.pool.DataSource;
import org.apache.tomcat.jdbc.pool.PoolProperties;
public class DatabaseManager {
private static final DatabaseManager SINGLE_INSTANCE = new DatabaseManager();
private DatabaseManager() throws SQLException {
PoolProperties p = new PoolProperties();
p.setUrl("jdbc:oracle:thin:@localhost:1521:xe");
p.setDriverClassName("oracle.jdbc.driver.OracleDriver");
p.setUsername("scott");
p.setPassword("tiger");
p.setJmxEnabled(true);
p.setTestWhileIdle(false);
p.setTestOnBorrow(true);
p.setValidationQuery("SELECT 1");
p.setTestOnReturn(false);
p.setValidationInterval(30000);
p.setTimeBetweenEvictionRunsMillis(30000);
p.setMaxActive(100);
p.setInitialSize(10);
p.setMaxWait(10000);
p.setRemoveAbandonedTimeout(60);
p.setMinEvictableIdleTimeMillis(30000);
p.setMinIdle(10);
p.setLogAbandoned(true);
p.setRemoveAbandoned(true);
p.setJdbcInterceptors("org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;"+
"org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer");
DataSource datasource = new DataSource();
datasource.setPoolProperties(p);
Connection con = null;
try {
con = datasource.getConnection();
Statement st = con.createStatement();
ResultSet rs = st.executeQuery("select * from user");
int cnt = 1;
while (rs.next()) {
System.out.println((cnt++)+". Host:" +rs.getString("Host")+
" User:"+rs.getString("User")+" Password:"+rs.getString("Password"));
}
rs.close();
st.close();
} finally {
if (con!=null) try {con.close();}catch (Exception ignore) {}
}
}
public static DatabaseManager getInstance() {
return SINGLE_INSTANCE;
}
}
【问题讨论】:
-
...那条消息有什么不清楚的地方?这是一个检查异常,所以它“必须被捕获或声明被抛出”。由于您不能在静态初始化程序中声明它,因此您需要捕获它。
-
你让你的构造函数抛出了一个
SQLException,它需要在调用这个构造函数时被捕获。这意味着包括new DatabaseManager()的每一行都必须包含在try {...} catch (SQLException e)中。在您的情况下,这将是困难的,因为该行是private static final DatabaseManager... 所以也许在构造函数代码中的try {...} finally {...}中添加一个catch子句,并从构造函数签名中删除throws SQLException。 -
DatabaseManager的初始化不应该仅仅因为它当前无法连接到数据库而失败。可以说,它甚至不应该尝试在构造函数中做类似的事情。
标签: java oracle tomcat jdbc java-8