StringBuffer 或 StringBuilder 用于我的查询

StringBuffer or StringBuilder for my query

我知道第一个是同步的,第二个是不同步的,响应时间更快。

我正在使用 StringBuffer 来附加 SQL 查询。转移到 StringBuilder 会更快(我的问题特别是关于 SQL)?

围绕 SQl 查询附加使用 StringBuilder 是否可取?

我的当前代码

public boolean saveData (Connection conn,MyObject) throws SQLException {
..
PreparedStatement pstmt = null;
ResultSet rs = null;
try{
StringBuffer sSubQry = new StringBuffer();                      
sSubQry.append (" select ID, STATEID, TYPEID, LANGID, SEQ, ");
sSubQry.append (" SECTIONSEQ, CODE, NAME, INPUTNAME, ");
sSubQry.append (" .., .., ..,");
sSubQry.append (" .., .., ..,");
..
..
pstmt = conn.prepareStatement(sSubQry.toString());
rs = pstmt.executeQuery();
while (rs.next ())
 {
 ..
 }
}

将其转移到StringBuilder有任何+ve-ve效果

public boolean saveData (Connection conn,MyObject) throws SQLException {
..
PreparedStatement pstmt = null;
ResultSet rs = null;
try{
StringBuilder sSubQry = new StringBuilder();                        
sSubQry.append (" select ID, STATEID, TYPEID, LANGID, SEQ, ");
sSubQry.append (" SECTIONSEQ, CODE, NAME, INPUTNAME, ");
sSubQry.append (" .., .., ..,");
sSubQry.append (" .., .., ..,");
..
pstmt = conn.prepareStatement(sSubQry.toString());
rs = pstmt.executeQuery();
while (rs.next ())
 {
 ..
 }
}

这一切都是在一个线程中完成的,所以是的,StringBuilder 没问题(但请参阅有关以这种方式构建 SQL 是否合适的评论)。

只要你有像这样的一系列步骤,你在其中创建一个局部变量,然后永远不会将对它的引用传递给任何其他方法,而且你永远不会 return 它,你可以确定只有当前线程可以访问它。

(通常,如果您将某些内容传递给另一个线程,您会意识到这就是您正在做的事情。)

sSubQry属于saveData方法作用域,所以可以放心使用StringBuilder.

StringBuffer 在 class 实例成员可以被不同线程共享时可能有用。