Java实现数据库连接池简易教程
在Java web开发中,经常会使用到数据库连接池技术,它可以缓存一定数量的数据库连接,通过再次请求时,优先从连接池中获取已有的连接,而不是重新创建连接,从而提高程序的性能和响应速度。在这里,我们将详细讲解如何使用Java语言来实现一个简单的数据库连接池。
步骤
第一步:创建连接池
首先,我们需要创建连接池,代码如下:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ArrayList;
public class ConnectionPool {
private static final String driver = "com.mysql.jdbc.Driver";
private static final String url = "jdbc:mysql://localhost:3306/test";
private static final String username = "root";
private static final String password = "123456";
private static final int initSize = 5;
private static final int maxSize = 10;
private ArrayList<Connection> pool = new ArrayList<>();
public ConnectionPool() {
for (int i = 0; i < initSize; i++) {
try {
Class.forName(driver);
Connection conn = DriverManager.getConnection(url, username, password);
pool.add(conn);
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
}
}
public synchronized Connection getConnection() {
Connection conn = null;
if (pool.size() > 0) {
conn = pool.remove(0);
} else {
if (pool.size() < maxSize) {
try {
Class.forName(driver);
conn = DriverManager.getConnection(url, username, password);
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
}
}
return conn;
}
public synchronized void release(Connection conn) {
if (pool.size() < maxSize) {
pool.add(conn);
} else {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
以上代码中,我们使用了ArrayList集合来创建连接池pool,其中initSize为连接池的初始大小,maxSize为连接池的最大大小(即连接池最大可存储的连接数)。getConnection()方法用于从连接池中获取连接,如果连接池中有连接,则直接获取并返回,否则如果连接池未达到最大大小,则创建新的连接返回。release()方法用于将使用过的连接归还到连接池中。
第二步:测试
接下来,我们使用测试代码来验证我们的连接池是否正常工作,测试代码如下:
public class Test {
public static void main(String[] args) {
ConnectionPool pool = new ConnectionPool();
for (int i = 0; i < 15; i++) {
Thread t = new Thread(new Runnable() {
@Override
public void run() {
Connection conn = pool.getConnection();
try {
// 这里执行对数据库的相关操作
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM user");
while(rs.next()){
String userName = rs.getString("name");
String userAge = rs.getString("age");
System.out.println("name: " + userName + " | age: " + userAge);
}
rs.close();
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
pool.release(conn);
}
});
t.start();
}
}
}
运行测试代码后,我们可以看到输出结果中每个线程一次性获取多个连接进行数据库操作,证明连接池正常工作。
示例说明
示例1:使用连接池进行数据库操作
我们可以看到,在测试代码中,我们每次使用getConnection()方法来获取数据库连接,并使用release()方法将连接归还到连接池中。在获取到连接后,我们使用Statement来进行生成查询的SQL,并使用ResultSet来获取执行结果。
Connection conn = pool.getConnection();
try {
// 这里执行对数据库的相关操作
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM user");
while(rs.next()){
String userName = rs.getString("name");
String userAge = rs.getString("age");
System.out.println("name: " + userName + " | age: " + userAge);
}
rs.close();
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
pool.release(conn);
示例2:改变连接池大小
我们可以看到,在连接池构造函数中,我们将连接池的初始大小设置为5:
private static final int initSize = 5;
而在getConnection()方法中,我们使用了if语句判断当前连接池中连接的数量是否大于0,如果大于0,则取出最先加入到连接池中的连接,如果没有连接,则创建新的连接。而在release()方法中,我们使用了if语句判断连接池的大小是否达到最大值,如果没有,则将使用过的连接放回连接池中,否则关闭该连接。
如果将initSize改为10,则连接池初始化的时候,将会创建10个数据库连接:
private static final int initSize = 10;
如果将maxSize改为20,则连接池最大可存储的连接数将变为20,连接数可继续增加:
private static final int maxSize = 20;
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java实现数据库连接池简易教程 - Python技术站