什么是java数据库连接池?
也就是数据源(DataSource),数据库连接池中可以预先创建若干数据连接对象,然后在使用的时候即可快速从池中得到数据库连接,无需再去创建,提高使用效率,节省系统开销,当连接使用完成后,调用close方法不在关闭连接,而是将连接归还到连接池。这一点有点像线程池。
太长,太官方,太抽象,不具体?
那我们来想想我们为什么需要数据库连接池?
我们知道我们每次执行DML/DQL操作的时候,都需要经历以下几步:
//1、配置mysql连接参数
String url = "jdbc:mysql:///db_num?useSSL=false";
String user = "root", password = "root";
String sql = "select * from tb_num order by num ";
//2、加载驱动
Class.forName("com.mysql.jdbc.Driver");
//3、获得连接器
Connection conn = DriverManager.getConnection(url, user, password);
//4、获取发送器
PreparedStatement pstmt =conn.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery();
// 5、处理结果
//6、关闭资源
rs.close();
pstmt.close();
conn.close();
也就是我们每进行一次ORM操作都要写一遍上边的代码,代码冗余量很大,那么我们尝试将相同代码封装成方法,需要调用即可,来减少冗余代码。
我们定义了得到连接器con和发射器pstmt的方法,每次需要数据库连接和发送时直接调用这两个方法即可,我们发现效果不错,不用每次都写大量冗余的代码,此时我们应该想一想,是不是我们每次进行ORM操作时,每调用一次我们封装的这两个方法都需要加载驱动,而加载驱动在java中很占用内存资源,最可怕的是居然加载完驱动就执行一条sql,又将驱动关闭,又创建。。。这是家里有矿啊
/**
* 得到连接器
* @return con
*/
public static Connection getCon() {
Connection con = null;
try {
Class.forName("com.mysql.jdbc.Driver");
con = DriverManager.getConnection(url, user, password);
} catch (Exception e) {
e.printStackTrace();
}
return con;
}
/**
* 发送器
* @param con
* @param sql
* @return
*/
public static PreparedStatement getPstmt(Connection con, String sql) {
PreparedStatement pstmt = null;
try {
pstmt = con.prepareStatement(sql);
} catch (Exception e) {
e.printStackTrace();
}
return pstmt;
}
所以最理想的情况是我们之创建一次,将所有SQL语句全部执行完,在关闭资源是最优解。那么怎么才能创建一次呢?对了,静态代码块。此处我们用到了软编码(配置文件)。
private static String url;
private static String user;
private static String password;
private static String driver;
static {
// 创建Properties对象
Properties prop = new Properties();
try {
//以流的形式加载db.properties资源文件
prop.load(JDBCUtils.class.getClassLoader().getResourceAsStream("db.properties"));
//为属性赋值
driver=prop.getProperty("jdbc.driver").trim();
url=prop.getProperty("jdbc.url").trim();
user=prop.getProperty("jdbc.user").trim();
password=prop.getProperty("jdbc.password").trim();
//加载驱动
Class.forName(driver);
} catch (Exception e) {
e.printStackTrace();
}
}
配置文件
# 书写格式为: key=value
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql:///db_scott?useSSL=false
jdbc.user=root
jdbc.password=root
注:此处前缀jdbc其实只是一个标识符,没有实际意义,为的就是避免跟计算机其它系统关键字发生冲突。如:user经常会取到计算机名。
至此我们完成了创建数据库连接的代码优化。但是我们发现获取一个数据库连接仍是一个麻烦的事,而且每次创建连接都是需要等待时间的,那么我们可以提前创建一定数量来避免上述问题并简化开发。