`
islibra
  • 浏览: 4047 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

数据库连接池

    博客分类:
  • sql
 
阅读更多

 

JDBC:管理驱动、与数据库建立连接、执行SQL语句、处理结果

 

数据库连接池:程序启动时建立足够的数据库连接,并将这些连接组成一个连接池,由程序动态地对池中的连接进行申请,使用,释放。

 

数据库连接池运行机制

1、从连接池获取或创建可用连接;

2、使用完毕之后,把连接返还给连接池;

3、在系统关闭前,断开所有连接并释放连接占用的系统资源;

4、还能够处理无效连接(原来登记为可用的连接,由于某种原因不再可用,如超时,通讯问题),并能够限制连接池中的连接总数不低于某个预定值和不超过某个预定值;

 

 

 

常用的数据库连接池

(1)JNDI(Java Naming and Directory Interface ):是SUN公司提供的一种标准的Java命名系统接口,是一组在Java应用中访问命名和目录服务的API。命名服务是将名称和对象联系起来,使得我们可以用名称访问对象。目录服务是一种命名服务,它提供了应用编程接口(application programming interface,API)和服务提供者接口(service provider interface,SPI)。这一点的真正含义是,要让应用与命名服务或目录服务交互,必须有这个服务的JNDI服务提供者,这正是JNDI SPI发挥作用的地方。服务提供者基本上是一组类,这些类为各种具体的命名和目录服务实现了JNDI接口—很象JDBC驱动为各种具体的数据库系统实现了JDBC接口一样。作为一个应用开发者,不必操心JNDI SPI。只需要确认要使用的每一个命名或目录服务都有服务提供者。 

(2)C3P0:连接池作者是《星球大战》迷,C3P0就是其中的一个机器人,并且这个名称中包涵connection 和pool的单词字母。因此叫这个名字。  

(3)DBCP(DataBase connection pool):是 apache 上的一个 java 连接池项目,也是 tomcat 使用的连接池组件。单独使用dbcp需要3个包:common-dbcp.jar,common-pool.jar,common-collections.jar


一、DBCP
DBCP主要配置属性:
<Resource name="jdbc/exam" type="javax.sql.DataSource" username="root" password="fengjian" driverClassName="com.mysql.jdbc.Driver" factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory" maxIdle="2" maxWait="5000" url="jdbc:mysql://localhost:3306/exam" maxActive="4" />
下面对里面几个比较重要的参数进行一下说明:
name:表示你的连接池的名称也就是你要访问连接池的地址
type:是对象的类型
driverClassName:是数据库驱动的名称
url:是数据库的地址
username:是登陆数据库的用户名
password:是登陆数据库的密码
factory: 默认的使用tomcat.dbcp.BasicDataSourceFactory,可以使用factory="org.apache.commons.dbcp.BasicDataSourceFactory",就是Apache的开源的数据库连接池,但一定要把commons-dbcp-1.4.jar放到项目的lib里。
maxIdle,是最大的空闲连接数,这里取值为2,表示即使没有数据库连接时依然可以保持2空闲的连接,而不被清除,随时处于待命状态。
maxWait ,最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。 
maxActive是最大激活连接数,这里取值为20,表示同时最多有20个数据库连接。

DBCP应用
 (1)新建一个web工程
 (2)把数据库包导入到lib如mysql-connector-java-5.0.8-bin
 (3)把common-dbcp.jar,common-pool.jar,common-collections.jar导入到lib
 (4)在WebRoot\META-INF建立文件context.xml
   内容如下:
<Context>
<Resource name="jdbc/test" type="javax.sql.DataSource" username="root" password="root" driverClassName="com.mysql.jdbc.Driver" factory="org.apache.commons.dbcp.BasicDataSourceFactory" maxIdle="8" maxWait="5000" url="jdbc:mysql://localhost:3306/test" maxActive="15" initialSize="10"/>
</Context>
 
 (5)在jsp中使用数据库连接池
   导入类包
java.sql.*
org.apache.commons.dbcp.*
java.sql.SQLException.*
javax.naming.Context.*
javax.naming.InitialContext
javax.sql.DataSource
javax.naming.NamingException
 (6)编写代码
<%
try {
    InitialContext context=new InitialContext();
    DataSource ds=(DataSource)context.lookup("java:/comp/env/jdbc/test");
    Connection conn = ds.getConnection(); 
    Statement stmt = conn.createStatement();
    ResultSet set = stmt.executeQuery("SELECT id,name,age FROM user");
    while(set.next())
    {
        out.println(set.getString("name"));
    }
    BasicDataSource dbs=(BasicDataSource)ds;
    out.print(dbs.getNumIdle()+"<br>");
    out.print(dbs.getNumActive());
} catch(NamingException e) {
    e.printStackTrace();
} catch(SQLException e) {
    e.printStackTrace();
}
%>
 
二、C3P0
C3PO 连接池是一个优秀的连接池,推荐使用。C3PO实现了JDBC3.0规范的部分功能,因而性能更加突出。
C3PO主要配置属性
<Resource auth="Container"     description="DB Connection"     driverClass="com.mysql.jdbc.Driver"     maxPoolSize="10"     minPoolSize="2"     acquireIncrement="2"     name="jdbc/mysqlDB"     user="root"     password="123123"     factory="org.apache.naming.factory.BeanFactory"     type="com.mchange.v2.c3p0.ComboPooledDataSource"     jdbcUrl="jdbc:mysql://localhost:3306/test?autoReconnect=true" />
acquireIncrement :当连接池中的连接耗尽的时候c3p0一次同时获取的连接数 
acquireRetryAttempts :定义在从数据库获取新连接失败后重复尝试的次数 
acquireRetryDelay :两次连接中间隔时间,单位毫秒。Default: 1000 
autoCommitOnClose :连接关闭时默认将所有未提交的操作回滚。Default: false 
Description:描述
minPoolSize:连接池中最小连接数
maxPoolSize:连接池中最大连接数
Name:连接池的名字
User:用户名
Password:密码
auth 表示认证方式,一般为Container
factory :工厂类的位置,生成数据源
Type:连接池的类型
jdbcUrl:数据库地址

C3P0应用
(1)导入包到lib
c3p0-0.9.1.2.jar、mysql-connector-java-5.0.8-bin.jar
(2)配置文件\Tomcat 5.5\conf\server.xml
在tomcat\conf\server.xml的GlobalNamingResources中增加:
<Resource auth="Container"  description="DB Connection"  driverClass="com.mysql.jdbc.Driver"  maxPoolSize="10"  minPoolSize="2"  acquireIncrement="2"  name="jdbc/mysqlDB"  user="root"  password="123123"  factory="org.apache.naming.factory.BeanFactory"  type="com.mchange.v2.c3p0.ComboPooledDataSource"  jdbcUrl="jdbc:mysql://localhost:3306/mldn?autoReconnect=true" />
 
(3)配置文件WebRoot\META-INF\context.xml
<Context>
<ResourceLink name="jdbc/mysqlDB" global="jdbc/mysqlDB" type="javax.sql.DataSource"/>
</Context>
 
(4)配置文件\WebRoot\WEB-INF\web.xml
<resource-ref>
     <description>DB Connection</description>
     <res-ref-name>jdbc/mysqlDB</res-ref-name>
     <res-type>javax.sql.DataSource</res-type>
     <res-auth>Container</res-auth>
</resource-ref>
 
(5)编码
java.sql.*
javax.naming.*
javax.sql.*
com.mchange.v2.c3p0.*
在JSP文件中<body></body>中添加代码
<%
    Connection conn=null;
    try
	{
		InitialContext ctx = new InitialContext(); 
		DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/mysqlDB"); 
		conn=ds.getConnection();
	}catch(NamingException ex)
	{
		ex.printStackTrace();
	}
	String sql="select * from user";
	PreparedStatement ps=conn.prepareStatement(sql);
	ResultSet rs=ps.executeQuery();
    while(rs.next())
	{
	   %>
	   字段1:<%=rs.getString(1)%> 字段2:<%=rs.getString(2)%><br />
	   <%
	}
    if(rs!=null)
    {
        rs.close();
        rs=null;
    }
    if(ps!=null)
    {
        ps.close();
        ps=null;
    }
    if(conn!=null)
    {
        conn.close();
        conn=null;
    }
%>
 
C3P0的另一使用方法
创建DB包,创建DBUtil类。
创建静态方法getConn(),静态方法close()。用于连接关闭数据源。
示例代码
public class DBCPTest {
    private static BasicDataSource bds = null;
    private static ConnectionFactory cf = null;
    
    static{
        bds = new BasicDataSource();
        bds.setDriverClassName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
        bds.setUrl("jdbc:sqlserver://127.0.0.1:1433;databaseName=AjaxDb");
        bds.setInitialSize(10);
        bds.setMaxActive(4);
        bds.setMaxWait(5000);
        bds.setUsername("sa");
        bds.setPassword("Zzx198461");
        cf = new DataSourceConnectionFactory(bds);
    }
    
    public static Connection getConnection() throws SQLException{
        return cf.createConnection();
    }
    
    public static void destroy() throws SQLException{
        cf = null;
        bds.close();
        bds = null;
    }
    
    public static void main(String[] args) throws Exception{
		System.out.println(DBCPTest.getConnection());
	}
}
 
三、JNDI
第一步:加载数据驱动包。
Tomcate 5.5 将数据库驱动包拷贝到tomcathome/common/lib目录下。
Tomcate 6.0 将数据库驱动包拷贝到tomcathome/lib目录下。
第二步:配置tomcat连接池文件。
在web工程中的META-INF创建context.xml文件
在文件中写入内容:
<?xml version="1.0" encoding="UTF-8"?>
<Context>
  <Resource name=“JNDI名" auth="Container"
            type=“javax.sql.DataSource” username=“用户名”               password=“密码"
            driverClassName=“驱动类"
            url=“数据连接字符串"
            maxActive="8" maxIdle="4"/>
</Context>
 
第三步:
在web.xml配置如下:
<!– 声名工程所需资源--> 
<resource-ref>
	<!– JDNI资源名 -->
  	<res-ref-name>connpool</res-ref-name>
	<!– 资源类型 -->
  	<res-type>javax.sql.DataSource</res-type>
	<!– 资源范围 -->
  	<res-auth>Container</res-auth>
</resource-ref>
 
第四步:
修改DBUtil类
public class DBUtil {

	private DBUtil() {
	}
	
	public static Connection getConn() throws Exception {
		Context initCtx = new InitialContext(); 
		Context envCtx = (Context) initCtx.lookup("java:comp/env"); 
		DataSource ds = (DataSource) 
		envCtx.lookup("connpool"); 

		return ds.getConnection(); 
	}
}
 
私有数据库连接池(Host节点里面)
<Context path="/YouWeb" docBase="F:\workspace\tea_forum\WebRoot">
   <Resource
     name="jdbc/sqlserver"
     type="javax.sql.DataSource"
     driverClassName="sun.jdbc.odbc.JdbcOdbcDriver"
     maxIdle="2"
     maxWait="5000"
     username="sa"
     password="sa"
     url="jdbc:odbc:accp"
     maxActive="4"/>
</Context>
 
公有数据库连接池
<Resource
     name="jdbc/mssql"
     type="javax.sql.DataSource"
     driverClassName="sun.jdbc.odbc.JdbcOdbcDriver"
     maxIdle="2"
     maxWait="5000"
     username="sa"
     password="sa"
     url="jdbc:odbc:accp"
     maxActive="4"/>
 
引用公有数据库连接池(Host节点里面)
<Context    path="/testjndi1" docBase="F:\workspace\testpool\WebRoot" >  
    <ResourceLink name="jdbc/mssql1" global="jdbc/mssql" type="javax.sql.DataSource"/>
</Context>
<Context    path="/testjndi2" docBase="F:\workspace\testpool2\WebRoot">  
    <ResourceLink name="jdbc/sqlserver2" global="jdbc/mssql" type="javax.sql.DataSource"/>
</Context>
 
项目工程目录WEB-INf\web.xml中配置
<!--注意:res-ref-name节点里的名字要与上面的Resource节点里的name要一致。名字可以任意取,但一定要一致。-->
<resource-ref>
	<res-ref-name>jdbc/sqlserver</res-ref-name>
	<res-type>javax.sql.DataSource</res-type>
	<res-auth>Container</res-auth>
</resource-ref>
 
JSP测试文件
<%
try{
	Context initCtx = new InitialContext();
	Context envCtx = (Context) initCtx.lookup("java:comp/env");
	DataSource ds = (DataSource) envCtx.lookup("jdbc/sqlserver");
    Connection conn = ds.getConnection();
	Statement stmt = conn.createStatement();
	ResultSet rs = stmt.executeQuery("select * from test");
	while (rs.next()) {%>
		<br><%=rs.getString(1)%>
	<%}
	out.print("<br>Successful!成功!!\n");%>
	<%
	rs.close();
	stmt.close();
	conn.close();
} catch (Exception e) {
	out.print("出现例外!" + e.getMessage());
	e.printStackTrace();
}
 
配置数据源的简单方法
(1)tomcat6.0后提供了context.xml,无需设置虚拟目录和配置web.xml
    将配置好的context.xml放到工程的META-INF\目录下
    context.xml
<Context>
     <Resource 
     name="jdbc/sqlserver"
     type="javax.sql.DataSource"
     driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
     url="jdbc:sqlserver://localhost:1433;databaseName=zf"
     username="sa"
     password="sa"
    />
</Context>
 
(2) 在程序中,通过tomcat服务器调用
InitialContext ctx = new InitialContext();
  DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/server");
  Connection conn = ds.getConnection(); 
 

总结
1、数据库连接池,可以缓存连接对象
2、传统的连接对象,在使用完后没有很好的回收
3、dbcp连接池,在多用户访问时,连接速度比较快
4、连接池可以,有效的管理数据库连接对象
5、在tomcat上配置的连接池,一定要经过tomcat的容器调用
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics