JavaWeb07-HTML篇笔记(三)
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篇笔记(三)相关推荐
- 鸟哥私房菜(基础篇第三版)笔记
鸟哥私房菜(基础篇第三版)笔记 Linux最传统的磁盘文件系统(filesystem)使用的是EXT2,centos5支持EXT3,6已经支持EXT4了. 文件系统包括以下三部分: 1:superbl ...
- JVM笔记(三):垃圾回收篇
垃圾回收篇 文章目录 垃圾回收篇 一.垃圾回收算法与引用 1.判断对象已死(标记垃圾算法) `1` 引用计数算法 `2` 可达性分析算法 `3` 真正的死亡 2.垃圾回收算法 `1` 垃圾回收分类 ` ...
- 阻塞和非阻塞、同步和异步的三篇笔记
学习node.js回调函数看到的关于阻塞非阻塞.同步异步讲解的很通俗易懂的三篇笔记,下面记录一下: 第一篇 阻塞和非阻塞,同步和异步是node.js里经常遇到的词汇,我举个简单的例子来说明: 我要看足 ...
- 菜鸟学Linux 第033篇笔记 bootloader,inittab
菜鸟学Linux 第033篇笔记 bootloader,inittab Linux 系统自启动流程 PC OS (Linux) POST-->BIOS(Boot Sequence)-->M ...
- python采用pika库使用rabbitmq总结,多篇笔记和示例
这一段时间学习了下rabbitmq,在学习的过程中,发现国内关于python采用pika库使用rabbitmq的资料很少,官网有这方面的资料,不过是都英文的.于是笔者结合自己的理解,就这方面内容写了一 ...
- javascript高程3 学习笔记(三)
执行环境 执行环境是什么? javascript的解释器每次开始执行一个函数时,都会为每个函数创建一个执行环境(execution context). 执行环境定义了变量或者函数有权访问的其他数据,决 ...
- Coolite Toolkit学习笔记三:基本控件之Button、TextField、DataField、ComboBox
Button.TextField.DataField.ComBox这些控件好象也没什么好学的,任何一个学过ASP.NET的朋友都应该会使用这些控件,Coolite Toolkit里的这些控件相比标准的 ...
- DPDK内存篇(三): 标准大页、NUMA、DMA、IOMMU、IOVA、内存池
作者简介:Anatoly Burakov,英特尔软件工程师,目前在维护DPDK中的VFIO和内存子系统. 目录 引言 标准大页 将内存固定到NUMA节点 硬件.物理地址和直接内存存取(DMA) IOM ...
- 菜鸟学Linux 第031篇笔记 script,控制,while,function
菜鸟学Linux 第031篇笔记 script,控制,while,function 一.脚本需求: 说明:此脚本能于同一个repo文件中创建之个yum源的指向: 1.接受一个文件名作为参数,此文件存放 ...
- 《MFC游戏开发》笔记三 游戏贴图与透明特效的实现
本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9313239 作者:七十一雾央 新浪微博:http:// ...
最新文章
- easyui中 在子tabs中 添加新的tabs
- 50 jQuery拷贝对象与多库共存
- 响应式网站建设优势有哪些?
- rabbitMq自动创建队列
- ajax html页面传参数,jQuery AJAX:如何将大型HTML标记作为参数传递?
- 深度学习的半精度浮点数的运用
- 通过Spannable对象设置textview的样式
- [转载] 【python】内置函数 slice()
- 将图像转为特征值_用K均值进行图像分割
- Android Multimedia框架总结(二十三)MediaCodec补充及MediaMuxer引入(附案例)
- 三菱FX3SA PLC连接威纶通MT6071iE触摸屏+计数器使用+循环执行N次+暂停+触摸屏软件安装包
- RedHat7 安装 MySQL 5.7
- MATLAB读二进制数据文件
- 【转】深入理解Instrument
- 代码练习——数组_实战
- C++ Beep()演奏简谱的改进以及实现背景音乐
- 信用卡不激活到底会怎样?会有哪些负面影响呢?
- CoAP协议学习笔记 3.1 CoAP协议翻译 加密基础介绍
- SQL Server查询排序 升序 降序
- 多级LC滤波器级联问题
热门文章
- 寻找二值图像的连通域算法分析
- 在JavaScript中使用JSON
- 载入Haskell的函数
- 10 signs that you’re not cut out to be an IT manager
- 数据库 聚合 、分组、筛选、排序、日期等函数的应用
- 【Tensorlayer系列】深度强化学习之DQN求解FrozenLake
- 控制台应用程序转成MFC程序错误—OcrRec.exe触发一个触点,原因可能是堆被破坏
- fatal error C1010: 在查找预编译头时遇到意外的文件结尾
- 基于迭代局部搜索和随机惯性权重的BA算法MATLAB实现(ILSSIWBA)
- 【LeetCode】【数组】题号:*4238. 除自身以外数组的乘积