1 数据库连接池
2 自定义连接池 2.1 简单的连接池
1.链接:
提取码:1234
在百度网盘内导入jar包
2.java.sql.接口:数据源(数据库连接池) 。java官方提供的数据库连接池规范(接口)
/*自定义连接池类*/public class MyDataSource implements DataSource{//定义集合容器,用于保存多个数据库连接对象private static List pool = Collections.synchronizedList(new ArrayList());//静态代码块,生成10个数据库连接保存到集合中static {for (int i = 0; i < 10; i++) {Connection con = JDBCUtils.getConnection();pool.add(con);}}//返回连接池的大小public int getSize() {return pool.size();}//从池中返回一个数据库连接@Overridepublic Connection getConnection() {if(pool.size() > 0) {//从池中获取数据库连接return pool.remove(0);}else {throw new RuntimeException("连接数量已用尽");}}@Overridepublic Connection getConnection(String username, String password) throws SQLException {return null;}@Overridepublic T unwrap(Class iface) throws SQLException {return null;}@Overridepublic boolean isWrapperFor(Class> iface) throws SQLException {return false;}@Overridepublic PrintWriter getLogWriter() throws SQLException {return null;}@Overridepublic void setLogWriter(PrintWriter out) throws SQLException {}@Overridepublic void setLoginTimeout(int seconds) throws SQLException {}@Overridepublic int getLoginTimeout() throws SQLException {return 0;}@Overridepublic Logger getParentLogger() throws SQLFeatureNotSupportedException {return null;}}自定义连接池测试public class MyDataSourceTest {public static void main(String[] args) throws Exception{//创建数据库连接池对象MyDataSource dataSource = new MyDataSource();System.out.println("使用之前连接池数量:" + dataSource.getSize());//获取数据库连接对象Connection con = dataSource.getConnection();System.out.println(con.getClass());// (结果)JDBC4Connection//查询学生表全部信息String sql = "SELECT * FROM student";PreparedStatement pst = con.prepareStatement(sql);ResultSet rs = pst.executeQuery();while(rs.next()) {System.out.println(rs.getInt("sid") + "\t" + rs.getString("name") + "\t" + rs.getInt("age") + "\t" + rs.getDate("birthday"));}//释放资源rs.close();pst.close();//目前的连接对象close方法,是直接关闭连接,而不是将连接归还池中con.close();System.out.println("使用之后连接池数量:" + dataSource.getSize());}}
2.2 归还连接 (1)错误演示
为什么我们要有归还连接呢?
通过上面的代码运行后发现,运行前连接池的数量是10,运行后连接池的数量为9.而close方法是直接关闭连接,而不是将连接归还池中 。所以我们有了归还连接,通过上述的案例我们中有一个con.方法,用来获取调用该方法的对象的类,发现是 。所以我们有了一个想法,自定义一个类,继承这个类,咱们去重写close方法 。
/*自定义Connection类*/public class MyConnection1 extends JDBC4Connection {//声明连接对象和连接池集合对象private Connection con;private List pool;//通过构造方法给成员变量赋值public MyConnection1(String hostToConnectTo, int portToConnectTo, Properties info, String databaseToConnectTo, String url,Connection con,List pool) throws SQLException {super(hostToConnectTo, portToConnectTo, info, databaseToConnectTo, url);this.con = con;this.pool = pool;}//重写close()方法,将连接归还给池中@Overridepublic void close() throws SQLException {pool.add(con);}}
在MyDataSource中修改 。//将之前的连接对象换成自定义的子类对象private static MyConnection1 con;//4.获取数据库连接的方法public static Connection getConnection() {try {//等效于:MyConnection1 con = new JDBC4Connection();语法错误!con = DriverManager.getConnection(url,username,password);//报错,不对应} catch (SQLException e) {e.printStackTrace();}return con;}