连接池
连接池的原理
1.程序一开始就创建一定数量的连接,放在一个容器中,这个容器称为连接池
2.使用的时候直接从连接池中取一个已经创建好的连接对象
3.关闭的时候不是真正关闭连接,而是将连接对象再次放回到连接池中
4.当连接池中的连接对象用完后,还需使用的时候,任务会进入等待,等待几秒后若还没有使用完的连接对象返回连接池供其使用,连接池则会自动创建一个新的连接对象供其使用,使用完自动销毁
自定义一个简单的连接池
下面是一个自定义的,创建连接和释放资源的工具类:
需要创建一个jbdc.properties配置文件放在src目录下
配置文件信息:
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/...
user=root
password=root
以及工具类:
public class MyJDBCUtils {
private static String driver;
private static String url;
private static String user;
private static String password;
static {
InputStream s = MyJDBCUtils.class.getClassLoader().getResourceAsStream("jdbc.properties");
Properties properties = new Properties();
try {
properties.load(s);
} catch (IOException e) {
e.printStackTrace();
}
driver = properties.getProperty("driver");
url = properties.getProperty("url");
user = properties.getProperty("user");
password = properties.getProperty("password");
//注册驱动
try {
Class.forName(driver);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static Connection getConnection()throws Exception{
//连接数据库
Connection connection = DriverManager.getConnection(url, user, password);
return connection;
}
public static void release(ResultSet resultSet, Statement statement, Connection connection)throws Exception{
if (resultSet!=null){
resultSet.close();
}
if (statement!=null) {
statement.close();
}
if (connection!=null) {
connection.close();
}
}
}
1.自定义一个连接池类
2.定义LinkList集合作为连接池,在静态代码块中,向集合中添加5个连接对象
3.添加一个方法,用来归还连接
public class MyDataSource {
//定义集合,存放连接对象
private static LinkedList<Connection> pool;
static{
try {
pool = new LinkedList<Connection>();
//添加5个连接对象
for(int i = 0; i < 5;i++){
//创建连接(在工具类自己定义的JbdcUtils类里面的getConnection方法)
Connection connection =MyJDBCUtils.getConnection();
pool.add(connection);
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获得池子里面连接的数量
* @return
*/
public static int getCount(){
return pool.size();
}
/**
* 从pool里面拿出连接
* @return
*/
public Connection getABC(){
Connection connection = pool.removeFirst();
return connection;
}
/**
* 归还连接
* @param connection
*/
public void addBack(Connection connection){
pool.addLast(connection);
}
}
为了让连接池定义的方法具有统一,易用性,Java中提供了javax.sql.DataSource接口,这样应用程序可以方便的切换不同厂商的连接池
所以我们自定义连接池需要实现DataSource接口,并重写其中的抽象方法
使用第三方连接池
c3p0连接池
- C3P0开源免费的连接池!目前使用它的开源项目有:Spring、Hibernate等。使用第三方工具需要导入jar包,c3p0使用时还需要添加配置文件c3p0-config.xml.
- 使用C3P0需要添加c3p0-(版本号).jar
连接池的使用
- 把配置文件c3p0-config.xml,放在src目录下
- 在配置文件中更改需要更改的数据即可
- 编写Java代码 (会自动读取src目录下的c3p0-config.xml,所以不需要我们解析配置文件)
创建连接池对象
DataSource ds = new ComboPooledDataSource();
DRUID连接池
Druid是阿里巴巴开发的号称为监控而生的数据库连接池,Druid是国内目前最好的数据库连接池。在功能、性能、扩展性方面,都超过其他数据库连接池。
使用方法:
需要自行导入properties配置文件
把 文件名.properties 文件放入src目录下作为配置文件
//0 根据druid.properties创建配置文件对象
Properties properties = new Properties();
// 关联druid.properties文件
InputStream is = DruidDemo.class.getClassLoader().getResourceAsStream("文件名.properties");
properties.load(is);
获取到了配置文件就可以创建连接池:
DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
我们还可以把c3p0和druid的方法提出来分别为他们创建工具类:
抽取c3p0工具类和druid工具类