首先我们先说一下,什么是连接池?
连接池是一种创建和管理连接的缓冲池技术,这些连接已经准备好被其他的线程进行调用。
那为什么要使用连接池呢?
我们知道,连接的创建和销毁时需要时间的,而连接池就是在服务器初始化的时候,创建好一些连接,然后把它们放到内存中的连接池里,使用的时候,可以直接从内存中获取。使用完成又归还给连接池。这样从内存中获取和归还连接的效率,远远高高每次连接的创建和销毁,大大提高了服务器的性能,所以使用连接池是很用必要的。
那主流连接池有什么呢?
现在主流连接池有:Druid、C3P0、DBCP连接池等等。
我们下面使用的就是Druid连接池。Druid连接池是阿里巴巴开发的一套连接池,是目前Java项目中常用到的连接池技术。
它的优点有:
1、Druid连接池对于SQL的性能监控很严格。
2、Druid连接池的扩展性很好,用户可以自己编写filter拦截JDBC的任意方法,在上面进行扩展,例如进行用户名密码加密,sql日志等等。
3、Druid连接池支持目前大部分数据库。
下面我用一个普通Java的Demo来演示一下Druid数据库的使用。
JDBC工具类代码
import java.io.FileInputStream;
import java.io.IOException;
import java.sql.*;
import java.util.Properties;
/**
* 这是一个JDBC的工具类
*/
public class JDBCUtils{
private static final String driverClassName;
private static final String url;
private static final String username;
private static final String password;
static {
Properties properties=new Properties();
try {
properties.load(new FileInputStream("src/db.properties"));
} catch (IOException e) {
e.printStackTrace();
}
driverClassName=properties.getProperty("driverClassName");
url=properties.getProperty("url");
username=properties.getProperty("username");
password=properties.getProperty("password");
}
public static void loadDriver(){
try {
Class.forName(driverClassName);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static Connection getConnection(){
Connection conn=null;
loadDriver();
try {
conn=DriverManager.getConnection(url,username,password);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return conn;
}
public static void release(PreparedStatement prep,Connection conn) throws SQLException {
prep.close();
conn.close();
}
public static void release(ResultSet rs,PreparedStatement prep,Connection conn) throws SQLException {
rs.close();
prep.close();
conn.close();
}
public static void release(Statement statement,Connection conn) throws SQLException {
statement.close();
conn.close();
}
}
在你的src下创建一个druid.properties文件。
druid.properties代码:
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8
username=sa
password=123456
主函数代码:
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import org.junit.Test;
import javax.sql.DataSource;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;
/**
* Druid连接池的使用
*/
public class Druiddemo {
Connection conn=null;
PreparedStatement prep=null;
ResultSet rs=null;
@Test
public void test() throws Exception {
//从druid.properties中读取数据
Properties properties=new Properties();
properties.load(new FileInputStream("src\\druid.properties"));
DataSource dataSource= DruidDataSourceFactory.createDataSource(properties);
conn=dataSource.getConnection();
prep=conn.prepareStatement("select * from login");
rs=prep.executeQuery();
while (rs.next()){
System.out.println(rs.getString("id"));
System.out.println(rs.getString("name"));
}
JDBCUtils.release(rs,prep,conn);
}
}
运行结果
最后我们在图片中的红色字体处可以看到,druid连接池已经成功开启了。