JDBC获取ResultSet的MetaData

数据库为sqlserver, driver是jtds。

需要判断某个字段是否在某个表中存在,一般做法:

1. 查询出0条或多条记录,即一个ResultSet。如,ResultSet rs。

2. 即可以获取到MetaData对象: ResultSetMetaData metaData = rs.getMetaData();

3. ResultSetMetaData对象里包含所有字段信息,逐个判断就可以了。

例:http://msdn.microsoft.com/en-us/library/ms378557.aspx

 

关键在于:

使用的SQL语句, SELECT TOP 10 * FROM Person.Contact,查出了10条记录。如果只是需要获取MetaData,获取出记录就是多余的。

把SQL改成: SELECT * FROM Person.Contact where 1=2。这个语句没有查出任何记录,只获取MetaData。

这样看上去似乎完美了。 

 

但是 SELECT * FROM Person.Contact where 1=2 运行效率在这个表有大量记录的时候是不高的,因为进行了全表扫描。

以下是SQL Manager 2011 for SQL Server的分析结果:

JDBC get metadata

由此可见,如果这个表的记录数量级很大的话,执行这条语句的成本是不低的。

 

可选方案:

1. 避免使用 where 1=2 这样的条件。同事说,现在资深的DBA对这样的语句极为反感,估计是高成本和看不出用意有关。

2. 尽量使用有索引的字段。比如可以利用ID一般不会小于0这个特性,where id < 0 来过虑掉所有记录。不过这要根据不同的表结构来写SQL语句。

3. 我现在碰到的表没有主键,没有索引。。只有使用where  1=2 这个条件。

 

在网上搜了一把,也还没有搜到其他高效的方法。

2012-05-23 ,现在找到了新的方法,用DatabaseMetaData:JDBC获取ResultSet的MetaData 2 

转载于:https://www.cnblogs.com/lyhtbc/archive/2012/03/15/jdbc_get_metadata.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值