【JavaWeb】2.封装jdbc工具类

本文探讨了两种不同的JDBC连接管理方式:一是使用ThreadLocal维护每个线程的数据库连接,以确保事务的正确性;二是引入阿里巴巴的Druid数据库连接池,通过配置初始化大小、最大活跃连接数等参数来优化数据库资源的使用。这两种方法都旨在提高应用的性能和并发能力。
摘要由CSDN通过智能技术生成
  1. 初始版本
public final class JDBCUtil{
    //定义数据库连接相关参数
    private static String driver = "";
    private static String url = "";
    private static String user = "";
    private static String password = "";
    
    //私有化构造方法
    private JDBCUtil(){}
    
    //加载配置文件
    static {
        ResourceBundle bundle = ResourceBundle.getBundle("jdbc");
        driver = bundle.getString("driver");
        url = bundle.getString("url");
        user = bundle.getString("user");
        password = bundle.getString("password");
        
        //注册驱动
        try {
            Class.forName(driver);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
    
    //获取数据库连接
    public static Connection getConnection() {
        Connection connection = null;
        try {
            connection = DriverManager.getConnection(url, user, password);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return connection;
    }
    
    //关闭资源
    public static void closeAll(Connection con, Statement stmt, ResultSet rs){
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace():
            }
        }
        
        if (stmt != null) {
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        
        if (con != null) {
            try {
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}
  1. 为了保证每个能够开启以及回滚事务,需要改进的JDBCUtil
public final class JDBCUtil {
    private static String driver = "";
    private static String url = "";
    private static String user = "";
    private static String password = "";
    
    //创建ThreadLocal类的对象,用于维护每个线程的数据库连接
    private static ThreadLocal<Connection> threadLocal = new ThreadLocal<>();
    //保证了每个线程只会有同一个Connection连接对象,如果使用单例的话,所有用户都必须要等待。
    
    //加载配置文件
    static {
        ResourceBundle bundle = ResourceBundle.getBundle("jdbc");
        driver = bundle.getString("driver");
        url = bundle.getString("url");
        user = bundle.getString("user");
        password = bundle.getString("password");
        
        //注册驱动
        try {
            Class.forName(driver);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
    
    //获取数据库连接
    public static Connection getConnection() {
        if (threadLocal.get() == null) {
            try {
                threadLocal.set(DriverManager.getConnection(url, user, password);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        
        return threadLocal.get();
    }
    
    //关闭资源
    public static void closeAll(Connection con, Statement stmt, ResultSet rs){
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace():
            }
        }
        
        if (stmt != null) {
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        
        if (con != null) {
            try {
                con.close();
                threadLocal.remove();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}
  1. 以上两种方式的配置文件
    jdbc.properties
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/jgs1904?useSSL=true&serverTimezone=GMT%2B8
user=root
password=root
  1. 使用alibaba的druid数据库连接池
public final class DataSourceUtil {

	private DataSourceUtil() {};
	
	private static Properties pro = new Properties();
	private static ThreadLocal<Connection> threadLocal = new ThreadLocal<>();
	private static DataSource dataSource = null;
	
	static {
		// 1.将配置文件加载到properties集合内 
		InputStream is = Demo02.class.getClassLoader().getResourceAsStream("druid.properties");
		try {
			pro.load(is);
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		// 2.使用properties集合内的配置参数初始化一个连接池
		try {
			dataSource = DruidDataSourceFactory.createDataSource(pro);
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}
	
	// 获取数据库连接池
	public static DataSource getDataSource() {
		return dataSource;
	}
	
	// 获取数据库连接
	public static Connection getConnection() {
		if (threadLocal.get() == null) {
			try {
				threadLocal.set(dataSource.getConnection());
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		
		return threadLocal.get();
	}
	
	// 关闭资源
	public static void closeAll(Connection con, Statement stmt, ResultSet rs) {
		if (rs != null) {
			try {
				rs.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}

		if (stmt != null) {
			try {
				stmt.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}

		if (con != null) {
			try {
				con.close();
				// 销毁threadLocal中的连接对象
				threadLocal.remove();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}

	}
}
  1. 配置文件 druid.properties
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/jgs1904?useSSL=true&serverTimezone=GMT%2B8
username=root
password=root

#初始化时池中建立的连接数。
initialSize=2
#最大的可活跃的连接池数量
maxActive=300
#最大等待时间
maxWait=60000
#是否缓存preparedStatement
poolPreparedStatements=true
#池中能够缓冲的preparedStatement语句数量
maxPoolPreparedStatementPerConnectionSize=200
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JeffHan^_^

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>