您好我有一个类,其中包含用于检查数据库值的不同方法。 每个方法都针对一个特定的表,所以每次调用该方法时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会重新生成并且在这里使用准备好的语句是没用的,那么我该怎么做才能提高性能呢?这样做的正确方法应该是什么?
答案 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连接创建一个预准备语句。如果您的连接池或驱动程序缓存预准备语句,如果经常使用此方法,则很有可能获得已准备好的语句。