Java世界

学习笔记

常用链接

统计

积分与排名

天籁村

新华网

雅虎

最新评论

数据库连接池DBCP

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

需要注意:
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固定写法。


注意:如果该配置出现错误,采用另一种方式进行配置

在tomcat中的server.xml不进行配置,而在context.xml中进行设置
代码如下:
<Resource name="jdbc/CompanyDB" type="javax.sql.DataSource" password="root"
driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver" maxIdle="2" maxWait="5000" username="sa" url="jdbc:sqlserver://localhost:1433;DataBaseName=Company" maxActive="100"/>


web.xml的设置同上一个配置一样。


posted on 2010-06-12 16:32 Rabbit 阅读(2585) 评论(0)  编辑  收藏


只有注册用户登录后才能发表评论。


网站导航: