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在线文档:Statement and Result Set Caching:http://docs.oracle.com/cd/E11882_01/java.112/e10589/stmtcach.htm#i1072607。

原文发布于微信公众号 - 数据和云(OraNews)

原文发表时间:2017-05-16

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏iMySQL的专栏

MySQL FAQ 系列 : 如何安全地关闭 MySQL 实例

本文分析了 mysqld 进程关闭的过程,以及如何安全、缓和地关闭 MySQL 实例,对这个过程不甚清楚的同学可以参考下。

2340
来自专栏程序猿

MySQL的匿名账户安全

在windows中MySql以服务形式存在,在使用前应确保此服务已经启动,未启动可用net start mysql命令启动。而Linux中启动时...

3637
来自专栏软件工程师成长笔记

centOS7安装MySQL流程介绍

1、隐藏密码 如:MySQL 连接远程数据库(192.168.5.116),端口“3306”,用户名为“root”,密码“123456”(这是我乱写的地址哈)...

1652
来自专栏kl的专栏

solr初探-安装使用

Solr是一个高性能,基于Lucene的全文搜索服务器。同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展并对查询性能进行了优...

4259
来自专栏架构技术

Solr7使用Oracle数据源导入+中文分词

安装目录假设为#solr_home,本文的#solr_home为apps/svr/solr

882
来自专栏云计算教程系列

如何在Ubuntu 16.04上安装和配置Zabbix以安全地监视远程服务器

Zabbix是用于web和应用程序的开源监控软件。它提供对从服务器,虚拟机和任何其他类型的网络设备收集的数千个指标的实时监控。这些指标可帮助确定IT基础架构的当...

1533
来自专栏性能与架构

MYSQL影响性能的主要参数

公共参数 max_connections = 151 #同时处理最大连接数,推荐设置最大连接数是上限连接数的80%左右 sort_buffer_size = 2...

3195
来自专栏吴伟祥

分布式锁的几种实现方式~ 转

目前几乎很多大型网站及应用都是分布式部署的,分布式场景中的数据一致性问题一直是一个比较重要的话题。分布式的CAP理论告诉我们“任何一个分布式系统都无法同时满足一...

2541
来自专栏王亚昌的专栏

coreseek实现中文检索服务

文章一,原地址为:http://zhan.renren.com/itbegin?gid=3602888498033481671&checked=true

883
来自专栏小特工作室

Navi.Soft31.代码生成器(含下载地址)

1系统简介 1.1功能简述 在Net软件开发过程中,大部分时间都是在编写代码,并且都是重复和冗杂的代码.比如:要实现在数据库中10个表的增删改查功能,大部分代码...

1878

扫码关注云+社区