0

嗨,我有一个类,其中包含检查数据库值的不同方法。每个方法都针对一个特定的表,所以每次调用该方法时选择 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会重新生成,在这里使用准备好的语句是没用的,那么我应该怎么做才能提高性能呢?这样做的正确方法应该是什么?

4

3 回答 3

1

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

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

于 2012-06-21T11:41:49.577 回答
1

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

即使这确实每次都会创建一个新字符串,这也不太可能成为性能瓶颈。你测量过性能吗?有问题吗?您是否有任何理由相信问题是由于此代码而不是(例如)数据库本身的瓶颈造成的?

希望Hibernate 为此使用PreparedStatement缓存,但您应该研究一下。

于 2012-06-21T11:36:51.483 回答
1

SQL 字符串可以是静态的和最终的;没有理由每次都重新创建它。

但这不是你最大的问题。

PreparedStatement为绑定和反复执行而生。没有比这更好的了。JDBC 驱动程序可以缓存 PreparedStatement 一旦它被解析和验证,所以你只做一次。

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

我会问为什么必须重复调用该方法。对于 100,000 个用户,是否每个人一次?如果是,那么除了减少听众或消除通话需求外,您无能为力。(想想缓存。)单个用户 100,000?弄清楚如何拨打一个电话或批量处理它们。有了这种安排,你就会死去。你夸张吗?深呼吸,放松,并获取一些数据。

于 2012-06-21T11:34:07.507 回答