分享

数据库连接池DBCP

 燮羽 2010-12-08
概念:数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不再是重新建立一个连接;释放空闲时间超过最大空闲时间的数据库连接,以避免因为没有释放数据库连接而引起的数据库连接遗漏。 

需要注意: 
1. 最小连接数是连接池一直保持的数据库连接,所以如果应用程序对数据库连接的使用量不大,将会有大量数据库连接资源被浪费。 
2. 最大连接数是连接池能申请的最大连接数,如果数据库连接请求超过此数,后面的数据库连接请求将被加入到等待队列中,这会影响之后的数据库操作。 

数据库连接池的两个任务: 
1. 限制每个应用或系统可以拥有的最大资源,也就是确定连接池的大小(PoolSize)。 
2. 在连接池的大小(PoolSize)范围内、最大限度地使用资源,缩短数据库访问的使用周期。 

例如: 物理连接数200个,每个连接提供250个Statemet,那么并发的Statement总数为200*250=50000个。 

Java开源连接池: 
Jakarta DBCP 可直接在应用程序中使用。(比较常用,集成在Tomcat和Struts中) 
C3P0是Hibernate的默认数据库连接池。(常用,Hibernate) 
其他的还有Proxool、DDConnectionBroker、DBPool、XAPool、Primrose、SmartPool、MiniConnectionPoolManager。 


DBCP代码实现: 
//创建数据源 
public static DataSource setupDataSource(String connectURI) { 
    BasicDataSource ds = new BasicDataSource(); 
    ds.setDriverClassName(org.gjt.mm.mysql.Driver); 
    ds.setUsername("username"); 
    ds.setPassword("password"); 
    ds.setUrl(connectURI); 
    return ds;    
} 

//关闭数据源 
public static void shutdownDataSource(DataSource ds) throws SQLException { 
    BasicDataSource bds = (BasicDataSource)ds; 
    bds.close(); 
} 

//数据源的使用 


DataSource dataSource = getDataSource(); 
  Connection conn = null; 
  PreparedStatement pstmt = null; 
  ResultSet rs = null; 
  
  try { 
   conn = dataSource.getConnection(); 
   pstmt = conn.prepareStatement("select * from users"); 
   rs = pstmt.executeQuery(); 
   while(rs.next()) { 
    System.out.println(rs.getInt("id")); 
   } 
  } catch(Exception e) { 
   e.printStackTrace(); 
  } finally { 
   try { 
    rs.close(); 
    pstmt.close(); 
    conn.close(); 
   } catch(Exception ex) { 
    ex.printStackTrace(); 
   } 
  } 




在Tomcat中配置数据库连接池: 


我们使用Tomcat中lib文件夹下的tomcat-dbcp.jar。 
1. 修改server.xml文件在<Service>中写入以下代码: 
<Context path="/WebProject" docBase="WebProject" reloadable="true" crossContext="true"> 
     
     <Resource auth="Container" name="jdbc/CompanyDB" type="javax.sql.DataSource" 
      factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory"  
     driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"      
     url="jdbc:sqlserver://localhost:1433;DataBaseName=Company"  
     username="sa"  
      password="root"  
      maxActive="100"  
      maxIdle="30"  
      maxWait="10000"   
     removeAbandoned=“true” 
      removeAbandonedTimeOut="10"  
      logAbandoned="true"/> 
    </Context> 


path:工程路径。 
docBase:工程名字。 
name:JNDI的名字。 
type:数据源的类。 
factory:指定生成的DataReource的factory类名;默认DBCP工厂类。 
driverClassName:数据库驱动名。 
url:数据库连接的URL。 
username:数据库用户名。 
password:数据库密码。 
maxActive:最大连接数据库数,设为0表示没有限制。 
maxIdle:最大等待数量,设为0表示没有限制。 
maxWait:最大等待秒数,单位为ms。 
removeAbandoned:是否自我中断,默认为false。 
removeAbandonedTimeOut:几秒后会自我中断,removeAbandoned必须为true。 
logAbandoned:是否记录中断事件,默认为false。 



2. 修改web.xml文件,增加一个标签,输入以下代码: 
<resource-ref> 
     <description>Company Connection</description> 
     <res-ref-name>jdbc/CompanyDB</res-ref-name> 
     <res-type>javax.sql.DataSource</res-type> 
     <res-auth>Container</res-auth> 
</resource-ref> 

res-ref-name:指定JNDI的名字。 
res-type:指定资源类名。 
res-auth:指定资源的Manager。 

3. 代码中使用JNDI代码进行获取: 
Context ctx = new InitalContext(); 
DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/CompanyDB"); 
Connection conn = ds.getConnection(); 


注意:java:comp/env/ 是java中JNDI固定写法。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多