- 浏览: 114752 次
- 性别:
- 来自: 成都
最新评论
-
sp42:
Oracle 不是很吊的么,怎么连个分页都这么麻烦?
数据库分页大全(oracle利用解析函数row_number高效分页) -
metarnetyflu:
不知道哪里快了!!!over()是最慢的,rownum其次,r ...
数据库分页大全(oracle利用解析函数row_number高效分页) -
wfd0807:
09年发的博文,五年了,一定影响到了不少人。首先,你描述的三层 ...
数据库分页大全(oracle利用解析函数row_number高效分页) -
diyunpeng:
学习了,写的不错。
python urlOpen使用代理 -
qepwqnp:
帖子沉的好深,涝起来
js_自己封装一个可查询frame中对象的一个方法
java 与oracle数据库效率优化
@java 方面
1.使用Statement对象
2.预编译PreparedStatement
3.使用PreparedStatement + 批处理
为了区分出这三者之间的效率,下面的事例执行过程都是在数据库表t1中插入1万条记录,并记录出所需的时间(此时间与电脑硬件有关)
1. 使用 Statement 对象
使用范围:当执行相似SQL(结构相同,具体值不同) 语句的次数比较少
优点:语法简单
缺点 : 采用硬编码 效率低,安全性较差 。
原理:硬编码,每次执行时 相似SQL 都会进行编译
事例执行过程 :
public void exec(Connection conn){
try {
Long beginTime = System.currentTimeMillis();
conn.setAutoCommit(false);// 设置手动提交
Statement st = conn.createStatement();
for(int i=0;i<10000;i++){
String sql="insert into t1(id) values ("+i+")";
st.executeUpdate(sql);
}
Long endTime = System.currentTimeMillis();
System.out.println("Statement 用时 : "+(endTime-beginTime)/1000+" 秒 ");// 计算时间
st.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
执行时间: Statement 用时: 31 秒
2. 预编译 PreparedStatement
使用范围:当执行相似 sql 语句的次数比较多(例如用户登陆,对表频繁操作 .. )语句一样,只是具体的值不一样,被称为动态SQL
优点:语句只编译一次,减少编译次数。提高了安全性(阻止了SQL注入)
缺点 : 执行非相似 SQL 语句 时,速度较慢。
原理:相似SQL只编译一次,减少编译次数
名词解释:
SQL注入:select * from user where username="张三" and password="123" or 1=1 ;
前面这条语句红色部分就是利用sql注入,使得这条词句使终都会返回一条记录,从而降低了安全性。
事例执行过程 :
public void exec2(Connection conn){
try {
Long beginTime = System.currentTimeMillis();
conn.setAutoCommit(false);// 手动提交
PreparedStatement pst = conn.prepareStatement("insert into t1(id) values (?)");
for(int i=0;i<10000;i++){
pst.setInt(1, i);
pst.execute();
}
conn.commit();
Long endTime = System.currentTimeMillis();
System.out.println("Pst 用时 :"+(endTime-beginTime)+" 秒 ");// 计算时间
pst.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
执行时间 : Pst 用时 :14 秒
3. 使用 PreparedStatement + 批处理
使用范围:一次需要更新数据库表多条记录
优点:减少和SQL引擎交互的次数,再次提高效率,相似语句只编译一次,减少编译次数。提高了安全性(阻止了 SQL 注入)
缺点 :
原理:
批处理: 减少和SQL引擎交互的次数,一次传递给SQL引擎多条SQL。
名词解释:
PL/SQL引擎:在oracle中执行pl/sql代码的引擎,在执行中发现标准的sql会交给sql引擎进行处理。
SQL引擎:执行标准sql的引擎。
事例执行过程 :
public void exec3(Connection conn){
try {
conn.setAutoCommit(false);
Long beginTime = System.currentTimeMillis();
PreparedStatement pst = conn.prepareStatement("insert into t1(id) values (?)");
for(int i=1;i<=10000;i++){
pst.setInt(1, i);
pst.addBatch();// 加入批处理 , 进行打包
if(i%1000==0){// 可以设置不同的大小 ; 如 50 , 100 , 500 , 1000 等等
pst.executeBatch();
conn.commit();
pst.clearBatch();
}
}
pst.executeBatch();
Long endTime = System.currentTimeMillis();
System.out.println("pst+batch 用时 : "+(endTime-beginTime)+" 毫秒 ");
pst.close();
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
执行时间 : pst+batch 用时 : 485 毫秒
@ 数据库方面
1 静态SQL
使用范围:
优点:每次执行相似sql 都会进行编译。
缺点 : 效率低,占用破费cpu资源,耗费SGA 资源。
原理: ( 检查 SQL 语句在 SGA 中的共享池中是否存在 , 如果不存在,则编译、解析后执行:硬解析 ,
如果已存在,则取出编译结果执行:软解析 )
事例执行过程 :
DECLARE
time1 NUMBER;
time2 NUMBER;
BEGIN
time1 := dbms_utility.get_time;
EXECUTE IMMEDIATE 'truncate table t_demo';
FOR i IN 1..10000
LOOP
EXECUTE IMMEDIATE
'insert into t_demo(u_id) values('||i||')';
END LOOP;
time2 := dbms_utility.get_time;
dbms_output.put_line((time2-time1)/100||' 秒 ');
END
执行时间: pst+batch 用时: 20.93 秒
2 动态 SQL
使用范围:
优点:语句只编译一次,减少编译次数,提高效率。
缺点 :
原理: 减少编译次数 ( 检查 SQL 语句在 SGA 中的共享池中是否存在 , 如果不存在,则编译、解析后执行:硬解析 ,
如果已存在,则取出编译结果执行:软解析 )
事例执行过程 :
DECLARE
time1 NUMBER;
time2 NUMBER;
BEGIN
time1 := dbms_utility.get_time;
EXECUTE IMMEDIATE 'truncate table t_demo';
FOR i IN 1..10000
LOOP
EXECUTE IMMEDIATE
'insert into t1(u_id) values(:x)' USING i;
END LOOP;
time2 := dbms_utility.get_time;
dbms_output.put_line((time2-time1)/100||' 秒 ');
END;
执行时间: pst+batch 用时: 10.55 秒
3 利用 forall 进行批处理<相似java中的批处理>
使用范围:当执行相似 sql 语句的次数比较多(例如用户登陆,对表频繁操作 .. )FORALL只能运行一条sql语句 。
优点:减少与SQL引擎转替次数,提交效率。
缺点 : 循环时从开始到结束,一次性读完,不能取其中的某些循环进行操作。
原理: 使用 ForAll 语句可以让 PL/SQL 引擎一次将多条 SQL 转发给 SQL 引擎,从而减少转发次数,提高系统性能。
事例执行过程 :
CREATE OR REPLACE PROCEDURE p_test
AS
-- 定义新的类型 ( 不是定义变量! )
TYPE id_table_type IS TABLE OF NUMBER(6) INDEX BY BINARY_INTEGER;
-- 用新的类型来定义变量
id_table id_table_type;
time1 NUMBER;
time2 NUMBER;
BEGIN
FOR i IN 1..10000
LOOP
-- 往两个数组中存放数据
id_table(i) := i;
END LOOP;
-- ★ :一次性向 SQL 引擎传递了多条数据而不是一条
time1 := dbms_utility.get_time;
FORALL i IN 1..id_table.COUNT
INSERT INTO t_demo(u_id) VALUES(id_table(i));
time2 := dbms_utility.get_time;
dbms_output.put_line((time2-time1)*10||' 毫秒 ');
end p_test;
call p_test();
执行时间: pst+batch 用时: 170 毫秒
4 利用 BULK COLLECT
使用范围:处理数据量比较少时。
优点:一次读取多行数据,提高效率。
缺点 : 需要较大的内存开销
原理: 将多个行引入一个或多个集合中。
事例执行过程 :
DECLARE
TYPE books_aat
IS TABLE OF book%ROWTYPE
INDEX BY PLS_INTEGER;
book books_aat;
BEGIN
SELECT *
BULK COLLECT INTO book
FROM books
WHERE title LIKE '%PL/SQL%';
...
END;
发表评论
-
字节顺序大端模式Big Endian
2023-12-22 16:57 1855大端模式和小端模式是描述多字节数据在存储时的字节顺序的两种方 ... -
mediawiki 如何开发特殊页面
2015-04-01 14:56 1084Mediawiki特殊页面开发步骤 1 页面显示名字设 ... -
mediawiki 实现ajax请求及demo
2015-04-01 14:36 962实现方案为使用mediawiki 的api。 1.前台 ... -
mediawiki1.24源码分析(一)
2015-04-01 14:31 0所有分析说明采用文字使用浅红色、小四号楷体。 Index ... -
Mysql ERROR 1040 (00000): Too many connections
2013-09-23 16:38 1653程序添加数据库数据:错误信息: com.mysql. ... -
解决AJAX传输到后台时中文乱码问题
2011-09-14 08:49 1778var urlPaging = "中间信息&qu ... -
Webservices手写客户端调用
2011-08-11 14:08 1297客户端调用 // 实例化IS ... -
python文章采集例子(爬取http://infoq.com)
2011-06-24 23:41 3623写了个采集http://infoq.com资源的小程序,原理: ... -
一键搞定python连接mysql驱动问题(windows版本)
2011-06-21 17:49 2356对于mysql驱动问题折腾了一下午,现共享出解决方案 1:手动 ... -
python爬虫抓站技巧
2011-06-19 20:20 2248本文章部分内容为转载----- 本人学习python中,用得最 ... -
python urlOpen使用代理
2011-06-17 17:42 9763利用urllib包 import urllib prox ... -
TypeError: 'str' object is not callable
2011-06-17 14:25 8517weburl = 'xyz' print " ... -
Eclipse 如何本地进行远程调试
2011-06-16 11:42 2002步骤:(无法上传图片) 1 确保TOMCAT在DEBUG模 ... -
js_自己封装一个可查询frame中对象的一个方法
2011-01-20 16:34 1353说明 用途: 查询当前页面以及所包含的frame中id为传入 ... -
在Eclipse中启动tomcat,并指定启动目录
2011-01-11 16:44 1460我们会有这样的需求:为了工程结构统层次清晰,在开发时不将工程定 ... -
ORACLE VARCHAR 排序问题
2010-06-24 16:31 4035为了实现varchar型的字段序号递增,我每次插入数据要先找出 ... -
SQL 连接 JOIN 例解。(左连接,右连接,全连接,内连接,交叉连接,自连接)
2009-09-09 22:11 1538SQL 连接 JOIN 例解。( ... -
利用properties资源文件追加写入,而不覆盖
2009-08-14 09:11 4900利用properties资源文件追加写入,而不覆盖 Prop ... -
Spring+AspectJ采用注释做申明式事务(手工山寨版)
2009-06-07 10:56 1063建立表 DROP TABLE t_book; CRE ... -
数据库分页大全(oracle利用解析函数row_number高效分页)
2009-05-24 16:50 15195数据库分页大全(oracle利用解析函数row_number高 ...
相关推荐
然而,在使用Spark与数据库交互时,尤其是使用JDBC(Java Database Connectivity)读取数据时,如果不优化并发度,很容易造成性能瓶颈。特别是在面对大规模数据集时,单线程任务过重会导致任务执行缓慢甚至挂起,...
标题“优化JDBC方法攻略”和描述中提到的是关于JDBC(Java Database Connectivity)数据库操作的性能优化,适合初学者和教学使用。本文将详细介绍三个主要的JDBC性能优化技巧,并提供了一些通用的准则,以帮助开发者...
在IT行业中,数据库连接管理是应用系统性能优化的关键环节之一,而JDBC连接池就是解决这一问题的有效工具。本文将详细讲解JDBC连接池的工作原理、配置方法以及如何通过优化来提升连接速度。 JDBC(Java Database ...
本文将详细介绍在Weblogic 9/10版本中针对JDBC优化的相关知识和技术要点,包括配置参数的选择、优化方法以及监控策略等。 #### 二、Weblogic中的JDBC配置与优化 ##### 1. 配置文件概述 在Weblogic中,主要涉及三种...
### JDBC访问数据库的优化策略详解 #### 一、引言 在现代企业级Java应用中,数据库访问扮演着至关重要的角色。数据库不仅是数据资源的中心,还是支撑前端应用高效运行的关键。通过Java Database Connectivity...
标题中的“优化JDBC性能的三大技巧”是指在开发基于Java的JDBC应用程序时,为了提升性能而采取的关键策略。这些技巧主要集中在正确使用数据库MetaData方法、只获取必要的数据以及选择最佳性能的功能,并且有效管理...
9. **性能优化**:JDBC提供了多种优化技巧,如关闭不再需要的资源(如结果集、Statement和连接),使用连接池来重用连接,以及合理使用`PreparedStatement`避免SQL注入。 10. **JDBC API的扩展**:随着技术的发展,...
本篇将深入探讨如何将Spring与JDBC进行整合,并提供原创代码实例。 1. **Spring JDBC概述** Spring JDBC为开发者提供了抽象层,可以避免直接使用传统的JDBC API,减少代码量,提高可读性和可维护性。它包含了模板...
在优化数据库连接方面,JDBC扮演着至关重要的角色,尤其是在处理大量并发请求和移动设备的场景中。 数据库连接的管理是性能优化的关键。通常,频繁地创建和关闭数据库连接会消耗大量的系统资源,导致性能下降。为了...
SQLJDBC4是后续的升级版本,主要针对JDBC API 4.0规范进行了优化,增加了对Java 7的支持,包括新的JDBC功能,如批注、行集和结果集保存点等。此外,它还提高了性能和稳定性,增强了安全性,并提供了更多的数据库...
在实际开发中,为了调试和性能优化,JDBC提供了日志和监控功能。开发者可以通过设置系统属性或使用Connection的setLogWriter方法来开启日志输出,以追踪SQL语句的执行情况。 总之,Microsoft SQL Server JDBC ...
而到了JDBC14(Java SE 14),尽管没有显著的版本号变化,但Java SE 14作为Java的一个重要版本,可能包含一些对JDBC接口的微调和性能优化。不过,具体的JDBC14版本信息可能需要查阅官方文档或相关发布说明来获取详细...
打包上传,包括源代码实现,需求文档,设计文档,数据库实现,系统总结,基于C/S 架构,.该系统对学生进行管理,包含有学生的基本信息(包括学号、所选专业、入学时间姓名、年龄、性别、籍贯、民族、身份证号、联系...
sqljdbc41.jar提供了诸如自动重连、性能优化和更好的Unicode支持等功能,确保了与SQL Server的高效稳定连接。 接着,sqljdbc42.jar则是为JRE 8准备的,它符合JDBC 4.1和4.2规范。这些规范是Java SE 8及更高版本的一...
hive-jdbc
JDBC 解析JDBC中文API各种数据库之间的链接问题,网络编程
不同版本的驱动可能会包含对新特性的支持、性能优化或者修复已知问题。在选择使用哪个版本时,应考虑兼容性、性能需求以及当前Java环境。 总的来说,sqljdbc.jar和sqljdbc4.jar是Java开发者连接Microsoft SQL ...
要优化JDBC性能,可以考虑预编译SQL语句(使用`PreparedStatement`)、批量操作(使用`addBatch()`和`executeBatch()`)、使用最新的JDBC驱动,以及合理设置连接池参数。 以上就是关于"sql server2000 jdbc"的相关...
标题中的"sqljdbc4.jar, sqljdbc41.jar, sqljdbc42.jar"是指Microsoft SQL Server为Java应用程序提供的Java Database Connectivity (JDBC)驱动程序。这些JAR文件是数据库连接的关键,允许Java代码与SQL Server进行...