阅读 57

数据库连接池

数据库连接池

使用JDBC操作数据库,需要建立Connection,使用传统的JDBC操作需要每次创建Connection,创建Connection是一个非常性能和消耗时间的过程,我们需要在提高程序性能,那么就需要减少每次创建创建连接带来的负面影响,解决这个问题我们将利用池子概念,预先创建一些链接放入池子中,如果需要操作数据,不用创建新的Connection,只需要在池子中获取即可,使用完毕放入池子!这样就形成了复用!

1.DBCP连接池

DBCP(DataBase connection pool),数据库连接池。是 apache 上的一个 java 连接池项目,也是 tomcat 使用的连接池组件。单独使用dbcp需要2个包:commons-dbcp.jar,commons-pool.jar由于建立数据库连接是一个非常耗时耗资源的行为,所以通过连接池预先同数据库建立一些连接,放在内存中,应用程序需要建立数据库连接时直接到连接池中申请一个就行,用完后再放回去。

1.1创建项目

创建项目:创建java项目

1.2导入相应jar包

mysql-jdbc.jar
commons-dbcp.jar
commons-pool.jar

1.3硬编码方式使用DBCP连接池

所谓的硬编码方式就是在代码中添加配置

@Test
public void testHard() throws SQLException{
		//TODO 硬编码 使用DBCP连接池子
		BasicDataSource source = new BasicDataSource();
		//设置连接的信息  
		source.setDriverClassName("com.mysql.jdbc.Driver");
		source.setUrl("jdbc:mysql://localhost:3306/day2");
		source.setUsername("root");
		source.setPassword("111");
		
		Connection connection = source.getConnection();
		
		String sql = "select * from student";
		
		Statement createStatement = connection.createStatement();
		
		ResultSet executeQuery = createStatement.executeQuery(sql);
		
		while (executeQuery.next()) {
			 
			System.out.println(executeQuery.getString(2));
		}
		connection.close(); //回收
	}

1.4软编码方式使用DBCP连接池

所谓的软编码,就是在项目中添加配置文件,这样就不需要每次代码中添加配合!

1.4.1

项目中添加配置

? 文件名称: info.properties

? 文件位置: src下

#连接设置
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/day2
username=root
password=111
#
initialSize=10
#最大连接数量
maxActive=50
#
maxIdle=20
#
minIdle=5
#
maxWait=6000
@Test
	public void testSoft() throws Exception{
		//TODO DBCP软编码连接池子使用
		BasicDataSourceFactory factory = new BasicDataSourceFactory();
		Properties properties = new  Properties();
		//配置文件添加到properties对象中  javase
		properties.load(new FileInputStream("src/info.properties"));
		//生成连接池子  需要配置文件
		DataSource source = factory.createDataSource(properties);
        Connection connection = source.getConnection();
		String sql = "select * from student";
		Statement createStatement = connection.createStatement();
		ResultSet executeQuery = createStatement.executeQuery(sql);
		while (executeQuery.next()) {
			System.out.println(executeQuery.getString(2));
		}
		connection.close(); //回收
	}

2.C3P0连接池

C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate,Spring等。

2.1c3p0与dbcp区别

 1.
	dbcp没有自动回收空闲连接的功能
	c3p0有自动回收空闲连接功能
 2. 
 	dbcp需要手动设置配置文件
    c3p0不需要手动设置

2.2创建项目

2.3 导入jar包

?> c3p0-0.9.1.2.jar

mysql-connector-java-5.0.8.jar

2.4添加配置文件

c3p0是在外部添加配置文件,工具直接进行应用,因为直接引用,所以要求固定的命名和文件位置
文件位置: src

文件命名:c3p0-config.xml/c3p0-config.properties


	
	
		
		com.mysql.jdbc.Driver
		jdbc:mysql://localhost:3306/day2
		root
		111
		
		
		30000
		
		30
		10
		 
		30
		100
		10
		200
	 
	
	
		com.mysql.jdbc.Driver
		jdbc:mysql://localhost:3306/day2
		root
		111
		
		5
		20
		10
		40
		20
		5
	
 

注意: c3p0的配置文件内部可以包含命名配置文件和默认配置文件!默认是选择默认配置!如果需要切换命名配置可以在创建c3p0连接池的时候填入命名即可!

2.5使用c3p0进行数据库操作

public class TestC3p0 {
  
	public static void main(String[] args) throws Exception {
		
		//1.创建C3P0连接池子
		Connection connection = DataSourceUtils.getConnection();
		
		Statement createStatement = connection.createStatement();
		
		String sql = "select * from student;";
		
		ResultSet resultSet = createStatement.executeQuery(sql);
		
		while (resultSet.next()) {
			
			System.out.println(resultSet.getString(1));
		}
		DataSourceUtils.close(connection, createStatement, resultSet);
    }	
}

2.6使用c3p0连接池编写工具类

/**
 * 从连接池子中获取连接!
 * 
 *  C3P0的连接池子
 *  0.获取连接池子对象  DBUtils
 *  1.获取连接
 *  2.关闭资源
 */
public class DataSourceUtils {
	
	private static  ComboPooledDataSource  dataSource = new ComboPooledDataSource();	
	
	/**
	 * 返回连接池对象方法
	 * @return c3p0连接池子
	 */
	public static  ComboPooledDataSource getDataSource(){
		return dataSource;
	}
	
	/**
	 * 连接池中获取连接的方法 
	 * @return 连接
	 */
	public static Connection getConnection(){
		
		Connection conn  = null;
		try {
			conn = dataSource.getConnection();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return conn;
	}

	//关闭资源
	public static void close(Connection conn){
		if (conn != null) {
			try {
				conn.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

	public static  void close(Statement st){
		
		if (st != null) {
			try {
				st.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	
	public  static void close(ResultSet  set){
		
		if (set != null) {
			try {
				set.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

	public static void close(Connection conn,Statement st){
		close(conn);
		close(st);
	}

	public  static void close(Connection conn,Statement st,ResultSet rt){
		close(conn);
		close(st);
		close(rt);
	}	
}

3.Druid连接池

Druid 是目前比较流行的高性能的,分布式列存储的OLAP框架(具体来说是MOLAP)。它有如下几个特点:
一. 亚秒级查询
druid提供了快速的聚合能力以及亚秒级的OLAP查询能力,多租户的设计,是面向用户分析应用的理想方式。
二.实时数据注入
druid支持流数据的注入,并提供了数据的事件驱动,保证在实时和离线环境下事件的实效性和统一性
三.可扩展的PB级存储
druid集群可以很方便的扩容到PB的数据量,每秒百万级别的数据注入。即便在加大数据规模的情况下,也能保证时其效性
四.多环境部署
druid既可以运行在商业的硬件上,也可以运行在云上。它可以从多种数据系统中注入数据,包括hadoop,spark,kafka,storm和samza等
五.丰富的社区
druid拥有丰富的社区,供大家学习

3.1使用步骤

3.1.1导入jar包

druid-1.0.9.properties

3.1.2编写工具类

 /**
 * 阿里的数据库连接池
 * 性能最好的
 * Druid
 * */
public class DruidUtils {
	//声明连接池对象
	private static DruidDataSource ds;
	static{
		///实例化数据库连接池对象
		ds=new DruidDataSource();
		//实例化配置对象
		Properties properties=new Properties();
		try {
			//加载配置文件内容
		properties.load(DruidUtils.class.getResourceAsStream("dbcpconfig.properties"));
			//设置驱动类全称
			ds.setDriverClassName(properties.getProperty("driverClassName"));
			//设置连接的数据库
			ds.setUrl(properties.getProperty("url"));
			//设置用户名
			ds.setUsername(properties.getProperty("username"));
			//设置密码
			ds.setPassword(properties.getProperty("password"));
			//设置最大连接数量
			ds.setMaxActive(Integer.parseInt(properties.getProperty("maxActive")));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	//获取连接对象
	public static Connection getConnection() {
		try {
			return ds.getConnection();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}	
}

4.改进JdbcUtils工具类

public class JDBCUtils {

		    //1.定义成员变量 DataSource
		    private static DataSource ds ;
		
		    static{
		        try {
		            //1.加载配置文件
		            Properties pro = new Properties();
		            pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
		            //2.获取DataSource
		            ds = DruidDataSourceFactory.createDataSource(pro);
		        } catch (IOException e) {
		            e.printStackTrace();
		        } catch (Exception e) {
		            e.printStackTrace();
		        }
		    }
		    /**
		     * 获取连接
		     */
		    public static Connection getConnection() throws SQLException {
		        return ds.getConnection();
		    }
		    /**
		     * 获取连接池方法
		     */
		
		    public static DataSource getDataSource(){
		        return  ds;
		    }
		    
		    
}

原文:https://www.cnblogs.com/xjl920912/p/15227640.html

文章分类
代码人生
文章标签
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐