2015-09-04 65 views
1

我想将批处理和连接逻辑封装到自己的类中,如下面的代码所示,以强制该连接正确关闭并使应用程序逻辑更加简单。提取准备好的语句逻辑的最干净的解决方案

public class SQLHelper { 
    public static void insertBatched(List<String> insertStatements) { 
     // do connection and batching logic here 
    } 
} 
public class Application { 
    public static void doWork() { 
     // create insert statements here 
     SQLHelper.insertBatched(statements); 
    } 
} 

问题是,构建插入语句作为字符串是不好的做法,应该用准备好的语句替换。在使用预准备语句时,我需要设置参数以及在同一个对象上进行批处理,因此可以在两个类之间共享。我到目前为止想到的解决方案:

  1. 从SQLHelper获取连接并使用它来准备语句。此解决方案的问题在于类之间的传递连接很容易出错,因为无法确保正确释放资源
  2. 将字符串传递给SQLHelper并获取准备好的语句。这一问题是应用程序有一批在这种情况下,插入语句,然后再次关闭连接

这两种解决方案都有缺点,所以我想问问什么是最干净的设计解决方案,以获得最大的封装,同时还关于适当的资源再分配有安全性。

+2

阅读有关连接池的信息。这比打开和关闭连接好得多。 –

+0

@SajithSilva连接池(至少我知道的)相当透明,所以在合并/非合并版本之间的应用程序代码没有区别。 – biziclop

+1

使用Spring的JdbcTemplate(或重新创建它):http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#jdbc –

回答

0

如果你想手动管理SQL连接,我想你可以使用类似这样

interface SqlWorker { 
    public void run(Connection c); 
} 


class SQLHelper { 
    public void execute(SqlWorker worker) throws SQLException { 
     Connection c = //Get the connection 
     try { 
      worker.run(c); 
     } finally { 
      c.close(); 
     } 
    } 
} 

public static void main(String[] args) throws SQLException { 
    new SQLHelper().execute((c) -> { 
     //do any connection sql stuff here. DB helper will clean up. 
    }); 
} 

有了这个模式,你就不必通过周围的连接。
但它很容易做一些愚蠢的事情,并崩溃它。另外如果你创建一个准备好的语句或打开一个ResultSet,那些需要显式关闭。

有问题地管理你的连接是一个痛苦,你可能想考虑使用spring/JPA框架,以便管理连接/事务。