day20连接池和分页.docx
- 文档编号:8897957
- 上传时间:2023-05-15
- 格式:DOCX
- 页数:14
- 大小:49.97KB
day20连接池和分页.docx
《day20连接池和分页.docx》由会员分享,可在线阅读,更多相关《day20连接池和分页.docx(14页珍藏版)》请在冰点文库上搜索。
day20连接池和分页
目标:
1.连接池
2.分页
1.连接池
思考:
程序中连接如何管理?
1.连接资源宝贵;需要对连接管理
2.连接:
a)操作数据库,创建连接
b)操作结束,关闭!
分析:
涉及频繁的连接的打开、关闭,影响程序的运行效率!
连接管理:
预先创建一组连接,有的时候每次取出一个;用完后,放回;
学习连接池:
a.自定义一个连接池
b.学习优秀的连接池组件
a)DBCP
b)C3P0
自定义连接池
代理:
如果对某个接口中的某个指定的方法的功能进行扩展,而不想实现接口里所有方法,可以使用(动态)代理模式!
Java中代理模式:
静态/动态/Cglib代理(spring)
使用动态代理,可以监测接口中方法的执行!
如何对Connection对象,生成一个代理对象:
|--Proxy
staticObjectnewProxyInstance(
ClassLoaderloader,当前使用的类加载器
Class
>[]interfaces,目标对象(Connection)实现的接口类型
InvocationHandlerh事件处理器:
当执行上面接口中的方法的时候,就会自动触发事件处理器代码,把当前执行的方法(method)作为参数传入。
)
/**
*自定义连接池,管理连接
*代码实现:
1.MyPool.java连接池类,
2.指定全局参数:
初始化数目、最大连接数、当前连接、连接池集合
3.构造函数:
循环创建3个连接
4.写一个创建连接的方法
5.获取连接
------>判断:
池中有连接,直接拿
------>池中没有连接,
------>判断,是否达到最大连接数;达到,抛出异常;没有达到最大连接数,
创建新的连接
6.释放连接
------->连接放回集合中(..)
*
*/
publicclassMyPool{
privateintinit_count=3;//初始化连接数目
privateintmax_count=6;//最大连接数
privateintcurrent_count=0;//记录当前使用连接数
//连接池(存放所有的初始化连接)
privateLinkedList
//1.构造函数中,初始化连接放入连接池
publicMyPool(){
//初始化连接
for(inti=0;i //记录当前连接数目 current_count++; //创建原始的连接对象 Connectioncon=createConnection(); //把连接加入连接池 pool.addLast(con); } } //2.创建一个新的连接的方法 privateConnectioncreateConnection(){ try{ Class.forName("com.mysql.jdbc.Driver"); //原始的目标对象 finalConnectioncon=DriverManager.getConnection("jdbc: mysql: ///jdbc_demo","root","root"); /**********对con对象代理**************/ //对con创建其代理对象 Connectionproxy=(Connection)Proxy.newProxyInstance( con.getClass().getClassLoader(),//类加载器 //con.getClass().getInterfaces(),//当目标对象是一个具体的类的时候 newClass[]{Connection.class},//目标对象实现的接口 newInvocationHandler(){//当调用con对象方法的时候,自动触发事务处理器 @Override publicObjectinvoke(Objectproxy,Methodmethod,Object[]args) throwsThrowable{ //方法返回值 Objectresult=null; //当前执行的方法的方法名 StringmethodName=method.getName(); //判断当执行了close方法的时候,把连接放入连接池 if("close".equals(methodName)){ System.out.println("begin: 当前执行close方法开始! "); //连接放入连接池 pool.addLast(con); System.out.println("end: 当前连接已经放入连接池了! "); }else{ //调用目标对象方法 result=method.invoke(con,args); } returnresult; } } ); returnproxy; }catch(Exceptione){ thrownewRuntimeException(e); } } //3.获取连接 publicConnectiongetConnection(){ //3.1判断连接池中是否有连接,如果有连接,就直接从连接池取出 if(pool.size()>0){ returnpool.removeFirst(); } //3.2连接池中没有连接: 判断,如果没有达到最大连接数,创建; if(current_count //记录当前使用的连接数 current_count++; //创建连接 returncreateConnection(); } //3.3如果当前已经达到最大连接数,抛出异常 thrownewRuntimeException("当前连接已经达到最大连接数目! "); } //4.释放连接 publicvoidrealeaseConnection(Connectioncon){ //4.1判断: 池的数目如果小于初始化连接,就放入池中 if(pool.size() pool.addLast(con); }else{ try{ //4.2关闭 current_count--; con.close(); }catch(SQLExceptione){ thrownewRuntimeException(e); } } } publicstaticvoidmain(String[]args)throwsSQLException{ MyPoolpool=newMyPool(); System.out.println("当前连接: "+pool.current_count);//3 //使用连接 pool.getConnection(); pool.getConnection(); Connectioncon4=pool.getConnection(); Connectioncon3=pool.getConnection(); Connectioncon2=pool.getConnection(); Connectioncon1=pool.getConnection(); //释放连接,连接放回连接池 //pool.realeaseConnection(con1); /* *希望: 当关闭连接的时候,要把连接放入连接池! 【当调用Connection接口的close方法时候,希望触发pool.addLast(con);操作】 *把连接放入连接池 *解决1: 实现Connection接口,重写close方法 *解决2: 动态代理 */ con1.close(); //再获取 pool.getConnection(); System.out.println("连接池: "+pool.pool.size());//0 System.out.println("当前连接: "+pool.current_count);//3 } } 代理的总结: (了解会用) 使用代理,可以在不实现接口的情况,对接口的方法进行扩展,添加额外的用户需要的业务逻辑! 2.开源的连接池技术 概述: Sun公司约定: 如果是连接池技术,需要实现一个接口! javax.sql.DataSource; 连接池: DBCP C3P0 2.1DBCP连接池: ●DBCP是Apache软件基金组织下的开源连接池实现,使用DBCP数据源,应用程序应在系统中增加如下两个jar文件: •Commons-dbcp.jar: 连接池的实现 •Commons-pool.jar: 连接池实现的依赖库 ●Tomcat的连接池正是采用该连接池来实现的。 该数据库连接池既可以与应用服务器整合使用,也可由应用程序独立使用。 ●核心类: BasicDataSource ●使用步骤 •引入jar文件 ●commons-dbcp-1.4.jar ●commons-pool-1.5.6.jar publicclassApp_DBCP{ //1.硬编码方式实现连接池 @Test publicvoidtestDbcp()throwsException{ //DBCP连接池核心类 BasicDataSourcedataSouce=newBasicDataSource(); //连接池参数配置: 初始化连接数、最大连接数/连接字符串、驱动、用户、密码 dataSouce.setUrl("jdbc: mysql: ///jdbc_demo");//数据库连接字符串 dataSouce.setDriverClassName("com.mysql.jdbc.Driver");//数据库驱动 dataSouce.setUsername("root");//数据库连接用户 dataSouce.setPassword("root");//数据库连接密码 dataSouce.setInitialSize(3);//初始化连接 dataSouce.setMaxActive(6);//最大连接 dataSouce.setMaxIdle(3000);//最大空闲时间 //获取连接 Connectioncon=dataSouce.getConnection(); con.prepareStatement("deletefromadminwhereid=3").executeUpdate(); //关闭 con.close(); } @Test //2.【推荐】配置方式实现连接池,便于维护 publicvoidtestProp()throwsException{ //加载prop配置文件 Propertiesprop=newProperties(); //获取文件流 InputStreaminStream=App_DBCP.class.getResourceAsStream("db.properties"); //加载属性配置文件 prop.load(inStream); //根据prop配置,直接创建数据源对象 DataSourcedataSouce=BasicDataSourceFactory.createDataSource(prop); //获取连接 Connectioncon=dataSouce.getConnection(); con.prepareStatement("deletefromadminwhereid=4").executeUpdate(); //关闭 con.close(); } } 配置方式实现DBCP连接池,配置文件中的key与BaseDataSouce中的属性一样: db.properties url=jdbc: mysql: ///jdbc_demo driverClassName=com.mysql.jdbc.Driver username=root password=root initialSize=3 maxActive=6 maxIdle=3000 2.2C3P0连接池: C3P0连接池: 最常用的连接池技术! Spring框架,默认支持C3P0连接池技术! C3P0连接池,核心类: CombopooledDataSourceds; 使用: 1.下载,引入jar文件: c3p0-0.9.1.2.jar 2.使用连接池,创建连接 a)硬编码方式 b)配置方式(xml) publicclassApp{ @Test //1.硬编码方式,使用C3P0连接池管理连接 publicvoidtestCode()throwsException{ //创建连接池核心工具类 ComboPooledDataSourcedataSource=newComboPooledDataSource(); //设置连接参数: url、驱动、用户密码、初始连接数、最大连接数 dataSource.setJdbcUrl("jdbc: mysql: //localhost: 3306/jdbc_demo"); dataSource.setDriverClass("com.mysql.jdbc.Driver"); dataSource.setUser("root"); dataSource.setPassword("root"); dataSource.setInitialPoolSize(3); dataSource.setMaxPoolSize(6); dataSource.setMaxIdleTime(1000); //--->从连接池对象中,获取连接对象 Connectioncon=dataSource.getConnection(); //执行更新 con.prepareStatement("deletefromadminwhereid=7").executeUpdate(); //关闭 con.close(); } @Test //2.XML配置方式,使用C3P0连接池管理连接 publicvoidtestXML()throwsException{ //创建c3p0连接池核心工具类 //自动加载src下c3p0的配置文件【c3p0-config.xml】 ComboPooledDataSourcedataSource=newComboPooledDataSource();//使用默认的配置 //获取连接 Connectioncon=dataSource.getConnection(); //执行更新 con.prepareStatement("deletefromadminwhereid=5").executeUpdate(); //关闭 con.close(); } } 2.3优化 项目,连接的管理,交给连接池! 3.分页技术 分页技术: JSP页面,用来显示数据! 如果数据有1000条,分页显示,每页显示10条,共100页;好处: 利于页面布局,且显示的效率高! 分页关键点: 1.分页SQL语句; 2.后台处理: dao/service/servlet/JSP 实现步骤: 1.环境准备 a)引入jar文件及引入配置文件 i.数据库驱动包 ii.C3P0连接池jar文件及配置文件 iii.DbUtis组件: QueryRunnerqr=newQueryRuner(dataSouce); qr.update(sql); b)公用类: JdbcUtils.java 2.先设计: PageBean.java 3.Dao接口设计/实现: 2个方法 4.Service/servlet 5.JSP 作业: 需求: 自拟 要求功能: 1.列表展示、分页【必须有】 2.注册、登陆 a)登陆后,进入第1步骤的列表页面(分页) b)注册成功,跳转到登陆页面,让用户登陆 3.扩展 a)对列表数据修改 b)对列表数据删除 c)新增数据 3.3号5.30后提交。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- day20 连接 分页