无意中发现P6SpyDriver的一个疑似BUG。当SQL查询语句返回的列,列名存在重复的情况时,ResultSet.getString()获取列的值时,同名列排在后面的列值均会被该同名列的顺序为第一的列的值所覆盖。
1。数据库驱动为:
<driver-class>com.p6spy.engine.spy.P6SpyDriver</driver-class>
测试代码如下:
String sql="select a.idcard,b.idcard,a.name,b.name from a,b where a.id = b.id";
Statement stmt = null;
ResultSet rs = null;
Connection con = null;
try {
con = getConnection();
stmt = con.createStatement();
rs = stmt.executeQuery(sql);
while (rs.next()) {
int index =1;
System.out.print(rs.getString(index++)+"---");
System.out.print(rs.getString(index++)+"---");
System.out.print(rs.getString(index++)+"---");
System.out.print(rs.getString(index++));
}
}catch (SQLException e) {
e.printStackTrace();
} finally {
dbClear(con, stmt, rs);
}
a、b两表的结构和数据此处限于篇幅不在贴出。
数据库里真实数据中,a.idcard与b.idcard,以及a.name和b.name是不同的。
测试结果打印出来的记录显示:
rs.getString(2)的实际打印出来的值与rs.getString(1)相同,4与3相同,
即同名列的值,在通过下标循环取列的值时,同名列处于sql语句后面位置的列总会被该同名列处于第一位置的列的值覆盖。
通过列名取值呢,因为存在同名,肯定是取不到完全正确的数据的。
2。 当我把数据库驱动改为传统的OracleDriver后,在通过下标循环取列的值时,一切正常,所有数据正确无误。通过列名取值,因为存在同名,依然是取不到完全正确的数据的。
数据库驱动:
<driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
测试代码未变。
测试结果为:
即使列名相同,通过下标获取各同名列的值,依然为该列在数据库的实际值。
通过上面的对比测试发现,P6SpyDriver在封装OracleDriver时,处理数据这一部分确实存在差异,而不单单是为我们提供了SQL语句的打印功能。在ResultSet组装数据时,其策略与OracleDriver是不同的。
当然了,有人会说在sql里为同名列加上别名会死啊,这的确是我们平时写SQL应该注意的一个基础性方法。
但我关注的重点是P6SpyDriver在封装OracleDriver后,给我们提供了额外的有用的功能的同时,在ResultSet里对同名列的值的组装策略值得商榷。
分享到:
相关推荐
P6Spy 是一个开源的数据库监控工具,它能够记录并分析应用程序与数据库之间的所有SQL交互。对于开发者而言,P6Spy 是一个强大的调试和性能分析工具,尤其在使用MyBatis或Hibernate等ORM框架时,能够帮助我们更好地...
P6Spy 是一个开源的 Java 库,它专为监控和分析数据库应用的 SQL 活动而设计。它通过代理 JDBC 驱动,使得在不修改应用程序代码的情况下,能够捕获并记录执行的所有 SQL 语句。这对于性能调试、审计和诊断非常有用。...
注释了一行代码,去除了resalutset结果集,不知道是否符合你们
在这种情况下,P6Spy是一个非常有用的工具。P6Spy是一个开源的JDBC代理库,它允许我们监控并记录应用通过JDBC执行的所有数据库操作,包括那些由Hibernate生成的SQL语句。它不仅可以提供完整的SQL语句,还能够提供...
在分布式系统中,多数据源事务处理是一个复杂而关键的问题,因为不同的数据源可能分布在不同的服务器上,这就需要一种能够协调这些数据源的事务管理机制。"多数据源事务之解决方案jta+atomikos"这个主题正是针对这一...
**P6Spy** 是一个开源的Java库,用于监控和日志记录应用程序与数据库之间的所有交互。它通过拦截和包裹JDBC驱动程序来实现这一功能,使得开发人员和DBA可以详细跟踪SQL查询,这对于性能优化、问题排查以及理解应用...
在`driver`元素内,添加一个新的`driver-class-name`,指向P6Spy的代理驱动,例如`com.p6spy.engine.spy.P6SpyDriver`。同时,确保你的`url`属性使用P6Spy的特殊格式,例如`jdbc:p6spy:mysql://localhost:3306/mydb?...
P6Spy的核心组件是`spy.jar`,它提供了一个代理驱动,能够拦截并记录所有的JDBC数据库调用。 - 下载P6Spy并解压。 - 将`spy.jar`添加到WebLogic服务器的`lib`目录或者应用的`WEB-INF/lib`目录下。 ### 2. 配置...
P6Spy 是一个开源的数据库监视工具,它允许开发者在不修改应用程序代码的情况下,对数据库访问进行监听、记录和分析。P6Spy 的3.7.0版本为开发者提供了更强大的功能和改进,使得数据库性能调优变得更加便捷。 ### ...
P6Spy是一个开源的应用程序,它允许开发者在Java应用程序中监控和记录对数据库的SQL调用。这对于数据库查询的性能分析和调试非常有用。P6Spy提供了一种方法来拦截对数据库的调用,而无需修改任何代码,仅需通过配置...
P6Spy 是一个开源的数据库监控工具,它主要用于记录和分析应用程序与数据库之间的交互。这个工具对于开发者和DBA来说非常有用,因为它可以提供详细的SQL执行日志,帮助诊断性能问题,进行SQL优化,以及进行其他与...
其中,Druid是一个高性能的Java数据库连接池组件,通常用于与P6Spy一起使用来增强应用程序的数据库连接管理能力。 ##### 3. 自定义SQL输出格式 除了默认的日志输出格式外,P6Spy还允许用户自定义SQL输出格式。这...
3. **配置日志**:P6Spy使用自己的日志框架,所以我们需要在应用目录下创建一个名为`spy.properties`的配置文件,定义日志输出的格式和位置。例如: ``` logFile=/var/log/app/p6spy.log logLevel=DEBUG append=...
P6Spy 是一个开源的数据库监视工具,它通过拦截 JDBC 调用来获取数据库操作的详细信息。这个工具在不修改应用程序代码的情况下,可以帮助开发者和DBA监控数据库访问行为,包括SQL语句的执行时间、性能分析以及日志...
p6spy 是一个开源的 Java 框架,它的主要功能是在不修改代码的情况下,监控和记录 Java 应用程序中执行的所有 SQL 语句。这个工具对于开发者来说非常有用,因为它可以帮助定位性能瓶颈,特别是在使用 ORM(对象关系...
P6Spy 是一个非常实用的开源工具,主要用于监控和分析数据库的SQL执行情况。在Java应用开发中,它能够帮助开发者深入了解数据库的性能瓶颈,提供详细的SQL日志,从而优化数据库操作,提升应用程序的性能。下面将详细...
3、修改 原有 JDBC Driver为:com.p6spy.engine.spy.P6SpyDriver其它的都不用更改。 4、修改 spy.properties 中的 realdriver 值为 原有 的JDBC Driver,比如我的是:com.mysql.jdbc.Driver 5、注意要先运行 java -...
《IronTrackSQL数据库操作监控完全配置手册》 在IT领域,数据库管理是至关重要的,而监控数据库操作则是确保数据安全和系统稳定...因此,对于任何涉及大量数据库操作的项目,IronTrackSQL都是一个值得考虑的强大工具。