问题描述
我的用例要求我检查DBConnections以确保我们具有正确的URL。
说我们有10个Oracle DB的列表,并且DB4的连接URL格式错误。我们想捕获db4连接失败,但仍然要检查列表中所有剩余的DB。
allDBs = {DB1 {用户名,URL,密码},DB2 {用户名,URL,密码},.... DB10 {用户名,URL,密码}}
DBList <DbDetails> allDBs = new DBList <DbDetails>();
try{
for(DbDetails db : allDBs)
{
dbUrl = db.getDbUrl();
dbUsername = db.getUserName();
dbPassword = db.getpass();
DbDetails dbDetails = new DbDetails(dbUrl,dbUsername,dbPassword);
dataSource = dbConfig.setorclDataSource(dbDetails);
conn = dataSource.getConnection();
String selectQuery = "select 1 from dual";
sqlFunction sf = new sqlFunction(dataSource,selectQuery);
sf.compile()
}
}
catch(sqlException se){
connFailDBList.add(dbDetail);
LOG.error(se.getMessage());
}
由于DB4网址格式错误。通过上述逻辑,sqlException被捕获到DB4。但是如何恢复列表中其余DB的检查?
解决方法
只需交换for
周期和try-catch
:
DBList <DbDetails> allDBs = new DBList <DbDetails>();
for(DbDetails db : allDBs){
try{
// checking connectivity here
}catch(SQLException se){
connFailDBList.add(dbDetail);
LOG.error(se.getMessage());
}
}
,
只需将try / catch块移至for循环中即可。
DBList<DbDetails> allDBs = new DBList<DbDetails>();
for (DbDetails db : allDBs) {
try {
dbUrl = db.getDbUrl();
dbUsername = db.getUserName();
dbPassword = db.getPass();
DbDetails dbDetails = new DbDetails(dbUrl,dbUsername,dbPassword);
dataSource = dbConfig.setOrclDataSource(dbDetails);
conn = dataSource.getConnection();
String selectQuery = "select 1 from dual";
SqlFunction sf = new SqlFunction(dataSource,selectQuery);
sf.compile()
} catch (SQLException se) {
connFailDBList.add(dbDetail);
LOG.error(se.getMessage());
}
}