连接池

     现在很多Web服务器(Weblogic, WebSphere, Tomcat)都提供了DataSoruce的实现,即连接池的实现。通常我们把DataSource的实现,按其英文含义称之为数据源,数据源中都包含了数据库连接池的实现。
也有一些开源组织提供了数据源的独立实现:
             
DBCP 数据库连接池(tomcat):DBCP 是 Apache 软件基金组织下的开源连接池实现,使用DBCP数据源,应用程序应在系统中增加如下3个 jar 文件:
                   commons-dbcp.jar:连接池的实现
                   commons-pool.jar: 连接池实现的依赖类
                   commons-collections.jar :连接池实现的集合类

连接属性设置:
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/mydb2
username=root
password=root
//测试连接池DBCP的用法
public class Demo2 {
	public static void main(String[] args) throws Exception {
		long begin = System.currentTimeMillis();
		//加载属性文件
		InputStream is = Demo2.class.getClassLoader().getResourceAsStream("cn/itcast/web/jdbc/config/dbcp.properties");
		Properties props = new Properties();
		props.load(is);
		//创建DBCP连接池工厂
		BasicDataSourceFactory factory = new BasicDataSourceFactory(); 
		//创建数据源,即连接池
		DataSource ds = factory.createDataSource(props);
		for(int i=1;i<=50000;i++){
			//从连接池中取得一个空闲的连接对象
			Connection conn = ds.getConnection();
			if(conn!=null){
				System.out.println(i+":取得连接");
			}
			//将连接对象还回给连接池
			conn.close();
		}
		long end = System.currentTimeMillis();
		System.out.println("共用" + (end-begin)/1000+"秒");
	}
}

C3P0 数据库连接池(hibernate):

//测试连接池C3P0的用法
public class Demo3 {
	public static void main(String[] args) throws Exception {
		long begin = System.currentTimeMillis();
		//创建C3P0连接池
		ComboPooledDataSource dataSource = new ComboPooledDataSource();
		for(int i=1;i<=100000;i++){
			Connection conn = dataSource.getConnection();
			if(conn!=null){
				System.out.println(i+":取得连接");
				conn.close();
			}
		}
		long end = System.currentTimeMillis();
		System.out.println("共用" + (end-begin)/1000+"秒");
	}
}


    1)传统方式找DriverManager要连接,数目是有限的。  
   2)传统方式的close(),并没有将Connection重用,只是切断应用程序和数据库的桥梁,即无发送到SQL命令到数据库端执行 
   3)项目中,对于Connection来说,不会直接使用DriverManager取得,而使用连接池方式。
   4)DBCP和C3P0,都是Java开源的,都必须直接或间接实现javax.sql.DataSource接口
   5)DBCP连接池需要dbcp.properties文件,同时需加入3个对应的jar包
  *6)C3P0连接池需要在/WEB-INF/classes/目录下存放c3p0-config.xml文件,该类ComboPooledDataSource在创建时

     会自动在指定的目录下找xml文件,并加载默认设置

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
	<default-config>
		<property name="driverClass">com.mysql.jdbc.Driver</property>
		<property name="user">root</property>
		<property name="password">root</property>
		<property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/mydb2</property>
	</default-config>
</c3p0-config>

 JNDI技术简介:

        JNDI(Java Naming and Directory Interface),Java命名和目录接口,它对应于J2SE中的javax.naming包,
这套API的主要作用在于:它可以把DataSource对象放在一个Tomcat容器中(JNDI容器),并为容器中的DataSource对象取一个名称,以后程序想获得DataSource对象,只需通过名称检索即可。
其核心API为Context,它代表JNDI容器,其lookup方法为检索容器中对应名称的对象。

JNDI和在tomcat中配置DBCP连接池

  a)JNDI是Java命名和目录接口,不同的Web服务器有着不同的实现
  b)不同进程之间,可不同机器之间访问,叫远程访问
  c)JNDI和JDBC一样,都属于JavaEE规则之一
  d)基于tomcat如何配置DBCP连接池
>>修改tomcat/conf/context.xml文件
        >>加入DB相关的jar包到tomcat/lib目录下
>>重新启动tomcat服务器
  e)访问tomcat服务器的JNDI代码如下,是固定的:

Context tomcatContext = (Context) context.lookup("java:comp/env");  

//通过JNDI远程访问Tomcat服务器中的DBCP连接池
public class JndiServlet extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
		try {
			//创建具体Web服务器的JNDI对象
			Context context = new InitialContext();
			//远程查找Web服务器
			Context tomcatContext = (Context) context.lookup("java:comp/env");
			//在Web服务器内远程查找DBCP连接池服务
			DataSource ds = (DataSource) tomcatContext.lookup("tomcatDS");
			//从DBCP连接池中取得一个空闲的连接
			Connection conn = ds.getConnection();
			//显示结果
			if(conn!=null){
				response.setContentType("text/html;charset=UTF-8");
				response.getWriter().write("取得连接");
				conn.close();
			}
		} catch (Exception e) {
			e.printStackTrace();
		} 
	}
}


Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐