以下内容参考自b站黑马程序
部分技术已过时ಥ_ಥ经典白学系列
连接池
实现DataSource的接口
代码实现
package project2;
import java.io.PrintWriter;
/*
* 自定义的连接池
*/
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.SQLFeatureNotSupportedException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;
import javax.sql.DataSource;
public class MyDataSource implements DataSource {
//将一些连接存入内存中,可以定义一个集合,用于存储连接对象。
private List<Connection> connList = new ArrayList<Connection>();
//在初始化的时候,提供一些连接,构造方法
public MyDataSource(){
//初始化连接
for(int i = 1;i<=3;i++) {
//向集合中存入连接
try {
connList.add(getConnection());
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//从连接池中获取连接的方法。
@Override
public Connection getConnection() throws SQLException {
// 不能拿到同一个连接,即使用的连接就移除
Connection conn = connList.remove(0);
return conn;
}
//编写归还连接的方法
public void addBack(Connection connection) {
connList.add(connection);
}
@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;
}
@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;
}
}
测试连接
package project2;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class DataSourceTest {
MyDataSource dataSource = null;
public void demo1() {
// 测试自定义连接池
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
// 获取连接,从连接池中获取连接
//conn = JdbcUtils.getConnection();
dataSource = new MyDataSource();
conn = dataSource.getConnection();
// 编写sql
String sqlString = "select * from account";
// 预编译sql
pstmt = conn.prepareStatement(sqlString);
rs = pstmt.executeQuery();
while (rs.next()) {
System.out.println(rs.getInt("id" + " " + rs.getString("name") + " " + rs.getDouble("money")));
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
//JdbcUtils.release(rs, pstmt, conn);
//归还连接
dataSource.addBack(conn);
}
}
}
开源连接池的使用
改进工具类
DbUtils
- Class DbUtils
DBUtils增删改操作
ResultSetHandler的实现类
- ArrayListHandler:将多条记录封装到一个装有Object[]的List集合中。
- BeanHandler和BeanListHandler
- MapHandler和MapListHandler
- ColumnListHandler、ScalarHandler. KeyedHandler