数据库连接池规范
上节是我们模拟编写了一个数据库连接池,对于不同的开发者可能会编写出五花八门的数据库连接池,这对于代码后期的维护和使用会有非常多的问题,为了能够统一数据库连接池的编写规范,让开发者编写出统一标准的数据库连接池.
sun公司提供了一个规范,该规范其实就是一个位于javax.sql包下的DataSource的接口,也叫作数据源,如果要想自己编写数据库连接池,那么需要去实现该接口,有了这个标准之后,我们只要是看到了一个类实现了该接口,那就说明这个类是一个数据库连接池,该接口提供了两个重载的getConnection方法:
Connection getConnection() throws SQLException;
Connection getConnection(String username, String password) throws SQLException;
例:【创建MyPool类去实现DataSource接口,这样就创建好了一个符合规范的数据库连接池。】
package Pool; import Util.DB; import javax.sql.DataSource; import java.io.PrintWriter; import java.sql.Connection; import java.sql.SQLException; import java.sql.SQLFeatureNotSupportedException; import java.util.Collections; import java.util.LinkedList; import java.util.logging.Logger; public class MyPool implements DataSource { // 创建一个存放连接的池子 private static LinkedList<Connection> pool = (LinkedList<Connection>) Collections .synchronizedList(new LinkedList<Connection>()); static { try { for (int i = 0; i < 10; i++) { Connection conn = DB.GetConnection(); pool.add(conn); } } catch (Exception e) { throw new ExceptionInInitializerError("初始化数据库连接失败,请检查配置文件是否正确!"); } } @Override public Connection getConnection() throws SQLException { Connection conn = null; if (pool.size() > 0) { //将连接池中的一个连接取出 conn = pool.removeFirst(); return conn; } else { // 此时说明连接池中已经没有空闲连接了,需要等待 throw new RuntimeException("服务器忙。。。"); } } @Override public Connection getConnection(String username, String password) throws SQLException { return null; } @Override public <T> T unwrap(Class<T> iface) throws SQLException { return null; } @Override public boolean isWrapperFor(Class<?> iface) throws SQLException { return false; } @Override public PrintWriter getLogWriter() throws SQLException { return null; } @Override public void setLogWriter(PrintWriter out) throws SQLException { } @Override public void setLoginTimeout(int seconds) throws SQLException { } @Override public int getLoginTimeout() throws SQLException { return 0; } @Override public Logger getParentLogger() throws SQLFeatureNotSupportedException { return null; } }
代码里面的DB上章有 就是个获取Connection的:
下面编写数据库连接池测试类伪代码:
import Pool.MyPool; import javax.sql.DataSource; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; public class Test { public static void main(String[] args) throws SQLException { DataSource dataSource = new MyPool(); Connection conn = null; PreparedStatement ps = null; try { conn = dataSource.getConnection(); ps = conn.prepareStatement("SQL语句 这里不写了 只是为了测试"); ps.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); }finally { conn.close(); // 这里不能关闭!!!!这里未采用自动关闭 因为是数据库连接池 下一章介绍 } } }
大概流程就是这样 但是不能关闭数据库连接池!!!这里只是举个例子例子哦