Java语法进阶及常用技术(二)--数据库连接池和Commons DBUtils

阿里巴巴Druid连接池

Druid是阿里巴巴开源连接池组件,是最好的连接池之一。
Druid对数据库连接进行有效管理与重用,最大化程序执行效率。
连接池负责创建管理连接,程序只负责取用与归还。
Java语法进阶及常用技术(二)--数据库连接池和Commons DBUtils_第1张图片

Druid连接池配置与使用

Druid的github地址:
https://github.com/alibaba/druid
第一步:在项目中引入jar包:
把jar复制到项目中,再点File->Project Structure将jar包加入工程依赖中。
Java语法进阶及常用技术(二)--数据库连接池和Commons DBUtils_第2张图片
第二步:在src目录下创建druid-config.properties属性文件

driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/databaseName?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrievel=true
username=root
password=root
initialSize=20
maxActive=20

最大的连接数最好超过最大的用户并发数。
一般把初始值和最大值设置一致,程序一开始就把所有连接创建好,使用的时候直接使用现成的连接,避免出现重新创建连接的情况,有效提升程序管理性能。

第三步:代码中使用

public class DruidSample{
	public static void main(String[] args){
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null
		//1.加载属性文件
		Properties properties = new Properties();
		String propertyFile = DruidSample.class.getResource("/druid-config.properties").getPath();
		try{
			//容错考虑,读取路径时会把空格或中文会被编码,如
			//空格->%20 c:\java code=>c:\java%20code
			//URLDecoder可以%20还原成空格,读路径不会出错
			propertyFile = new URLDecoder().decode(propertyFile,"UTF-8");
			properties.load(new FileInputStream(propertyFile));
			
			//2.获取DataSource数据源对象(数据源就是数据库在JDBC中的别称)
			DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
			//3.创建数据库连接
			conn = dataSource.getConnection();
			pstmt = conn.preparaStatement("select * from employee limit 0,10");
			rs = pstmt.executeQuery();
			while(rs.next()){
				Integer eno = rs.getInt(1);//JDBC中字段索引从1开始,而非0
				String ename = rs.getString("ename");
				sout(eno+":"+ename);
			}
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			//不适用连接池:conn.close()关闭连接
			//使用连接池:conn.close()将连接回收至连接池
			DbUtils.closeConnection(rs,pstmt,conn);
		}
	}
}

在Navicat的工具=>服务器监控=>MySQL可以查看目前已经创建的数据库连接
Java语法进阶及常用技术(二)--数据库连接池和Commons DBUtils_第3张图片

C3P0连接池

c3p0连接池官网
https://www.mchange.com/projects/c3p0/
引入C3P0连接池需要引入c3p0-0.9.5.5.jar和mchange-commons-java-0.2.19.jar两个jar包,引入方法和druid连接池一样。
然后创建属性文件c3p0-config.xml(注意,属性文件名为固定):


<c3p0-config>
	<default-config>
		<property name="driverClass">com.mysql.cj.jdbc.Driverproperty>
		<property name="jdbcUrl">jdbc:mysql://localhost:3306/databaseName?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrievel=trueproperty>
		<property name="user">rootproperty>
		<property name="password">rootproperty>
		
		<property name="initialPoolSize">10property>
		
		<property name="maxPoolSize">20property>
	default-config>
c3p0-config>

最后代码中使用:

public class C3P0Sample{
	public static void main(String[] args){
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null
		try{
			//1.加载配置文件
			//2.创建DataSource
			DataSource dateSource = new ComboPooledDataSource();
			//3.得到数据库连接
			conn = dataSource.getConnection();
			pstmt = conn.preparaStatement("select * from employee limit 0,10");
			rs = pstmt.executeQuery();
			while(rs.next()){
				Integer eno = rs.getInt(1);//JDBC中字段索引从1开始,而非0
				String ename = rs.getString("ename");
				sout(eno+":"+ename);
			}
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			//不适用连接池:conn.close()关闭连接
			//使用连接池:conn.close()将连接回收至连接池
			DbUtils.closeConnection(rs,pstmt,conn);
		}
	}
}

Apache Commons DBUtils

commons-dbutils是Apache提供的开源JDBC工具类库。
它是对JDBC的简单封装,学习成本极低。
使用commons-dbutils可以极大简化JDBC编码工作量
commons-dbutils官网:
https://commons.apache.org/proper/commons-dbutils/
首先,引入commons-dbutils-1.7.jar包,然后代码中使用:

//Apache Commons DBUtils + Druid联合使用案例
public class DbUtilsSample{
	//查询
	private static void query(){
		Properties properties = new Properties();
		String propertyFile = DruidSample.class.getResource("/druid-config.properties").getPath();
		try{
			propertyFile = new URLDecoder().decode(propertyFile,"UTF-8");
			properties.load(new FileInputStream(propertyFile));
			DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
			QueryRunner qr = new QueryRunner(dataSource);
			List<Employee> list = qr.query("select * from employee limit ?,10",
				new BeanListHandler<>(Employee.class),
				Object[]{10});
			for(Employee emp: list){
				sout(emp.getName());
			}
		}catch(Exception e){
			e.printStackTrace();
		}
	}
		
	//写入操作,包括新增、更新、删除
	public static void update(){
		Properties properties = new Properties();
		String propertyFile = DruidSample.class.getResource("/druid-config.properties").getPath();
		Connection conn = null;
		try{
			propertyFile = new URLDecoder().decode(propertyFile,"UTF-8");
			properties.load(new FileInputStream(propertyFile));
			DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
			conn = dataSource.getConnection();
			conn.setAutoCommit(false);
			String sql1 = "update employee set salary=salary+1000 where eno =?";
			String sql2 = "update employee set salary=salary-500 where eno =?";
			QueryRunner qr = new QueryRunner();
			qr.update(conn,sql1,new Object[]{1000});
			qr.update(conn,sql2,new Object[]{1001});
			conn.commit();
		}catch(Exception e){
			e.printStackTrace();
			try{
				if(conn!=null && !conn.isClosed())
					conn.rollback();
			}catch(Exception ex){
				ex.printStackTrace();
			}
		}finally{
			try{
				if(conn!=null && !conn.isClosed())
					conn.close();
			}catch(Exception ex){
				ex.printStackTrace();
			}
		}
	}
}

你可能感兴趣的:(Java工程师,mysql,java)