在这个项目中,由于一些原因没有使用orm进行数据库操作,而是使用Spring的JdbcTemplate
但在上线后发现效率很低,通过性能监视器发现SQL Compilations的比率很高,程序中大量使用动态拼SQL语句的情况
于是进行了一些性能测试
代码如下:
Main.log("SQL四种执行方式性能比较");
// Statement
jt.execute("dbcc freeproccache");
start = System.currentTimeMillis();
sql = "select top {0} id, intStatus from tblInfo where charCityFrom=''{1}''";
for (int i = citys.size() -1; i >= 0; i--) {
Map c = citys.get(i);
String city = (String) c.get("charCityFrom");
jt.queryForList(MessageFormat.format(sql, i % 20 + 1, city));
}
map = jt.queryForMap("Select Count(*) CNT,sum(size_in_bytes) TotalSize From sys.dm_exec_cached_plans");
Main.log("Statement:CNT=" + map.get("CNT") + " TotalSize=" + map.get("TotalSize"), start);
// PreparedStatement
jt.execute("dbcc freeproccache");
start = System.currentTimeMillis();
sql = "select top {0} id, intStatus from tblInfo where charCityFrom=?";
for (int i = citys.size() -1; i >= 0; i--) {
Map c = citys.get(i);
String city = (String) c.get("charCityFrom");
jt.queryForList(MessageFormat.format(sql, i % 20 + 1), new Object[]{city});
}
map = jt.queryForMap("Select Count(*) CNT,sum(size_in_bytes) TotalSize From sys.dm_exec_cached_plans");
Main.log("PreparedStatement:CNT=" + map.get("CNT") + " TotalSize=" + map.get("TotalSize"), start);
// EXEC sp_executesql
jt.execute("dbcc freeproccache");
start = System.currentTimeMillis();
sql = "EXEC sp_executesql N''select top {0} id, intStatus from tblInfo where charCityFrom=@cityFrom'', N''@cityFrom nvarchar(10)'', ''{1}''";
for (int i = citys.size() -1; i >= 0; i--) {
Map c = citys.get(i);
String city = (String) c.get("charCityFrom");
jt.queryForList(MessageFormat.format(sql, i % 20 + 1, city));
}
map = jt.queryForMap("Select Count(*) CNT,sum(size_in_bytes) TotalSize From sys.dm_exec_cached_plans");
Main.log("Sp_executesql:CNT=" + map.get("CNT") + " TotalSize=" + map.get("TotalSize"), start);
// 存储过程
jt.execute("dbcc freeproccache");
start = System.currentTimeMillis();
sql = "exec sp_FindInfoByCitFrom {0},''{1}''";
for (int i = citys.size() -1; i >= 0; i--) {
Map c = citys.get(i);
String city = (String) c.get("charCityFrom");
jt.queryForList(MessageFormat.format(sql, i % 20 + 1, city));
}
map = jt.queryForMap("Select Count(*) CNT,sum(size_in_bytes) TotalSize From sys.dm_exec_cached_plans");
Main.log("Procedure:CNT=" + map.get("CNT") + " TotalSize=" + map.get("TotalSize"), start);
得到结果(多次执行,结果相关不大):
2008-11-05 10:36:52.521 [main] - SQL四种执行方式性能比较
2008-11-05 10:36:53.365 [main] - Statement:CNT=224 TotalSize=9134080 t=829ms
2008-11-05 10:36:53.815 [main] - PreparedStatement:CNT=23 TotalSize=901120 t=450ms
2008-11-05 10:36:55.44 [main] - Sp_executesql:CNT=26 TotalSize=1351680 t=1625ms
2008-11-05 10:36:55.864 [main] - Procedure:CNT=25 TotalSize=933888 t=424ms
存储过程虽然性能最高,但维护确实有点麻烦
综合一下就我们的情况使用PreparedStatement最好,不过以前使用sql server 2000时有发现这个性能不好,看来跟生产环境还是有挺大关系
Sp_executesql的表现倒是出乎意料
经验主意害死人啊,就这个问题浪费了大量的时间
分享到:
相关推荐
本文将详细介绍如何利用Java进行批量SQL执行,包括其背景、实现原理、代码示例及优化策略等。 #### 一、批量执行SQL的背景与意义 在日常的业务场景中,如用户注册、数据迁移或系统初始化等,往往涉及到大量的数据...
标题中的"java控制台输出可执行sql"指出这是一个Java库,它的主要功能是能够在控制台上显示应用程序执行的SQL语句。这通常对于调试和优化数据库交互的代码非常有用,因为可以直观地看到程序如何与数据库进行通信。这...
在Java编程中,读取数据库表中的内容并将其转换为SQL文件,然后解析并执行这个文件,是一项常见的数据处理任务。这项操作可能涉及到数据库连接、数据查询、文件操作以及SQL语句的构建与执行。以下将详细介绍这个过程...
在Java编程中,注解(Annotation)是一种元数据,它提供了在代码中附加信息的方式,这些信息可以被编译器或运行时环境用来执行特定的任务。"Java使用注解拼接SQL语句"是一个常见的实践,它使得动态构建SQL查询变得...
在集成这个Java SQL生成器到你的项目中,你需要按照文档的指示配置数据库连接,然后在需要的地方调用相应的API来生成SQL语句。通过这种方式,你可以专注于业务逻辑,而不是繁琐的SQL拼写,提高开发效率并降低出错...
3. **SQL执行计划解析**:SQL语句的执行计划是理解其运行方式的关键。Oracle提供了多种工具来分析SQL执行计划,包括EXPLAIN PLAN和AUTOTRACE。通过这些工具,可以详细查看SQL语句如何访问表和索引,以及执行过程中...
总结来说,`java-连接SQL测试`程序演示了如何在Java中利用JDBC API与SQL Server进行交互,包括加载驱动、建立连接、执行SQL和关闭连接等基本操作,是学习Java数据库编程的重要实践案例。通过深入理解并实践这些步骤...
4. 测试调试:对系统进行全面的功能和性能测试,修复问题。 5. 部署上线:在服务器上部署系统,进行实际运营。 综上所述,Java超市管理系统与SQL Server的结合,实现了高效、稳定的超市业务管理,为超市运营提供了...
在Java编程中,SQL语句的执行是通过JDBC(Java Database Connectivity)接口来实现的。JDBC提供了一种标准的API,使得Java程序能够与各种数据库进行交互,包括插入、查询、更新和删除数据等操作。这篇博客“java代码...
Java 登录界面与SQL数据库的连接是Web应用开发中常见的需求,主要涉及到以下几个关键技术点: 1. **Java Swing或JavaFX**: 这是构建登录界面的工具。Java Swing是Java AWT(Abstract Window Toolkit)的扩展,提供...
系统上线前需要进行全面的测试,包括单元测试、集成测试、性能测试和安全性测试,确保所有功能正常且性能达标。上线后,定期的维护和更新也是必不可少的,以应对新的需求和安全威胁。 总的来说,这个网上银行系统...
2. **Microsoft JDBC Driver**: Microsoft提供了针对SQL Server的JDBC驱动,这些驱动程序符合Java Community Process (JCP) 规范,提供了一种标准的方式来连接Java应用程序和SQL Server数据库。在本压缩包中,包含的...
11. **测试与调试**:在完成转换后,进行全面的功能测试和性能测试,确保应用在Oracle环境中运行无误。 12. **文档更新**:更新所有与数据库相关的文档,包括数据库设计、SQL脚本、配置文件等,确保团队成员都能...
在Java编程环境中,读取数据库表并将其转换为SQL文件是一项常见的任务,特别是在数据迁移、备份或测试场景中。下面将详细介绍如何实现这个过程,并基于给出的标题和描述进行讲解。 1. **配置文件读取**: 首先,...
10. **软件测试**:为了确保系统的功能正确无误,需要进行各种测试,包括单元测试、集成测试和系统测试,以检测潜在的bug和性能问题。 以上就是关于"Java SQL 课程设计 通信管理系统"所涉及的关键技术点,每个点都...
在IT行业中,Java SQL是Java编程语言与关系型数据库交互的核心技术。这篇博客"java sql"可能探讨了如何在Java应用程序中使用SQL语句来管理数据库。SQL(Structured Query Language)是用于创建、查询、更新和管理...
JAVA性能测试工具是IT行业中用于评估和优化JAVA应用程序性能的关键组件。这些工具旨在模拟真实世界的负载情况,帮助开发者识别和解决性能瓶颈,确保应用程序在高负载下仍能保持稳定和高效运行。以下是对几种主要JAVA...
4. 测试与优化:进行功能测试,确保所有操作都能正确执行,同时优化性能,提升用户体验。 5. 部署与维护:将系统部署到服务器上,进行实际运行,并定期进行维护和更新,以适应业务变化。 四、总结 一个简单的Java...
【Java项目应用中自定义SQL在iBatis框架中的使用】 在Java开发中,使用Spring+iBatis框架,经常会遇到标准的SQL映射方法无法满足特定业务需求的情况。此时,就需要自定义SQL来实现功能扩展。本文将详细介绍如何在...
Java,作为一种广泛使用的面向对象的编程语言,以其跨平台的特性、丰富的库支持以及强大的性能,常被用于开发各种类型的软件,包括Web应用、桌面应用以及后端服务。SQL(Structured Query Language)则是用于管理和...