这是一个很好的编码实践 - 传递连接吗?

时间:2013-12-28 03:30:45

标签: java jdbc

这是我的故事。我有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所以我不确定这是否是正确的编码方式。

这是我编码的标准方式吗?或者你做得更好吗?

2 个答案:

答案 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;
        }
    });
}
相关问题