Druid是阿里巴巴开源连接池组件,是最好的连接池之一。
Druid对数据库连接进行有效管理与重用,最大化程序执行效率。
连接池负责创建管理连接,程序只负责取用与归还。
Druid的github地址:
https://github.com/alibaba/druid
第一步:在项目中引入jar包:
把jar复制到项目中,再点File->Project Structure将jar包加入工程依赖中。
第二步:在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可以查看目前已经创建的数据库连接
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);
}
}
}
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();
}
}
}
}