HQL或SQL使用?带来的好处:减少SQL解析时间、降低内存开销、防止SQL注入

java原始的JDBC规范,提供了预编译SQL语句PreparedStatement,使用该类和占位符(?)可以提高SQL语句的执行效率,这也是java数据库开发中推荐的做法。典型使用如下:

Connection conn = this.getconnection();  
string strsql = "select emp_id from employee where emp_id = ?";  
Preparedstatement pstmt = conn.preparestatement(strsql);  
pstmt.setstring(1,"1000");  
resultset rs = pstmt.executequery(); 

最近我们项目在做降内存的工作,通过使用Memory Analyzer tool(MAT)分析heap dump,发现org.hibernate.impl.SessionFactoryImpl占用了大量的内存。这一块儿我也不懂,这里接附上同事分析的结论。

1、打开SessionFactoryImpl可以看到,里面主要是SoftLimitMRUCache,里面存放的是以HQLQueryPlanKey对象为key值、以HQLQueryPlan对象为value的系统HQL的解析计划缓存。平均每个占用40~45k内存,总共超过6694个,这占用了大量的内存。

2、SoftLimitMRUCache采用的是软连接,软连接在虚拟机内存使用率高的时候,会被GC掉,所以虽然占用300M,但不会造成系统内存溢出异常。不过由于这块缓存的存在,会使系统内存更快消耗完,导致系统频繁GC,影响系统运行效率。

3、通过分析SoftLimitMRUCache可以知道,它是以查询的HQL为key值的Map结构。通过编写OQL进行查询,可以统计出内存中主要缓存了哪些HQL


通过分析执行的hql语句可以得出 以下结果:

A、同一条HQL,由于拼接参数的原因,导致Hibernate认为它们并不相同,而为每一个参数缓存一个数据。
B、采用“?”占位符的HQL,只会缓存一个数据。

同时,以此可以推测,除了Hibernate,Oracle数据库也会对SQL语句的解析计划进行缓存,消耗数据库的内存。


以前都我们熟知使用“?”表达式的好处可以减少数据库解析SQL的时间,提高SQL执行效率。然而我们却忽略了,这样做还可以减少数据库和HQL缓存SQL解析计划而使用的内存。所以建议DAO层的代码,都使用预编译语句,降低内存消耗,同时也提高查询效率。


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值