数据库怎么停止-麦库记事停止服务
发布时间:2023-02-11 10:18 浏览次数:次 作者:佚名
数据库连接池 一、简介
什么是数据库连接池?
首先,让我们回滚 JDBC 代码流
// 1. 注册驱动
// DriverMananger.register(new Driver());
Class.forName("com.mysql.jdbc.Driver");
// 2. 获取连接 JDBC4Connection
Connection conn = DriverManager.getConnection(String url,String username,String password);
// 3. 获取statement对象
Statement statement = conn.createStatement();
// 4. 通过statement对象发送SQL语句到MySQL服务器
ResultSet ret = statement.executeQuery("select * from account");
// 5. 解析结果集
while (ret.next()) {
String name = ret.getString("name");
int id = ret.getInt("id");
}
// 6. 关闭资源(ResultSet、Statement、Connection)
ret.close();
statement.close();
connection.close();
我们发现上面提到的JDBC最原始的过程就是一开始和数据库建立连接,然后对数据库进行操作。 操作完数据库后,连接等资源都关闭了,而数据库的连接资源是比较珍贵的,所以我们要优化我们的程序,让这个连接可以重复使用,这样在使用JDBC的时候,就不需要在开始时创建一个新连接,但使用以前使用的连接。 之后,它不会关闭,但会保存连接以备下次使用。 这样做的好处是可以提高效率。
那么我们如何保存与数据库的连接呢?我们可以使用池化(线程池)的思想来保存连接,我们称之为数据库连接池
上述连接池的工作方式可以实现连接的重复使用,主要目的是为了提高效率。
2.手动实现一个数据库连接池
public class MyConnectionPool4 {
// 初始化大小
static int INIT_SIZE = 0;
static int MIN_SIZE = 0;
static int INCREMENT_SIZE = 0;
// 从头部存,从尾部取
static LinkedList<Connection> connectionList;
static {
// 加载配置文件
try {
FileInputStream in = new FileInputStream("pool.properties");
Properties properties = new Properties();
properties.load(in);
String initSize = properties.getProperty("init_size");
String minSize = properties.getProperty("min_size");
String increment = properties.getProperty("increment");
INIT_SIZE = Integer.valueOf(initSize);
MIN_SIZE = Integer.valueOf(minSize);
INCREMENT_SIZE = Integer.valueOf(increment);
}catch (Exception ex) {
ex.printStackTrace();
}
connectionList = new LinkedList<>();
// 初始化
addCapcity(INIT_SIZE);
}
// 获取连接
public static Connection getConnection(){
// 判断一下如果连接池里面的数量太少了,就自动扩容
if (connectionList.size() < MIN_SIZE) addCapcity(INCREMENT_SIZE);
Connection connection = connectionList.removeLast();
return connection;
}
// 返回连接
public static void returnConnection(Connection connection){
connectionList.addFirst(connection);
}
// 扩容的方法
public static void addCapcity(int size){
if (size <= 0) return;
for (int i = 0; i < size; i++) {
// 1. 获取连接
Connection connection = JDBCUtils.getConnection();
// 2. 把获取到的连接放到connectionList中
connectionList.addFirst(connection);
}
}
}
我们不需要花很多时间去手动实现一个数据库连接池,因为别人或者其他公司已经造了这个轮子,我们不需要重复造轮子,所以我们在数据库连接池中。 您需要学习使用其他第三方开源数据库连接池。
3.第三方开源数据库连接池
在说这三个开源数据库连接池之前,先说明一下,JDBC其实是为数据库连接池定义了一个接口,叫做javax.sql.Datasource
public interface DataSource extends CommonDataSource, Wrapper {
Connection getConnection() throws SQLException;
Connection getConnection(String username, String password)
throws SQLException;
}
我们发现这个数据库连接池的接口只定义了获取连接的方法,并没有定义返回连接的方法。 那么为什么没有定义返回连接的方法呢?
因为即使定义了返回连接的方法数据库怎么停止,返回连接的方法也必须在数据库连接池的一些实现类中实现,但是作为数据库连接池的开发者数据库怎么停止,即使返回连接的方法是定义了,没有办法阻止数据库连接池的用户先关闭连接,再调用返回连接的方法。
3.1 DBCP
3.2 C3P0
使用
public class C3p0Utils {
static DataSource dataSource;
static {
// 这个地方为什么没有要求我们传入配置文件呢?
// 因为C3p0的开发者已经帮助我们把src/c3p0-config.xml 配置文件读取了
// 所以我们在使用c3p0的时候,配置文件是有名字和位置的要求的
dataSource = new ComboPooledDataSource();
}
// 获取连接
public static Connection getConnection(){
Connection connection = null;
try {
connection = dataSource.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return connection;
}
}
3.3 德鲁伊