代理实现连接池第三方连接池Dbutilsc3p0Word文件下载.docx
- 文档编号:20428275
- 上传时间:2023-01-22
- 格式:DOCX
- 页数:23
- 大小:337.66KB
代理实现连接池第三方连接池Dbutilsc3p0Word文件下载.docx
《代理实现连接池第三方连接池Dbutilsc3p0Word文件下载.docx》由会员分享,可在线阅读,更多相关《代理实现连接池第三方连接池Dbutilsc3p0Word文件下载.docx(23页珍藏版)》请在冰豆网上搜索。
声明被代理类的实例"
);
finalCatcat=newCat();
2:
通过Proxy在内存中创建ICat的子类"
ObjectproxyedObj=Proxy.newProxyInstance(
ProxyDemo.class.getClassLoader(),newClass[]{Animal.class},
//拦截句柄,在执行时,只要执行代理类(经济人,中介-proxyedObj)任何方法,
//都会被这个句柄给拦截到
newInvocationHandler(){
//1:
参数:
proxy即proxyedObj,即这个一个代理,经济人,中介
//2:
Method即反射出来的代理对象的方法proxyedObj.getClass().getMethod(xx)
//3:
参数列表
publicObjectinvoke(Objectproxy,Methodmethod,
Object[]args)throwsThrowable{
System.err.println("
5:
正在执行的方法为:
"
+method.getName());
//如果没有返回则为null,调用cat对象的eat方法
ObjectreturnValue=method.invoke(cat,args);
7:
返回的值是:
+returnValue);
returnreturnValue;
}
});
3:
将proxyedObj代理类,即经济人转成被代理对象"
Animala1=(Animal)proxyedObj;
4:
调用代理对象的(经济人的)eat方法"
a1.eat();
8:
执行完成"
}
}
//声明被代理类的class
interfaceAnimal{
publicvoideat();
classCatimplementsAnimal{
publicvoideat(){
6:
fishing..."
案例:
要求拦截List接口的添加元素方法。
分析:
即拦截List.add方法
/**
*拦截List添加方法
*/
publicclassInterListDemo{
//1:
声明被代理的list
finalList<
Object>
list=
newArrayList<
();
list.add("
World"
//2:
在内存中创建List接口的子类
ObjectproxyedObj=
Proxy.newProxyInstance(InterListDemo.class.getClassLoader(),
newClass[]{List.class},
newInvocationHandler(){
publicObjectinvoke(Objectproxy,Methodmethod,Object[]args)
throwsThrowable{
System.err.println("
正在执行某个方法:
+method.getName());
//判断是否是正在执行size方法
if(method.getName().equals("
size"
)){
return100;
}else{//否则,即调用的不是size方法,直接去执行原对象的某个方法
ObjectreturnValue=method.invoke(list,args);
returnreturnValue;
}
}
});
//3:
转换
List<
list2=(List<
)proxyedObj;
//list2.add("
Hello"
//要求当调用size时不管原list中的size是多少,都返回100
list.size:
+list2.size());
for(Objecto:
list2){
System.err.println(o);
}
代理实现连接池
用代理实现对Connection的close方法修改,目的要求不能关闭连接,应该是归还连接。
1.必须要有一个池,即List,LinkedList
2.创建多个连接入到List中去,在放之前,必须要对Connection进行代理
3.在代理的Connection方法中对所有其它方法都直接去调用原类即被代理类的方法,但对于close方法不能调用,应是修改为归还连接。
实现代码:
publicclassConnPool{
privatestaticLinkedList<
Connection>
pool=
newLinkedList<
static{
try{
Propertiesp=
newProperties();
InputStreamin=
ConnPool.class.getClassLoader().getResourceAsStream("
jdbc.properties"
p.load(in);
Stringdriver=p.getProperty("
d"
Stringurl=p.getProperty("
u"
Stringnm=p.getProperty("
n"
Stringpwd=p.getProperty("
p"
Integersize=Integer.valueOf(p.getProperty("
s"
));
//创建多个连接
for(inti=0;
i<
size;
i++){
finalConnectioncon=//原生对象,即没有被代理的,但准备被代理的-华仔
DriverManager.getConnection(url,nm,pwd);
//声明代理类
ObjectconnProxy=
Proxy.newProxyInstance(
ConnPool.class.getClassLoader(),
newClass[]{Connection.class},
newInvocationHandler(){
publicObjectinvoke(Objectproxy,Methodmethod,Object[]args)
throwsThrowable{
if(method.getName().equals("
close"
System.err.println("
有人还连接了"
synchronized(pool){
//由于proxy就是connProxy,所以直接就将proxy添加回去就可以
pool.addLast((Connection)proxy);
pool.notify();
}
returnnull;
}else{
//如果调用的不是close方法则直接调用原生对象的方法即放行
returnmethod.invoke(con,args);
}
}
});
//将代理类,即经济人放到List中
pool.add((Connection)connProxy);
}
}catch(Exceptione){
e.printStackTrace();
publicstaticConnectiongetCon(){
synchronized(pool){
//计算时间的开始
longstart=System.currentTimeMillis();
while(pool.size()==0){
//进入等待池
System.err.println("
取一次:
+Thread.currentThread().getName());
try{
pool.wait(1000);
}catch(InterruptedExceptione){
e.printStackTrace();
}
//计算时间是否超过了三秒
longpro=System.currentTimeMillis()-start;
if(pro>
3000){
System.err.println("
已经超过3秒超时,放弃"
thrownewRuntimeException("
时间超时了"
System.err.println(pool.size());
Connectioncon=pool.removeFirst();
returncon;
标准连接池
标准的连接池,就是实现DataSource接口,且实现DataSource接口的类,必须是具体类,没有静态方法。
ConnectiongetConnection()
AttemptstoestablishaconnectionwiththedatasourcethatthisDataSourceobjectrepresents.
尝试建立与此DataSource对象所表示的数据源的连接。
ConnectiongetConnection(Stringusername,Stringpassword)
AttemptstoestablishaconnectionwiththedatasourcethatthisDataSourceobjectrepresents.
尝试建立与此DataSource对象所表示的数据源的连接。
实现以上的两个方法:
1.基本实现–生成标准的Connection对象。
2.连接池实现–生成自动参与连接池的Connection对象。
此实现与中间层连接池管理器一起使用。
publicclassMyDataSourceimplementsDataSource{
//1:
声明池对象
privateLinkedList<
//2:
为了向pool中放connection必须要只,能通过构造初始化多个连接
publicMyDataSource(){
MyDataSource.class.getClassLoader()
.getResourceAsStream("
publicConnectiongetConnection()throwsSQLException{
如何使用:
通过第三方框架连接数据库
由于操作数据库,管理连接池,回收连接是JDBC必须要做的事,所以就有了第三方框架。
目前比较流行的连接池框架:
●dbcp-apache公司的dbcp=DataBaseConnectionPool版本1.2
●c3p0–0.9.1.2
●proxool–1.1
dbcp数据源
导包
dbcp核心类–声明一个类,用核心类连接数据库
BasicDataSource–它是javax.sql.DataSource子类。
对DataSource来说,它只是一个池,至于里面有没有连接,能不能连接到数据库,必须要通过dataSource.getConnection()测试。
如果只判断dataSource是否为null是不能确定是否连接数据库成功与否的。
c3p0数据源
c3p0的核心类:
ComboPooledDataSource–通过读取一个配置文件–配置文件必须是classpath:
c3p0-config.xml
准备c3p0配置文件
第三步:
配置连接数据库的数据
<
?
xmlversion="
1.0"
encoding="
UTF-8"
>
!
--必须以c3p0-config开始-->
c3p0-config>
<
--在c3p0的配置文件中没有dtd定义-->
--必须要包含默认的配置项目-->
default-config>
<
--配置驱动器-->
propertyname="
driverClass"
com.mysql.jdbc.Driver<
/property>
jdbcUrl"
<
[CDATA[jdbc:
mysql:
//127.0.0.1:
3306/day14?
useUnicode=true&
characterEncoding=UTF-8]]>
user"
root<
password"
1234<
--初始化个数-->
initialPoolSize"
2<
--最少有多少个连接-->
minPoolSize"
--最多有多少个-->
maxPoolSize"
4<
--如果池中数据连接不够时一次增长多少个-->
acquireIncrement"
3<
--一个连接每一次最多执行多少个sql语句-->
maxStatements"
50<
/default-config>
/c3p0-config>
第四步:
书写一个类,创建ComboPooledDataSource实例
publicclassDataSouceUtils{
声明ds的成员,一个项目中只要有一个ds就可以了
privatestaticDataSourceds;
在静态代码块中
//如果直接实例化cpds则默认读取c3p0-config.xml中的默认配置
//如果带有参数,就会读取命名的配置
ds=newComboPooledDataSource();
//3:
提供一个静态方法返回ds实例
publicstaticDataSourcegetDataSource(){
returnds;
dbutils
定义
dbutils就是一个小型的hibenate。
就是将用户的CRUD工作都全部给封装了,用户通过简单的调用,就可以实现原来所有JDBC的一些功能。
(将statement.Query,execute,executeUpdate给封装了)
dbutils核心类
●QueryRunner,核心查询的类(select,update,delete,insert),相
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 代理 实现 连接 第三 Dbutilsc3p0