数据库连接池
什么是数据库连接池:
数据库连接池就是系统预先为客户准备好的数据库的连接集合,集合内有多个连接,每当用户请求连接时系统就给该用户发放一个连接,用户用完后再归还给系统。
为什么要使用连接池:
用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长。假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大的浪费数据库的资源,并且极易造成数据库服务器内存溢出、拓机。
如何创建一个数据库连接池:
Java为连接池实现提供了一个规范(接口),规范的写法,我们需要实现DataSource接口,然后实现相应的方法即可。
一、自定义实现连接池
为了从本质上理解数据库连接池的实现原理,可以自定义实现一个连接池。
本连接池只是简单的实现了连接池的取得连接的功能,并为其添加了归还连接的方法,其他方法均未实现。
public class MyBdcp implements DataSource { //定义线程安全的数据库连接集合 public static List<Connection> connList = Collections.synchronizedList(new ArrayList<>()); public static String driver = "com.mysql.jdbc.Driver"; public static String url = "jdbc:mysql://localhost:3306/emp"; public static String userName = "root"; public static String password = "root"; static { //注册驱动 try { Class.forName(driver); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } //向集合内添加10个数据库连接 try { Connection conn = null; for (int i = 0; i < 10; i++) { conn = DriverManager.getConnection(url, userName, password); connList.add(conn); } } catch (SQLException e) { e.printStackTrace(); } } //取得一个连接,若池中没有连接了就返回一个null @Override public Connection getConnection() throws SQLException { Connection conn = null ; if (connList.size()>0) { conn = connList.remove(0) ; System.out.println("连接池中的连接数为:" + connList.size()); return conn ; } return null; } //交还连接,并将其添加到池中 public void result(Connection conn) { connList.add(conn) ; } //以下方法均为实现 @Override public PrintWriter getLogWriter() throws SQLException { // TODO Auto-generated method stub return null; } @Override public void setLogWriter(PrintWriter out) throws SQLException { // TODO Auto-generated method stub } @Override public void setLoginTimeout(int seconds) throws SQLException { // TODO Auto-generated method stub } @Override public int getLoginTimeout() throws SQLException { // TODO Auto-generated method stub return 0; } @Override public Logger getParentLogger() throws SQLFeatureNotSupportedException { // TODO Auto-generated method stub return null; } @Override public <T> T unwrap(Class<T> iface) throws SQLException { // TODO Auto-generated method stub return null; } @Override public boolean isWrapperFor(Class<?> iface) throws SQLException { // TODO Auto-generated method stub return false; } @Override public Connection getConnection(String username, String password) throws SQLException { // TODO Auto-generated method stub return null; } }