1.1 案例二:使用连接池改造JDBC的工具类:1.1.1 需求:
传统JDBC的操作,对连接的对象销毁不是特别好.每次创建和销毁连接都是需要花费时间.可以使用连接池优化的程序.

  • 在程序开始的时候,可以创建几个连接,将连接放入到连接池中.用户使用连接的时候,可以从连接池中进行获取.用完之后,可以将连接归还连接池.
    1.1.2 分析:1.1.2.1 技术分析:
    【自定义连接池】(了解)
  • SUN公司提供了一个连接池的接口.(javax.sql.DataSource).
  • 定义一个连接池:实现这个接口.
  • 使用List集合存放多个连接的对象.
    【自定义连接池的代码】
public class MyDataSource implements DataSource{
// 创建一个List集合用于存放多个连接对象.
private List<Connection> list = new ArrayList<Connection>();
// 在程序开始的时候,初始化几个连接,将连接存放到list中.
public MyDataSource() {
// 初始化3个连接:
for(int i=1;i<=3;i++){
Connection conn = JDBCUtils.getConnection();
list.add(conn);
}
}
@Override
// 获得连接的方法:
public Connection getConnection() throws SQLException {
if(list.size() <= 0){
for(int i=1;i<=3;i++){
Connection conn = JDBCUtils.getConnection();
list.add(conn);
}
}
Connection conn = list.remove(0);
return conn;
}
// 归还连接的方法:
public void addBack(Connection conn){
list.add(conn);
}
...
}

【自定义连接池中问题及如何解决】
Ø 问题?
1.如果使用自定义连接池,那么需要额外记住自定义连接池中的API.
2.能不能使用面向接口的编程方式.
Ø 解决:
不额外提供API方法,就可以解决上述两个问题!!!
能不能还调用Connection的close方法.能不能增强Connection的close方法,原有的销毁变为归还!!!
Ø 如何增强Connection的close方法:

  • 增强一个Java类中的某个方法有几种方式???

    • 一种方式:继承的方式.

      • 能够控制这个类的构造的时候,才可以使用继承.
    • 二种方式:装饰者模式方式.
      • 包装对象和被包装的对象都要实现相同的接口.
      • 包装的对象中需要获得到被包装对象的引用.
        ***** 缺点:如果接口的方法比较多,增强其中的某个方法.其他的功能的方法需要原有调用.
    • 三种方式:动态代理的方式.
      • 被增强的对象实现接口就可以.
        【继承和装饰者的案例】
/*** 继承的方式增强一个类中某个方法:*/
class Man{
public void run(){
System.out.println("跑....");
}
}class SuperMan extends Man{
public void run(){
// super.run();
System.out.println("飞....");
}
}/*** 使用装饰者的方式完成类的方法的增强*/
interface Waiter{
public void server();
}class Waiteress implements Waiter{@Override
public void server() {
System.out.println("服务...");
}
}class WaiteressWrapper implements Waiter{private Waiter waiter;public WaiteressWrapper(Waiter waiter) {this.waiter = waiter;
}
@Override
public void server() {
System.out.println("微笑...");
// this.waiter.server();
}
}
【使用装饰者模式增强Connection的close方法】
public class MyConnection implements Connection{private Connection conn;

private List<Connection> list;

public MyConnection(Connection conn,List<Connection> list) {
this.conn = conn;
this.list = list;
}

@Override
public void close() throws SQLException {
list.add(conn);
}
...
}

连接池的getConnection方法:br/>@Override
// 获得连接的方法:
public Connection getConnection() throws SQLException {
if(list.size() <= 0){
for(int i=1;i<=3;i++){
Connection conn = JDBCUtils.getConnection();
list.add(conn);
}
}
Connection conn = list.remove(0);
MyConnection myConn = new MyConnection(conn, list);
return myConn;
}
【常见的开源的数据库连接池】:
Ø DBCP:
DBCP(DataBase connection pool),数据库连接池。是 apache 上的一个 java 连接池项目,也是 tomcat 使用的连接池组件。单独使用dbcp需要2个包:commons-dbcp.jar,commons-pool.jar由于建立数据库连接是一个非常耗时耗资源的行为,所以通过连接池预先同数据库建立一些连接,放在内存中,应用程序需要建立数据库连接时直接到连接池中申请一个就行,用完后再放回去。
Ø C3P0:
C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate,Spring等。
Ø Tomcat内置连接池:
【DBCP连接池的使用】
第一步:引入DBCP连接池的jar包.
第二步:编写DBCP代码:

  • 手动设置参数:
  • 配置文件设置参数:
    【DBCP连接池的使用】
@Test
/*** 手动方式:*/
public void demo1(){
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql:///web_07");
dataSource.setUsername("root");
dataSource.setPassword("123");
try{
// 获得连接:
conn = dataSource.getConnection();
// 编写SQL:
String sql = "select * from category";
// 预编译SQL:
stmt = conn.prepareStatement(sql);
// 执行SQL:
rs = stmt.executeQuery();
while(rs.next()){
System.out.println(rs.getInt("cid")+"   "+rs.getString("cname"));
}
}catch(Exception e){
e.printStackTrace();
}finally{
JDBCUtils.release(rs,stmt, conn);
}
}
@Test
/*** 配置文件方式:*/
public void demo2(){
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
Properties properties = new Properties();
try{
properties.load(new FileInputStream("src/dbcpconfig.properties"));
DataSource dataSource = BasicDataSourceFactory.createDataSource(properties);
// 获得连接:
conn = dataSource.getConnection();
// 编写SQL:
String sql = "select * from category";
// 预编译SQL:
stmt = conn.prepareStatement(sql);
// 执行SQL:
rs = stmt.executeQuery();
while(rs.next()){
System.out.println(rs.getInt("cid")+"   "+rs.getString("cname"));
}
}catch(Exception e){
e.printStackTrace();
}finally{
JDBCUtils.release(rs,stmt, conn);
}
}

转载于:https://blog.51cto.com/13517854/2116849

JavaWeb07-HTML篇笔记(三)相关推荐

  1. 鸟哥私房菜(基础篇第三版)笔记

    鸟哥私房菜(基础篇第三版)笔记 Linux最传统的磁盘文件系统(filesystem)使用的是EXT2,centos5支持EXT3,6已经支持EXT4了. 文件系统包括以下三部分: 1:superbl ...

  2. JVM笔记(三):垃圾回收篇

    垃圾回收篇 文章目录 垃圾回收篇 一.垃圾回收算法与引用 1.判断对象已死(标记垃圾算法) `1` 引用计数算法 `2` 可达性分析算法 `3` 真正的死亡 2.垃圾回收算法 `1` 垃圾回收分类 ` ...

  3. 阻塞和非阻塞、同步和异步的三篇笔记

    学习node.js回调函数看到的关于阻塞非阻塞.同步异步讲解的很通俗易懂的三篇笔记,下面记录一下: 第一篇 阻塞和非阻塞,同步和异步是node.js里经常遇到的词汇,我举个简单的例子来说明: 我要看足 ...

  4. 菜鸟学Linux 第033篇笔记 bootloader,inittab

    菜鸟学Linux 第033篇笔记 bootloader,inittab Linux 系统自启动流程 PC OS (Linux) POST-->BIOS(Boot Sequence)-->M ...

  5. python采用pika库使用rabbitmq总结,多篇笔记和示例

    这一段时间学习了下rabbitmq,在学习的过程中,发现国内关于python采用pika库使用rabbitmq的资料很少,官网有这方面的资料,不过是都英文的.于是笔者结合自己的理解,就这方面内容写了一 ...

  6. javascript高程3 学习笔记(三)

    执行环境 执行环境是什么? javascript的解释器每次开始执行一个函数时,都会为每个函数创建一个执行环境(execution context). 执行环境定义了变量或者函数有权访问的其他数据,决 ...

  7. Coolite Toolkit学习笔记三:基本控件之Button、TextField、DataField、ComboBox

    Button.TextField.DataField.ComBox这些控件好象也没什么好学的,任何一个学过ASP.NET的朋友都应该会使用这些控件,Coolite Toolkit里的这些控件相比标准的 ...

  8. DPDK内存篇(三): 标准大页、NUMA、DMA、IOMMU、IOVA、内存池

    作者简介:Anatoly Burakov,英特尔软件工程师,目前在维护DPDK中的VFIO和内存子系统. 目录 引言 标准大页 将内存固定到NUMA节点 硬件.物理地址和直接内存存取(DMA) IOM ...

  9. 菜鸟学Linux 第031篇笔记 script,控制,while,function

    菜鸟学Linux 第031篇笔记 script,控制,while,function 一.脚本需求: 说明:此脚本能于同一个repo文件中创建之个yum源的指向: 1.接受一个文件名作为参数,此文件存放 ...

  10. 《MFC游戏开发》笔记三 游戏贴图与透明特效的实现

    本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9313239 作者:七十一雾央 新浪微博:http:// ...

最新文章

  1. easyui中 在子tabs中 添加新的tabs
  2. 50 jQuery拷贝对象与多库共存
  3. 响应式网站建设优势有哪些?
  4. rabbitMq自动创建队列
  5. ajax html页面传参数,jQuery AJAX:如何将大型HTML标记作为参数传递?
  6. 深度学习的半精度浮点数的运用
  7. 通过Spannable对象设置textview的样式
  8. [转载] 【python】内置函数 slice()
  9. 将图像转为特征值_用K均值进行图像分割
  10. Android Multimedia框架总结(二十三)MediaCodec补充及MediaMuxer引入(附案例)
  11. 三菱FX3SA PLC连接威纶通MT6071iE触摸屏+计数器使用+循环执行N次+暂停+触摸屏软件安装包
  12. RedHat7 安装 MySQL 5.7
  13. MATLAB读二进制数据文件
  14. 【转】深入理解Instrument
  15. 代码练习——数组_实战
  16. C++ Beep()演奏简谱的改进以及实现背景音乐
  17. 信用卡不激活到底会怎样?会有哪些负面影响呢?
  18. CoAP协议学习笔记 3.1 CoAP协议翻译 加密基础介绍
  19. SQL Server查询排序 升序 降序
  20. 多级LC滤波器级联问题

热门文章

  1. 寻找二值图像的连通域算法分析
  2. 在JavaScript中使用JSON
  3. 载入Haskell的函数
  4. 10 signs that you’re not cut out to be an IT manager
  5. 数据库 聚合 、分组、筛选、排序、日期等函数的应用
  6. 【Tensorlayer系列】深度强化学习之DQN求解FrozenLake
  7. 控制台应用程序转成MFC程序错误—OcrRec.exe触发一个触点,原因可能是堆被破坏
  8. fatal error C1010: 在查找预编译头时遇到意外的文件结尾
  9. 基于迭代局部搜索和随机惯性权重的BA算法MATLAB实现(ILSSIWBA)
  10. 【LeetCode】【数组】题号:*4238. 除自身以外数组的乘积