JDBC_02

来源:互联网 发布:windows优化软件知乎 编辑:程序博客网 时间:2024/05/29 04:08

1  批处理

1.1 批处理概述

1.1.1   批处理概述

在开发,如果有大量的sql需要发送到数据库执行,如果一条一条发送,有多少条就需要发送多少次,效率低下。

这里我们可以采用批处理技术,将多条sql添加到批中,再一次性将批发送给数据库,数据库收到后打开批,依次执行其中的SQL语句,这样可以减少发送sql语句的次数,从而提高程序执行的效率。

实现批处理的方式一共有两种,分别可以使用Statement和PreparedStatement实现批处理。

1.2 实现批处理

1.2.1   Statament实现批处理

1.2.2   PreparedStatment实现批处理

 

1.2.3   两种实现方式的优缺点

Ø  Statement实现批处理的优点:

(1)可以在一次批处理中包含结构不同的sql语句

Ø  Statement实现批处理的缺点:

(1)   无法防止sql注入攻击

(2)   没有预编译机制,效率低下

(3)   如果每次发送的sql语句骨架相同(仅参数不同),则sql语句的骨架每次都需要编写

 

 

Ø  PreparedStatement实现批处理的优点:

(1)   可以防止sql注入攻击

(2)   有预编译机制,效率高

(3)   如果每次发送的sql骨架相同,sql语句的骨架只需要写一次即可!

 

Ø  PreparedStatement实现批处理的缺点:

(1)   在同一个批处理中,只能包含结构相同的SQL语句

2  数据库连接池

2.1 数据库连接池

2.1.1   什么是连接池?

在开发中,所谓的池就是一个容器,来存储程序的中的数据.

而数据库连接池就是用来存储数据库连接的池子,用于在整个程序中共享连接,减少连接开关的次数,实现连接的复用,从而提高程序执行的效率.

2.1.2   为什么要使用数据库连接池?

对于数据库来说,频繁的开关连接会非常的耗费资源,也会导致程序执行效率的低下. 我们可以在程序中创建一个池子,在程序启动时就初始化一批连接放在连接池中,当用户需要链接时,就直接从池子中拿一个连接使用,当用完连接后,也不要将连接关闭,而是将连接还回池中,下一个用户需要连接时也是如此,这样可以减少链接开关的次数,从而提供程序执行的效率.

2.1.3   如何自己实现一个数据库连接池?

SUN公司为实现连接池提供了一个接口 – javax.sql.DataSource,要求所有的连接池都要实现这个接口,因此连接池也叫做数据源.

 

   实现数据库连接池的步骤

(1)   写一个类,实现 DataSource 接口

(2)   在实现类中,创建一个容器(LinkedList),当作连接池使用

(3)   在静态代码块中,初始化一批连接放在连接池中

(4)   实现 getConnection 方法,方便获取连接

 

(5)   添加自定义方法 returnConn,用于将连接还回连接池中

(6)   写测试类测试自定义连接池

2.2 Connection中close方法的改造

2.2.1   需求描述

在上面的测试程序中,最后连接用完之后,一定要还回连接池中,而不是通过close方法将连接关闭。而这样违反了人们的习惯。下面我们可以对 close方法进行改造,改造为底层是还连接而不是关连接。

对一个方法进行改造,我们可以讨论这两种方式,继承和装饰者模式。

需求:

创建Phone接口和Iphone类,让Iphone类实现Phone接口,并添加两个方法 call方法和message方法。

通过继承和装饰者模式对call方法进行改造,改造为听彩铃而不是打电话。

2.2.2   继承

继承对方法的改造:写一个类,继承改造方法所属的类,在子类中重写父类中的方法实现对方法的改造。

 

继承这种方式只能对子类及子类对象中的方法进行改造,却无法改造父类对象中的方法。也就是说,继承不能对已有的对象中的方法进行改造。

2.2.3   装饰者模式

装饰(Decorator)者模式也叫做包装者模式,是通过对已有对象进行包装来扩展对象功能的一种模式。是继承方式的一种替换方案。

如果需要对已有对象上的方法进行改造, 可以定义一个装饰类. 装饰类通常会提供构造函数将被装饰者传入, 并保存在类的内部, 基于已有对象上的功能, 添加更强的功能

 

Ø  实现装饰者模式的步骤

a)  写一个装饰类, 要求装饰类(RingIphoneDecorate)和被装饰者所属的类(iphone)实现同一个接口(Phone)或者继承同一个父类。

b)  装饰类必须提供构造方法接收被装饰者, 并将被装饰者保存在类的内部

c)  对于想要改造的方法直接进行改造, 对于不想改造的方法, 直接调用原有对象(被装设者)上的方法。

 

2.2.4   利用装饰者模式改造close方法

1、 写一个类 ConnectionDecorate类,和被装饰者(Connection对象)所属的类(com.mysql.jdbc.Connection)实现相同的父接口(java.sql.Connection)。

 

2、 提供构造方法将被装饰者传入,并保存在类的内部。

3、 对于想要改造的方法直接进行改造,对于不想改造的方法直接调用原有对象上的方法。

这里需要在构造函数中添加一个MyPool参数,将自定义连接池对象保存在类的内部。

改造close方法

 

对于其他不想改造的方法

 

2.3 开源数据库连接池-C3P0

2.3.1   使用C3P0连接池开发步骤

1、导入开发包

 

2、创建数据库连接池

ComboPooledDataSourcecpds = new ComboPooledDataSource();    

3、设置数据库连接的基本信息

(1)方式一:

cpds.setDriverClass("com.mysql.jdbc.Driver");

cpds.setJdbcUrl("jdbc:mysql:///mydb1");

cpds.setUser("root");

cpds.setPassword("root");

 

(2)方式二:推荐!!

在类目录下(开发时可以放在src或者类似的源码目录下), 添加一个c3p0-config.xml文件, 配置内容如下:

 

(3)方式三:

在类目录下(开发时可以放在src或者类似的源码目录下), 添加一个c3p0.properties文件, 配置内容如下:

原创粉丝点击