准备好声明sql字符串建议吗?

时间:2012-06-21 11:29:17

标签: java hibernate prepared-statement

您好我有一个类,其中包含用于检查数据库值的不同方法。 每个方法都针对一个特定的表,所以每次调用该方法时select sql都保持不变只有要检查的where子句值发生变化,所以我使用的是预处理语句

public boolean checkVal(Session session,String b,String c,String d)
    {
        String sql="select a from tbl_name where b=? and c=? " +
                "and d=? ";
        Query query=session.createSQLQuery(sql).addScalar("a",Hibernate.STRING);
        query.setParameter(0,b);
        query.setParameter(1,c);
        query.setParameter(2,d);

    if(){
some check and return
}
}

这个方法被调用为100000次,所以我认为sql会重新生成并且在这里使用准备好的语句是没用的,那么我该怎么做才能提高性能呢?这样做的正确方法应该是什么?

3 个答案:

答案 0 :(得分:1)

SQL String可以是static和final;没有理由每次都重新创建它。

但这不是你最大的问题。

PreparedStatement诞生于绑定和重复执行。没有比这更好的了。 JDBC驱动程序可以在解析和验证后缓存PreparedStatement,因此您只需执行一次。

您是否测量了性能并发现此方法存在性能问题?如果没有,在你有一些数据之前不要猜测你有问题。

我会问为什么必须重复调用该方法。每10万用户一次吗?如果是的话,除了减少观众数量或消除呼叫需求之外,您无能为力。 (想想缓存。)单个用户10万?弄清楚如何进行一次通话或批量处理。你会因为这种安排而死于潜在的死亡。您的夸张吗?深呼吸,放松,并获取一些数据。

答案 1 :(得分:1)

不,sql变量只是一个常量字符串表达式,因此不会每次都创建它。每次调用时都会有一个String对象。

即使这个每次都创建一个新字符串,这也不可能成为性能瓶颈。你有没有测量过性能?这有问题吗?你有理由相信这个问题是由于这个代码而不是(比如说)数据库本身的瓶颈吗?

我希望希望 Hibernate为此使用PreparedStatement缓存,但你应该研究它。

答案 2 :(得分:1)

您可以使用Hibernate命名查询,这样可以避免在每次调用时Hibernate进行HQL或SQL解析(为什么在这里使用SQL查询而不是HQL?)。

最后,Hibernate会要求JDBC连接创建一个预准备语句。如果您的连接池或驱动程序缓存预准备语句,如果经常使用此方法,则很有可能获得已准备好的语句。