zoukankan      html  css  js  c++  java
  • java:数据库连接池

    一、什么是数据库连接池?

    官方:数据库连接池(Connection pooling)是程序启动时建立足够的数据库连接,并将这些连接组成一个连接池,由程序动态地对池中的连接进行申请,使用,释放。
    个人理解:创建数据库连接是一个很耗时的操作,也容易对数据库造成安全隐患。所以,在程序初始化的时候,集中创建多个数据库连接,并把他们集中管理,供程序使用,可以保证较快的数据库读写速度,还更加安全可靠。

    二、数据库连接池的运行机制

    (1)  程序初始化时创建连接池
    (2) 使用时向连接池申请可用连接
    (3) 使用完毕,将连接返还给连接池
    (4) 程序退出时,断开所有连接,并释放资源

    三、数据库连接池的使用

    作为开源的数据库连接池,C3P0是一个优秀的连接池,性能也十分可靠。



    首先到http://sourceforge.net/projects/c3p0/下载相应的jar包,总共三个,如下图所示。

    其次将jar包导入到工程当中,然后就可以使用cp30了。

    示例代码如下:

    package com.zww.server;
    import java.beans.PropertyVetoException;
    import java.sql.Connection;
    import java.sql.SQLException;
    import com.mchange.v2.c3p0.ComboPooledDataSource;
    public class ConnectionManager {
    //使用单例模式创建数据库连接池
    	private static ConnectionManager instance;
    	private static ComboPooledDataSource dataSource;
    	private ConnectionManager()throws SQLException,PropertyVetoException{
    		dataSource=new ComboPooledDataSource();
    		dataSource.setUser("root");//用户名
    		dataSource.setPassword("345678");//密码
    		dataSource.setJdbcUrl("jdbc:mysql://127.0.0.1:3306/zrr");//数据库地址
    		dataSource.setInitialPoolSize(5);//初始化连接数
    		dataSource.setMinPoolSize(1);//最小连接数
    		dataSource.setMaxPoolSize(20);//最大连接数
    		dataSource.setMaxStatements(50);//最长等待时间
    		dataSource.setMaxIdleTime(60);//最大空闲时间(毫秒)
    	}
    	public static final ConnectionManager getInstance(){
    		if(instance==null){
    			try {
    				instance = new ConnectionManager();
    			} catch (Exception e) {
    				e.printStackTrace();
    			}
    		}
    		return instance;
    	}
    	public synchronized final Connection getConnection(){
    		Connection conn=null;
    		try {
    			conn=dataSource.getConnection();
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
    		return conn;
    	}
    }
    

      

    package com.zww.server;
    
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    
    public class ConnectionDemo {
    public static void main(String[] args) {
    	System.out.println("用连接池--------------------");
    	for(int i=0;i<20;i++){
    		long beginTime=System.currentTimeMillis();
    		Connection conn=ConnectionManager.getInstance().getConnection();
    		try {
    			PreparedStatement pstmt = conn
    					.prepareStatement("select * from event ");
    			ResultSet rs = pstmt.executeQuery();
    			while (rs.next()) {
    				//do nothing
    			}
    		} catch (Exception e) {
    			e.printStackTrace();
    		}finally{
    			try {
    				conn.close();
    			} catch (SQLException e) {
    				e.printStackTrace();
    			}
    		}
    		long endTime=System.currentTimeMillis();
    		System.out.println("第"+(i+1)+"次执行时间为:"+(endTime-beginTime));
    	}
    }
    }
    

      测试结果表明,在使用连接池时,只在第一次初始化时,比较耗时,完成初始化之后,使用连接池进行数据库操作明显比不使用连接池花费的时间少。

  • 相关阅读:
    UVA1292-----Strategic game-----树形DP解决树上的最小点覆盖问题
    【OpenGL游戏开发之三】OpenGl核心函数库汇总
    【Lucene】挖掘相关搜索词
    OpenMP入门教程(三)
    OpenMP入门教程(二)
    OpenMP入门教程(一)
    结构体的排序
    结构体
    循环群、对称群、陪集和拉格朗日定理、正规子群和商群
    概率论与数理统计(一)—— 随机事件与概率
  • 原文地址:https://www.cnblogs.com/ipetergo/p/6613017.html
Copyright © 2011-2022 走看看