java jdbc 缓存_JDBC性能优化篇

本文详细探讨了如何优化Java JDBC的性能,包括缓存ResultSet的metadata以减少昂贵的元数据获取,避免使用null参数,使用'哑元'查询代替getColumns(),选择合适的数据类型,以及有效地获取和处理数据。通过遵循这些最佳实践,可以显著提升Java应用处理数据库的效率。
摘要由CSDN通过智能技术生成

系统性能.

少用Metadata方法

与其它的JDBC方法相比, 由ResultSet对象生成的metadata对象的相对来说是很慢的. 应用程序应该缓存从ResultSet返回的metadata信息,避免多次不必要的执行这个操作.

几乎没有哪一个JDBC应用程序不用到metadata,虽然如此,你仍可以通过少用它们来改善系统性能. 要返回JDBC规范规定的结果集的所有列信息, 一个简单的metadata的方法调用可能会使JDBC驱动程序去执行很复杂的查询甚至多次查询去取得这些数据. 这些细节上的SQL语言的操作是非常消耗性能的.

应用程序应该缓存这些metadata信息. 例如, 程序调用一次getTypeInfo方法后就将这些程序所依赖的结果信息缓存. 而任何程序都不大可能用到这些结果信息中的所有内容,所以这些缓存信息应该是不难维护的.

避免null参数

在metadata的方法中使用null参数或search patterns是很耗时的. 另外, 额外的查询会导致潜在的网络交通的增加. 应尽可能的提供一些non-null的参数给metadata方法.

因为metadata的方法很慢, 应用程序要尽可能有效的调用它们. 许多应用程序只传递少量的non-null参数给这些方法.

Java代码  1240c50e0c44a1aae728430180855964.png

例如:

ResultSet WSrs = WSc.getTables (null, null, "WSTable", null);

应该这样:

ResultSet WSrs = WSc.getTables ("cat1", "johng", "WSTable",  "TABLE");

在第一个getTables()的调用中, 程序可能想知道表'WSTable'是否存在. 当然, JDBC驱动程序会逐个调用它们并且会解译不同的请求. JDBC驱动程序会解译请求为: 返回所有的表, 视图, 系统表, synonyms, 临时表, 或存在于任何数据库类别任何Schema中的任何别名为'WSTable'的对象.

第二个getTables()的调用会得到更正确的程序想知道的内容. JDBC驱动程序会解译这个请求为: 返回当前数据库类别中所有存在于'johng'这个schema中的所有表.

很显然, JDBC驱动程序处理第二个请求比处理第一个请求更有效率一些.

有时, 你所请求信息中的对象有些信息是已知的. 当调用metadata方法时, 程序能传送到驱动程序的的任何有用信息都可以导致性能和可靠性的改善.

使用'哑元'(dummy)查询确定表的特性

要避免使用getColumns()去确定一个表的特性. 而应该使用一个‘哑元’查询来使用getMetadata()方法.

请考虑这样一个程序, 程序中要允许用户选取一些列. 我们是否应该使用getColumns()去返回列信息给用户还是以一个'哑元'查询来调用getMetadata()方法呢?

案例 1: GetColumns 方法

Java代码  1240c50e0c44a1aae728430180855964.png

ResultSet WSrc = WSc.getColumns (... "UnknownTable" ...);

// getColumns()会发出一个查询给数据库系统

. . .

WSrc.next();

string Cname = getString(4);

. . .

// 用户必须从反复从服务器获取N行数据

// N = UnknownTable的列数

案例 2: GetMetadata 方法

Java代码  1240c50e0c44a1aae728430180855964.png

// 准备'哑元'查询

PreparedStatement WSps = WSc.prepareStatement

("SELECT * from UnknownTable WHERE 1 = 0");

// 查询从来没有被执行,只是被预储

ResultSetMetaData W

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值