- 浏览: 254649 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (232)
- 瞎扯两句 (8)
- 操作系统 (5)
- 工作笔记 (33)
- 设计模式 (1)
- java (57)
- Java IDE (7)
- hibernate (17)
- oracle (46)
- ms sql (2)
- spring (9)
- struts2 (0)
- javascript (16)
- java_code (2)
- java之集合 (2)
- java之线程 (4)
- java之IO (4)
- java之虚拟机 (6)
- java之异常 (0)
- EJB (4)
- XML (4)
- 数据结构-算法 (2)
- 架构设计 (5)
- 配置信息 (2)
- 阅读笔记 (6)
- IT专业英语 (1)
- PI (0)
- 单元测试 (1)
最新评论
@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;
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;
发表评论
-
oracle sql优化
2013-09-23 14:29 6581.绑定变量 不适用在OLAP系统中。 因为在OLAP中, ... -
阅读笔记 SQL
2013-08-14 18:24 830Start with...Connect By子句递归查询一般 ... -
oracle 锁 分析
2013-06-18 10:57 4791. 分为 tx 和 tm 。 即 行级 和 表级 其中 ... -
Oracle的TX锁(行级锁、事务锁)
2013-06-18 10:04 939问题:如何使用事务? ... -
mysql 时间戳自动更新
2013-04-09 10:24 983-- Table "pnodetail" ... -
阅读笔记
2013-02-07 17:24 431. 在OLTP系统装要注意sql的硬解析,但是在OLA ... -
synonym
2013-02-07 16:58 955建立一个同义词可以排除一个对象名字的限制. 如果你的数据库有多 ... -
oracle schema
2013-02-07 16:50 765A schema is a collection of dat ... -
物化视图的使用分析
2013-02-05 17:27 7861. 在 深入浅出 系列中,作者列举了一个例子来说明。 ... -
Oracle编程艺术阅读笔记-2
2013-01-29 10:40 7771. 位图索引。 不 ... -
Oracle:位图索引与死锁-2
2013-01-28 18:24 836位图索引被存储为压缩的索引值,其中包含了一个范围内的ROWID ... -
Oracle:位图索引与死锁-1
2013-01-28 18:04 869B 树索引更适合索引动态表的 OLTP 环境,而位图索引更适合 ... -
Oracle编程艺术阅读笔记-1
2013-01-24 18:48 8731. 绑定变量。 不使用会产生的影响: 每次运 ... -
JAVA完全控制Oracle中BLOB、CLOB说明
2012-12-28 17:07 852网络上很多关于JAVA对Oracle中BLOB、CLOB类型字 ... -
H2数据库的使用
2012-12-13 18:40 7731.下载h2的jar,例如h2-1.3.170.jar 2.c ... -
JTA
2012-12-05 17:35 976要理解 JTA 的实现原理 ... -
oracle 体系结构
2012-12-03 23:13 721[img][/img] oracle工作原理 ... -
oracle 存储过程实例-4
2012-12-03 23:04 542--错误处理部分。 --自 ... -
oracle 存储过程实例-4
2012-12-03 23:02 846--错误处理部分。 --自定义异常处理 CREATE OR ... -
oracle 存储过程实例-3
2012-12-03 21:42 816PROCEDURE autoissuereturns ( ...
相关推荐
同时,需要注意的是,虽然sqljdbc4-4.0.jar提供了一种便捷的连接方式,但在大型项目中,通常会采用连接池技术,如C3P0、HikariCP或Apache DBCP等,以提高资源利用率并优化性能。 总结,sqljdbc4-4.0.jar是Java开发...
这个版本的驱动引入了多项新特性和性能优化,以提高Java应用与SQL Server之间的交互效率。 JDBC 4.0规范引入了一些新的接口和特性,例如Automatic Java Persistence (JPA)、Java EE 6的支持以及改进的连接池管理。...
2. **异常处理**:确保正确捕获和处理JDBC相关的异常,提供合适的错误信息。 3. **事务管理**:根据业务需求,适当地使用BEGIN、COMMIT和ROLLBACK语句进行事务管理。 4. **预编译的SQL语句**:使用...
odps-jdbc-3.2.9-jar-with...odps-jdbc-3.2.9-jar-with-dependencies.jar 提供了稳定的性能和可靠的连接管理,使开发者可以更轻松地操作阿里云的 MaxCompute 平台,优化数据分析和处理效率,提升大数据应用的开发体验。
3. **设置连接参数**:填写Hive服务器的URL(例如,`jdbc:hive2://hostname:port/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2`),以及认证信息(如用户名和密码)。 4. **测试连接**:点击...
ShardingSphere-JDBC拥有强大的SQL解析引擎,能够解析各种SQL语句,并对其进行优化,使其在分布式环境下的执行效率达到最优。同时,它还支持多数据库方言,使得系统具有良好的兼容性。 6. **易于集成**: 提供的`...
JDBC桥(clickhouse-jdbc-bridge)是连接ClickHouse与Java应用程序的一种工具,通过Java Database Connectivity (JDBC) 接口,使得Java应用能够像操作传统关系型数据库一样操作ClickHouse。 本指南将详细介绍如何在...
2. **hive-jdbc-uber-jar-1.8-2.6.3.zip**:对应于Hive 1.8版本的2.6.3版JDBC驱动。这个版本可能包括对Hive 1.8的一些新特性和改进的支持。 3. **hive-jdbc-uber-jar-1.7-2.6.2.zip**:适用于Hive 1.7版本的2.6.2版...
Hive JDBC Uber 3.1.2是Hive的Java数据库连接器的一个优化版本,它通过将所有必需的依赖项打包到一个单一的jar文件中,极大地减少了在运行时因缺少依赖而产生的问题。这个版本的特性包括对Hive SQL的全面支持,以及...
2. 创建连接:`Connection conn = DriverManager.getConnection("jdbc:sqlserver://服务器地址:端口;databaseName=数据库名", "用户名", "密码");` 3. 执行查询:`Statement stmt = conn.createStatement(); ...
Hive JDBC Uber 2.6.5.0-292驱动是Apache Hive与Java数据库连接(JDBC)之间的桥梁,允许用户通过编程语言(如Java、Python等)或者数据库管理工具(如Dbeaver)与Hive进行交互。这个驱动程序集成了所有必要的依赖,...
2. **DBeaver与Hive JDBC的结合**: DBeaver是一款跨平台、开源的数据库管理工具,支持多种数据库系统,包括Hive。Hive JDBC驱动是DBeaver连接Hive服务器的关键组件,用户可以在DBeaver中配置Hive的JDBC连接,通过...
Connection con = DriverManager.getConnection("jdbc:hive2://localhost:10000/default", "", ""); Statement stmt = con.createStatement(); ResultSet res = stmt.executeQuery("SELECT * FROM my_table"); while...
2. SQLJDBC 4.0:这个版本引入了对Java SE 7的支持,并包含了对SQL Server 2008和更高版本的兼容性。它提供了增强的性能和新的功能,例如支持批量执行SQL语句和改进的错误处理。 3. SQLJDBC 4.1:在这个版本中,...
2. **JDBC (Java Database Connectivity)**: 是Java平台的标准接口,允许Java应用程序与各种类型的数据库进行交互。JDBC提供了统一的API,使得开发者无需关心底层数据库的细节,只需编写标准的JDBC代码即可。 3. **...
2. **建立连接**:使用以下代码创建JDBC连接: ```java Class.forName("ru.yandex.clickhouse.ClickHouseDriver"); Connection conn = DriverManager.getConnection("jdbc:clickhouse://localhost:8123/default",...
MySQL Connector/J 8.0.31版本带来了许多改进和修复,包括兼容性提升、性能优化和安全增强。例如,它支持MySQL 8.0的新特性,如JSON字段处理和窗口函数。在JMeter中,只需将这个jar文件放入`lib`目录,JMeter就能...
X-Pack SQL JDBC 7.4.2版本在性能方面进行了优化。它能够智能地处理大数据量的查询,利用Elasticsearch的分布式特性和索引结构,快速执行复杂的查询操作。此外,它还支持批处理操作,提高了数据导入和更新的效率。 ...
通过对源代码的学习,可以了解到如何优化数据库操作,以及如何更好地处理数据库连接和事务。 六、总结 jdbc-helper-0.3.1作为Google封装的JDBC工具,以其轻量级、易用和高效的特点,成为了Java开发中的一个得力...