iteye_12054
iteye_12054
2010-07-11 00:17

PreparedStatement复用 !!!

已采纳

大家好, 我最近在开发一些SQLite的应用, 有一些JDBC使用上不清楚的地方, 望专家不吝赐教.

问题1:首先是一个将重复调用向数据库写入的方法, 其中对PreparedStatement的使用我拿不准, 我写了两套如下:

public class ContentPersistence extends Persistence{

    private PreparedStatement statementForPut = null;
    
    private void initStatements() throws SQLException{
            this.statementForPut = super.getDBManager().getConnection().prepareStatement("INSERT INTO `"+DBLabel.TABLE_CONTENT+"`(`"+
                    DBLabel.COLUMN_URL_ID_OF_PAGE_CONTENT+"`,`"+
                    DBLabel.COLUMN_CONTENT_OF_PAGE_CONTENT+"`)VALUES(?,?);");
    }
    
    public ContentPersistence(DBManager dbManager) throws SQLException {
        super(dbManager);
        this.initStatements();
    }
    
    public synchronized void put1(Object content) throws SQLException{
        this.statementForPut.setInt(1, ((Content)content).getUrlId());
        this.statementForPut.setBytes(2, (Content)content).getContent());
        this.statementForPut.executeUpdate();
        this.statementForPut.clearBatch();      //? question 2
        this.statementForPut.clearParameters(); //? question 2
    }

    public synchronized void put2(Object content) throws SQLException{
        PreparedStatement preparedStatement = null;
        try{
            preparedStatement = super.getDBManager().getConnection().prepareStatement("INSERT INTO `"+DBLabel.TABLE_CONTENT+"`(`"+
                    DBLabel.COLUMN_URL_ID_OF_PAGE_CONTENT+"`,`"+
                    DBLabel.COLUMN_CONTENT_OF_PAGE_CONTENT+"`)VALUES(?,?);");
            
            preparedStatement.setInt(1, ((Content)content).getUrlId());
            preparedStatement.setBytes(2, (Content)content).getContent());
                preparedStatement.executeBatch();
        }finally{
            if(preparedStatement != null){
                                preparedStatement.close();
                preparedStatement = null;
            }
        }
    }
}



我在网上看了些例子都如put2()中的方式, 但put1()似乎更合理些, 在这里希望得到专家的证实.



问题2: 上面put1()中, 在执行完一次插入数据后, 调用了
    this.statementForPut.clearBatch(); //? question 2
    this.statementForPut.clearParameters(); //? question 2
对statement进行清理, 请教这么使用对不对,有没有必要?



问题3: 最后请专家指点可以优化的地方, 主要是对资源复用与临时变量清理的部分,避免内存漏洞.


谢谢先![img]/images/smiles/icon_smile.gif" alt="[/img][img]/images/smiles/icon_arrow.gif" alt="[/img]

 

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

1条回答

  • book_lxf9501 book_lxf9501 11年前

    put1() 可以
    对statement没有必要清理

    点赞 评论 复制链接分享

相关推荐