2015-07-12 46 views
0

我的要求是使用Java从db2数据库中获取将近50万条记录。这些记录我将在文本文件中写入。 目前我首选BufferedWriter做到这一点如下 -BufferedWriter和OutputStramWriter之间的性能

考虑性能,其中包括执行时间,更快的I/O操作和更少的内存使用情况我应该去哪个选项?

测试1 - 当我拿来从数据库 的BufferedWriter近3200条记录 - 需要9秒 OutputStramWriter - 需要8秒

但我很困惑那些之间,因为我有在单杆取近50万条记录,其中性能是关键因素!!

try 
{ 
Statement stmt = new Statement(); 
Connection con = getConnection(); 
BufferedWriter bw = getWriter(); 
String query = "select field1,field2,field3,field4,field5 from table1 WITH UR"; 
stmt = con.createStatement(); 
stmt.setFetchSize(10000); 
ResultSet rs = stmt.executeQuery(query); 
StringBuffer sb = new StringBuffer(); 
while (rs.next()) { 
      sb.append(rs.getString(field1)); 
      sb.append(rs.getString(field2)); 
      sb.append(rs.getString(field3)); 
      sb.append(rs.getString(field4)); 
      sb.append(rs.getString(field5)); 

      bw.write(sb.toString()); 
      bw.newLine(); 
      sb.setLength(0); 

     } 

     bw.flush(); 
     } 
     catch(SQLException ex) 
{ 
ex.printstackTrace(); 
} 
     catch(Exception ex2) 
{ 
ex2.printstackTrace(); 
} 
finally() 
{ 
stmt.close(); 
con.close(); 
bw.close(); 
} 
protected static BufferedWriter/OutputStreamWriter getWriter() 
{ 
//here I have tow options 
//1. 
//FileOutputStream fos = new FileOutputStream(file); 
//OutputStreamWriter osr= new OutputStreamWriter(fos); 
// return osr; 
//2. 
//BufferedWriter out = new BufferedWriter(new FileWriter(file)); 
//return out; 
} 
+1

*“我应该选哪个选项?”*在您的真实世界条件下测试结果并选择能够为您提供最佳结果的结果。 –

+0

感谢T.J.Crowder的回复。但在我的本地m/c中,我没有那么多的记录。我只有3200条记录,因此我必须在这些记录中进行选择。 –

+1

记录可以*创建*。或者你可以重复通过你拥有的3200。 –

回答

0
  • 选项1:OutputStreamWriter写入FileOutputStream中
  • 选项2:BufferedWriter将写入FileWriter的,其写入FileOutputStream中

选项1和选项2都使用一个缓冲器。选项1允许选择字符编码,而选项2不允许。

所以在这两种情况下的性能应该是相似的,但我会选择选项1,因为选择合适的编码是必不可少的。无论如何,性能很可能在很大程度上由数据库控制,而文件IO则不如此。除非在真实条件下测试,否则你永远不会知道。例如,使用本地数据库而不是网络上的数据库可以改变一切。磁盘的性能也至关重要。

虽然我会尽量避免无用的StringBuffer。你应该直接写给作者。 StringBuilder,BTW,应该比StringBuffer更受欢迎,因为它没有无用的同步惩罚。