2014-12-20 26 views
-2

以下代码可能会泄漏JDK 7中的内存吗?JDK 7中字符串的内存泄漏

//size of input obj is around 15K 
public save(List<DBObj> objs){ 

    //added in new EDIT 

    if(objs ==null || objs.size == 0) 
     return; 
    if(objs.size()> 999) { 
     save(objs.sublist(0,999)); 
     save(objs.sublist(999,objs.size()) 
    } 
//EDIT finish 
StringBuffer sb = new StringBuffer(); 
sb.append(SOMEINSERTQUERYPREFIX) 

for(DBObj obj : objs){ 
      //add some prefix 
      sb.append(checkNULLforDBInsert(obj.getF1())).append(" , "); 
      sb.append(checkNULLforDBInsert(obj.getField2())).append(" , "); 
      sb.append(checkNULLforDBInsert(obj.getField3())).append(" , "); 
     //app sufix 
    } 

} 


private String checkNULLforDBInsert(String str) 
    { 

     if (str == null || str.toLowerCase().equals("null")) 
     { 

      return "null"; 
     } else { 
      //suspecting this for leak ,Should a StringBuilder be used here too? 

      return "'" + str + "'"; 
     } 

    } 


为什么我认为它是一个泄漏
功能checkNULLforDBInsert追加报价每输入海峡。现在这个方法将被称为 对象中的15K * 12个字段。我认为这可能会产生泄漏,因为必须使用StringBuffer。

PLZ评论

+4

为什么地球上会有内存泄漏? –

+1

为什么不使用'PreparedStatement'? – fge

+3

不,它会导致SQL注入。 – xehpuk

回答

1

不,这不是内存泄漏,因为所有分配的对象只能通过局部变量访问,这将耗尽范围,一旦方法完成,这反过来又使对象无法访问和资格为垃圾收集。

由于另一个原因,代码是可怕的:将用户提供的数据连接到SQL语句中允许用户向数据库发送任意命令(取决于数据库用户的权限和数据库类型)可以升级完成远程代码执行并由攻击者接管数据库服务器。

更多信息:SQL injection Wikipedia page