为什么使用连接池?
简言之:减少没必要的系统开销
凡是涉及到数据库访问的web应用,数据库连接管理是一个难点,也是未来大型应用性能优化的重点,如果对于连接资源管理混乱,将会使系统资源开销过大。制约大型应用性能的提升。
优化方案:使用连接池技术,将创建好的连接资源管理起来,当需要使用连接时,从连接池中获取,使用完毕之后将连接还回连接池,避免重复的创建和销毁连接资源,较少系统的开销。
怎样简单的使用连接池?
引入文件。百度云链接容易失效就不放,本博客仅用于个人学习,有想学的可以找我要文件,私信就行。
Dbcp 是连接池的一种实现方式
1 导入dbcp 相关的jar包
2 导入dbcp的配置文件, 的dbcp.properties .
方法和前面一样。
再导入一个新的对应键。
对工具类进行升级,稍后会对工具类那篇文章进行更新。
package util;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSourceFactory;
public class jdbcUtil3 {
//创建连接池
static DataSource pool = null;
//创建properties
static Properties pro = new Properties();
//创建Thread local<Connection>,可以为同一个线程保存同一个连接,为不同线程保存不同的连接
private static ThreadLocal<Connection> tl = new ThreadLocal<Connection>();
//加载配置文件到流对象后创建连接池
static{
InputStream is = null;
try {
//加载properties文件到properties对象中
is = jdbcUtil3.class.getResourceAsStream("/conf/dbcp.properties");
pro.load(is);
// Class.forName(pro.getProperty("driverClassName"));
//创建连接池
pool = BasicDataSourceFactory.createDataSource(pro);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally{
try {
is.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//获取连接
public static Connection getConnection() throws Exception{
Connection conn = tl.get();//获得当前线程中的连接
//如果当前线程中没有连接,就获取连接(使用连接池)
if(conn == null){//如果当前线程中没有连接
String url = pro.getProperty("url");
String user = "root";
String password = "root123";
//创建连接
conn = pool.getConnection();
//将连接保存到当前线程
tl.set(conn);
}
return conn;
}
//释放资源/关闭连接
public static void release(ResultSet rs,PreparedStatement psm,Connection conn) throws SQLException{
if(rs!=null){
rs.close();
}
if(psm!=null){
psm.close();
}
if(conn!=null){
conn.close();
//关闭连接时,将连接从当前线程中移出,防止,内存溢出
tl.remove();
}
}
}
测试一下吧:
package jdbc;
import java.sql.Connection;
import util.jdbcUtil3;
public class TestjdbcUtil3 {
public static void main(String[] args) throws Exception {
Connection conn = jdbcUtil3.getConnection();
System.out.println(conn);
Connection conn1 = jdbcUtil3.getConnection();
System.out.println(conn1);
Connection conn2 = jdbcUtil3.getConnection();
System.out.println(conn2);
Thread t1 = new Thread(){
public void run(){
Connection conn3;
try {
conn3 = jdbcUtil3.getConnection();
System.out.println("t1: " +conn3);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
t1.start();
}
}
结果为:,,你没有看错,用连接池连接的,会有点不一样,不是干瘪的一行地址了
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/114778.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...