这是我的故事。我有myCon=getUnusedConnection();
方法从连接池获取连接。我也有releaseConnection(myCon);
方法在完成使用后释放连接到池。
好的,编码时,我需要多次从数据库中选择数据。我想重用我的代码,所以我想有一个单一动作的方法。前,
public static List<String[]> getData(){
Connection myCon=null;
PreparedStatement preparedStmt=null;
try{
myCon=getUnusedConnection();
String sql="select ........";
preparedStmt=myCon.prepareStatement(sql);
ResultSet results=preparedStmt.executeQuery();
String str="";
if(results.next()){
str=results.getString(1);
}
if(!str.equals("")){
List<String[]> list=getData2(myCon, preparedStmt, str);
}
return list;
}
catch (SQLException ex) {
while (ex != null) {
System.out.println ("SQL Exception: " +
ex.getMessage ());
ex = ex.getNextException ();
}
}catch (java.lang.Exception e) {
System.out.println("***ERROR-->" + e.toString());
}
finally{
releaseConnection (myCon);
closeStatement (preparedStmt);
}
return null;
}
public static List<String[]> getData2(Connection myCon, PreparedStatement preparedStmt, String str){
try{
List<String[]> list=new ArrayList<String[]>();
String sql="c.......";
preparedStmt=myCon.prepareStatement(sql);
ResultSet results=preparedStmt.executeQuery();
while(results.next()){
list.add(results.getString(1));
}
return list;
}catch (SQLException ex) {
while (ex != null) {
System.out.println ("SQL Exception: " +
ex.getMessage ());
ex = ex.getNextException ();
}
}catch (java.lang.Exception e) {
System.out.println("***ERROR-->" + e.toString());
}
finally {
closeStatement(preparedStmt);
releaseConnection(myCon);
}
return null;
}
我是否需要在getData2中加入try - catch - finally
?
由于我正在传递myCon & prepareStatement
所以我不确定这是否是正确的编码方式。
这是我编码的标准方式吗?或者你做得更好吗?
答案 0 :(得分:1)
我需要在
try
中加入catch
-finally
-getData2
吗?
答案取决于您致电getData2
的其他地方:
getData
是唯一的地方,则答案为“否”,try
/ finally
就足够了。SQLException
并以相同的方式处理它,答案也是“否”,原因相同(不需要catch
)。< / LI>
SQLException
,那么您需要保留try
- catch
- finally
但是,您对getData2
的来电编码方式存在问题:由于getData2
有一个释放连接的finally
,您的getData
会释放连接两次。您需要添加useExistingConnection(conn)
并修改releaseConnection
以计算对同一连接的引用,或者传递一个标志,指示是否应该关闭连接。
通常,我更喜欢构建代码以在同一方法中打开和关闭连接,将连接传递给其他方法,并仅使用try
/ finally
关闭{{ 1}}在从属方法中打开,例如PreparedStatements
。
答案 1 :(得分:0)
我已经使你的方法getData2()
变为私有而没有捕获(如果它处理与父级相同的异常)并且如果你在顶层执行则关闭finally中的资源。如果您无法更改它,请将另一个方法设为私有,例如getData3()
,而不是try-catch-finally
。
但是,如果您的所有方法都遵循相同的模板,我会做出另一个更改。
用于调用的可调用接口。
public interface Queryable<T>{
T execute();
}
然后是util类。
public final class SQLUtil {
private SQLUtil() { }
public static Connection getConnection() {
return getUnusedConnection();
}
public <T> static T query(Queryable queryable) {
T toReturn = null;
try {
toReturn = queryable.execute();
} catch (SQLException ex) {
while (ex != null) {
System.err.println ("SQL Exception: " +
ex.getMessage ());
ex = ex.getNextException ();
}
} catch (java.lang.Exception e) {
System.out.println("***ERROR-->" + e.toString());
} finally {
releaseConnection (myCon);
closeStatement (preparedStmt);
}
}
//add code for getUnusedConnection, releaseConnection, closeStatement
}
您的客户端代码将如下所示:
public List<String[]> getData(){
return SQLUtil.query(new Queryable<List<String[]>>() {
@Override
public List<String[]> execute() {
Connection myCon=getUnusedConnection();
String sql="select ........";
PreparedStatement preparedStmt=myCon.prepareStatement(sql);
ResultSet results=preparedStmt.executeQuery();
String str="";
if(results.next()) {
str=results.getString(1);
}
List<String[]> list = null;
if(!str.equals("")) {
list=getData2(myCon, preparedStmt, str);
}
return list;
}
});
}