今天看了一个DB访问的类,用的是连接池,其中有个问题没搞明白,高手指点下,部分代码如下://创建连接池,取得DataSource
OracleConnectionPoolDataSource ocpds = new OracleConnectionPoolDataSource();
ocpds.setDriverType(driver/*"oracle.jdbc.driver.OracleDriver"*/);
ocpds.setURL(url);
ocpds.setUser(user);
ocpds.setPassword(passwd);
//Use Oracle Connection Cache implementation
OracleConnectionCacheImpl ocacheimpl = new OracleConnectionCacheImpl(ocpds);
//Set the maximum number of connections
ocacheimpl.setMinLimit (jdbcConnPoolMin);
ocacheimpl.setMaxLimit (jdbcConnPoolMax);
//set the scheme
ocacheimpl.setCacheScheme (jdbcOracleConnCacheScheme);
dataSource = (DataSource)ocacheimpl;下面比如调用一个Select方法,首先从连接池中取得一个连接:
conn = dataSource.getConnection();
try{
//对数据库的查询操作...
}catch(){
} finally {
if (rs != null) rs.close();
if (statement != null) statement.close();
if (conn != null) conn.close();
}
没搞明白的地方就在那个conn.close();,这里的关闭连接是销毁这个连接还是把连接返回到连接池中?
如果是销毁连接的话,那连接池就没什么用吧,等于查一次建一次连接?还有个问题,这里所用的连接池,它有自己的管理方法么,比如到了最大连接数了怎么处理?连接超时怎么处理?
如果这些没有封装,那自己加的话应该怎么写这些功能?ocacheimpl.setCacheScheme (jdbcOracleConnCacheScheme);这里实际设的是jdbcOracleConnCacheScheme = OracleConnectionCacheImpl.FIXED_WAIT_SCHEME
请问FIXED_WAIT_SCHEME对应什么模式?有什么用?

解决方案 »

  1.   

    连接池的话对一个连接对象操作完成之后不用close的,直接放回池里就可以了
    楼主的例子恐怕没用到连接池吧
      

  2.   

    用的是Oracle自带的连接池,但有没有用我不清楚,OracleConnectionCacheImpl没有人用过么?
    谁有好的连接池管理管理程序代码,能发个给我看看么[email protected]
    最少是用datasource的,不要用drivermanger
      

  3.   

    由于实现不一样,所以,调用此connection的close方法,所做的操作可能是将连接放回连接池,而不是关闭连接
      

  4.   


    连接池方式下方式下获得的是一个经过装饰的连接,这个连接的close方法作的事情,是把自己持有的连接还回到连接池,而不是直接关闭.稍微看一眼DBCP的源代码就明白了.
      

  5.   

    连接池的connection.close()并不是真正关闭连接, 而是将其放回到连接池.原理是连接池自己实现了Connection接口. 在真正的连接外又包了一层, 在关闭外层connection的处理中, 把它放回到pool中连接池的最大连接数, 连接超时一般都可设置. 超时后连接就失效了
      

  6.   

    谢谢TinyJimmy的回复,按照你的意思这里的Oracle连接池已经自己封装了一般的资源管理方法,是吧
    我查了一下OracleConnectionCacheImpl.setsetCacheScheme ();可以设置3种类型
    当连接到达最大数时:
    1.DYNAMIC_SCHEME//动态增加
    2.FIXED_RETURN_NULL_SCHEME//直接返回空
    3.FIXED_WAIT_SCHEME//一直等待,拒绝连接
    谁能比较一下三种类型的优缺点?
      

  7.   

    这种方法只能用于连接Oracle的数据库,谁有比较通用的连接池管理程序?
    最好是能结合Rowsets使用的,正在学习连接DB,想找一种比较好的方法用到自己的程序中,大家帮忙
      

  8.   

    有人用过Rowset没有。...说说撒..