一、连接池
JDBC每次连接数据库,都要获得一个连接对象。每次创建一个连接对象,都是一个较大的资源,如果在连接量较大的场景下,会极大的浪费资源。容易内存溢出。
1.1 自定义连接池
Java中提供了一个接口DataSource,通过实现该接口,可以创建连接池
import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.SQLFeatureNotSupportedException;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import java.util.logging.Logger;
/**
* 数据库连接池
*/
public class MyDbPool implements DataSource {
//存储连接对象的集合
private static List<Connection> connections = new ArrayList<>();
//类加载时,就往集合中存放指定数量的连接对象
static {
InputStream is = MyDbPool.class.getResourceAsStream("/db.properties");
Properties properties = new Properties();
try {
properties.load(is);
Class.forName(properties.getProperty("driver"));
//通过循环,创建5个连接对象放进集合中
for(int i=0;i<=5;i++){
Connection connection = DriverManager.getConnection(properties.getProperty("url"),properties.getProperty("username"),properties.getProperty("password"));
connections.add(connection);
}
} catch (IOException | ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
}
@Override
public Connection getConnection() throws SQLException {
//池中获得连接
System.out.println("池中有:"+connections.size());
Connection connection = null;
if(connections.size()>0){
connection = connections.remove(0);
}
return connection;
}
//将连接放回池中
public void release(Connection connection){
connections.add(connection);
System.out.println("放回一个"+connection);
}
}
import java.sql.Connection;
public class TestDBPool {
public static void main(String[] args) throws Exception {
Connection connection = null;
MyDbPool myDbPool = new MyDbPool();
for(int i = 1 ; i < 10 ; i++){
connection = myDbPool.getConnection();
System.out.println(connection);
myDbPool.release(connection);
}
}
}
1.2 Druid(德鲁伊)
Druid 是目前比较流行高性能的,分布式列存储
一、亚秒级查询
二、实时数据注入
三、可扩展的PB级存储
四、多环境部署
五、丰富的社区
1.2.1 Druid配置
- 创建database.properties 配置文件
- 引入druid-1.1.5.jar
1.2.2 database.properties 文件配置
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/userinfo?useUnicode=true&characterEncoding=utf8
username=root
password=123456
#初始化连接
initialSize=10
#最大连接数量
maxActive=30
#最小空闲连接
minIdle=5
#超时等待时间以毫秒为单位
maxWait=5000
1.2.3 连接池工具类
package com.qf.day44.t2;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.xml.transform.Result;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
public class DBPoolUtils {
//连接池对象
private static DruidDataSource ds;
static {
Properties properties = new Properties();
InputStream is = DBPoolUtils.class.getResourceAsStream("/database.properties");
try {
properties.load(is);
//使用德鲁伊工厂创建连接池
ds = (DruidDataSource) DruidDataSourceFactory.createDataSource(properties);
} catch (Exception e) {
e.printStackTrace();
}
}
public static Connection getConnection() {
try {
//在连接池中获得Connection
return ds.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
public static void closeAll(Connection connection, Statement statement, ResultSet resultSet) {
try {
if (resultSet != null) {
resultSet.close();
}
if (statement != null) {
statement.close();
}
if (connection != null) {
connection.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
- 注意:连接池中获得的Connection是DruidPooledConnection实现类,调用的close()方法不是关闭资源,而是将资源放回池中!
版权声明:本文为zl5230原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。