打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Oracle JDBC中的语句缓存

在Oracle数据库中,SQL解析有几种:

  • 硬解析:过多的硬解析在系统中产生shared pool latch和library cache liatch争用,消耗过多的shared pool,使得系统不具有可伸缩性。

  • 软解析:过多的软解析仍然可能会导致系统问题,特别是如果有少量的SQL高并发地进行软解析,会产生library cache latch或者是share方式的mutex争用。

  • 软软解析:其实这也也属于软解析,与普通的软解析不同的是,软软解析的SQL会在会话的cached cursor中命中。

  • 一次解析,多次执行:这是解析次数最少的方式,也是系统最具有可扩展性的方式。

那么在JAVA开发的应用中,怎么样才能实现上述第4种方式?

如果是循环处理某种数据,这个比较容易实现。其实对于不是这种情况,Oracle也提供了很好的方式来实现这一点。下面是一个例子(例子代码文件为TestStmtCache.java)。


编译上述代码文件TestStmtCache.java,并运行:

在数据库中进行查询:

可以看到,这两条SQL语句,都执行了200次,但是标记为"nocache_test1"的SQL没有进行语句缓存,其parse calls为200次,即解析了200次,其中一次是硬解析。而标记为"cache_test1"的SQL语句,使用了语句缓存,但是parse calls只有1次,即只有一次硬解析,执行了200次。

这里关键的代码在于:

((OracleConnection)conn).setStatementCacheSize(20);  

((OracleConnection)conn).setImplicitCachingEnabled(true); 

上述第一行代码设置语句缓存大小,当然20比较偏小,对于比较大型的系统来说,设到200-300比较合适,不过这会耗用一定数量的JAVA内存。这个数值表示一个连接能够缓存多少语句。第二行代码是设置隐式打开语句缓存,也即自动会对PreparedStatement的SQL语句进行缓存。

那么,上述的方式无疑是比较简单的,但是这种方式有一个问题就是,缓存的利用效率可能不高,因为JAVA会将不常用的SQL语句也进行了缓存。Oracle的JDBC驱动也提供了一种手工控制的方式。


将测试代码中的第22行替换为:

((OracleConnection)conn).setExplicitCachingEnabled(true);  

第40行替换为:

pstmt = ((OracleConnection)conn).getStatementWithKey ("cache_test1");  

if (pstmt==null)  

这样通过手工编码的方式控制哪些语句需要缓存,哪些不需要。

关于语句缓存(Statement Caching)可以参考Oracle在线文档::http://docs.oracle.com/cd/E11882_01/java.112/e10589/stmtcach.htm#i1072607。

加入"云和恩墨大讲堂"微信群,参与讨论学习

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
mybatis如何从接口映射到xml?
JAVA連接ORACLE數據庫
Java调用存储过程
欢迎光临 - 琳婕小筑-老猫的理想 - 通过JDBC操作ORACLE数据库实例详解 -
Java开源数据库管理工具分类列表
Eclipse是如何连接Oracle数据库的
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服