我正在尝试配置单例数据库类,以允许使用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;
}
}
答案 0 :(得分:2)
如下所示更改代码,您必须捕获异常。
setInterval(navigateDown,7000);
答案 1 :(得分:2)
我认为您应该扔掉或处理SQLException
中的getInstance()
,并使用 try-with resource (自动关闭资源)而不是{{1} }块。您不应该不使用抛出finally
进行初始化的构造函数将instance
设置为常量。
Exception
也许,为数据库连接创建初始化方法比初始化构造函数中的所有内容要好,但这是基于观点的。