DataSource和close方法

coooliang 2010-11-15 11:47:52
我想问的是conn的close方法 是否调用的是重写的colse()方法
老师这个close方法是把conn放回连接池 但不是调用close的方法
我感觉怪怪的
Servlet中使用数据源

Context context = new InitialContext();
DataSource ds = (DataSource) context.lookup("java:comp/env/jdbc/oracleds");
Connection conn = ds.getConnection();
conn.close();//是否调用的是重写的colse()方法



按照我最近看视频的内容 写了以下内容
来说明我认为的 colse()是调用重写后的close()方法

1.

//实现Connection接口中所有的方法 其中close方法将连接放回Pool中
public class MyConnection implements Connection{
private ConncetionPool pool;

public MyConnection(ConncetionPool pool){
this.pool = pool;
}

public void close() throws SQLException {
pool.realse(this);
}

2.

//在池中放五个MyConnction
public class ConncetionPool {
private MyConnection conn;
Vector<MyConnection> pool = new Vector<MyConnection>();
static
{
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public ConncetionPool(){
for(int i=0;i<5;i++){
conn = new MyConnection(this);
pool.add(conn);
}
}

public void realse(MyConnection myConnection){
pool.add(myConnection);
}


3.


//数据源对象中放了一个 Pool
public class MyDataSource implements DataSource{

private ConncetionPool connectionPool = new ConncetionPool();

MyDataSource(){

}
public Connection getConnection() throws SQLException {

//我们得到的是Connection的实现类MyConnection
//所以 close方法调用的是MyConnection 重写后的close() 方法
MyConnection conn = connectionPool.getPool().get(0);
return conn;

}


请问我的理解是否正确?!~
...全文
1049 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
coooliang 2010-12-04
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 yaoweijq 的回复:]
这个连接池调用的确实是重写的close方法
可以参考向上转型的一些基本概念
List a = new ArrayList();
调用a的方法时候,实际上调用的是arraylist中的具体实现(如果它实现了的话)
实际上大部分连接池是用动态代理实现的,
即实现一个代理类代理close方法
在调用close方法的时候做了将连接放回连接池的操作
而没有显式的重写close方法
[/Quote]

+1
magong 2010-11-15
  • 打赏
  • 举报
回复
连接池(DS)返回的Connection当然是代理对象,否则连接池怎么无缝管理连接。
你的理解是对的。

另外,想要关闭被代理的物理数据库连接,有些连接池类上定义了close方法用于关闭这个连接池开过的所有的jdbc连接。
yaoweijq 2010-11-15
  • 打赏
  • 举报
回复
这个连接池调用的确实是重写的close方法
可以参考向上转型的一些基本概念
List a = new ArrayList();
调用a的方法时候,实际上调用的是arraylist中的具体实现(如果它实现了的话)
实际上大部分连接池是用动态代理实现的,
即实现一个代理类代理close方法
在调用close方法的时候做了将连接放回连接池的操作
而没有显式的重写close方法
zn85600301 2010-11-15
  • 打赏
  • 举报
回复
单步看一下 就行了

Context context = new InitialContext();
DataSource ds = (DataSource) context.lookup("java:comp/env/jdbc/oracleds");
Connection conn = ds.getConnection();
conn.close();//是否调用的是重写的colse()方法

不过看起来不是的 你没用过你自定义的类
xiaotugege 2010-11-15
  • 打赏
  • 举报
回复
各个数据库厂商的Connection实现基本上都是final的,继承是不可以的。
大致你可以这样理解
class MyConnection implements Connection{
private Connection conn;
public MyConnection(Connection conn){
this.conn = conn;
}

public Statement createStatement(){
return conn.createStatement();
}
..........
public void close(){
//放回连接池
}
}


更简单的办法就是使用代理了。

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧