java自定义JDBC实现连接池
简单上手
使用 JDBC 来执行 SQL 查询和更新操作
import java.sql.*; public class Main { public static void main(String[] args) { String url = "jdbc:mysql://localhost:3306/your_database_name"; String username = "your_username"; String password = "your_password"; Connection connection = null; try { connection = DriverManager.getConnection(url, username, password); System.out.println("成功连接到数据库"); // 查询操作 String query = "SELECT * FROM your_table_name"; Statement statement = connection.createStatement(); ResultSet resultSet = statement.executeQuery(query); // 打印查询结果 while (resultSet.next()) { int id = resultSet.getInt("id"); String name = resultSet.getString("name"); System.out.println("ID: " + id + ", Name: " + name); } // 更新操作 String update = "UPDATE your_table_name SET name = 'New Name' WHERE id = 1"; int rowsAffected = statement.executeUpdate(update); System.out.println("更新操作影响的行数: " + rowsAffected); } catch (SQLException e) { System.out.println("数据库操作失败:" + e.getMessage()); } finally { if (connection != null) { try { connection.close(); System.out.println("成功关闭数据库连接"); } catch (SQLException e) { System.out.println("关闭数据库连接失败:" + e.getMessage()); } } } } }
下面展示一些 内联代码片
。
// A code blockvar foo = 'bar';
// An highlighted blockvar foo = 'bar';
实现JDBC连接池
JDBC 数据库连接池的示例代码:
import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.Vector; public class ConnectionPool { private static final int MAX_CONNECTIONS = 10; // 最大连接数限制 private static final long CONNECTION_TIMEOUT = 5000; // 连接超时时间,单位毫秒 private Vector<Connection> availableConnections = new Vector<>(); private Vector<Connection> usedConnections = new Vector<>(); public ConnectionPool(String url, String username, String password) { initializeConnectionPool(url, username, password); } private void initializeConnectionPool(String url, String username, String password) { while (!checkIfConnectionPoolIsFull()) { availableConnections.add(createNewConnection(url, username, password)); } System.out.println("数据库连接池初始化完成,当前连接数: " + availableConnections.size()); } private synchronized boolean checkIfConnectionPoolIsFull() { return (availableConnections.size() + usedConnections.size()) >= MAX_CONNECTIONS; } private Connection createNewConnection(String url, String username, String password) { try { return DriverManager.getConnection(url, username, password); } catch (SQLException e) { e.printStackTrace(); return null; } } public synchronized Connection getConnection() throws SQLException { long startTime = System.currentTimeMillis(); while (availableConnections.isEmpty()) { try { wait(CONNECTION_TIMEOUT); } catch (InterruptedException e) { e.printStackTrace(); } if ((System.currentTimeMillis() - startTime) >= CONNECTION_TIMEOUT) { throw new SQLException("获取数据库连接超时"); } } Connection connection = availableConnections.remove(availableConnections.size() - 1); usedConnections.add(connection); System.out.println("获取数据库连接,当前连接数: " + availableConnections.size()); return connection; } public synchronized void releaseConnection(Connection connection) { if (connection != null) { usedConnections.remove(connection); availableConnections.add(connection); notifyAll(); System.out.println("释放数据库连接,当前连接数: " + availableConnections.size()); } } }
在上面的示例代码中,我们增加了最大连接数限制和连接超时处理机制。当连接池中的连接数达到最大值时,新请求会等待一段时间,如果超过连接超时时间仍未获取到连接,则会抛出 SQLException 异常表示获取连接超时。同时,我们还通过控制台输出连接池的状态信息,方便跟踪连接的获取和释放情况。
测试
测试数据库连接池的最大连接数限制和连接超时处理机制:
public class ConnectionPoolTest { public static void main(String[] args) { String url = "jdbc:mysql://localhost:3306/your_database_name"; String username = "your_username"; String password = "your_password"; ConnectionPool connectionPool = new ConnectionPool(url, username, password); // 模拟多个线程同时请求数据库连接 for (int i = 0; i < 15; i++) { Thread thread = new Thread(new Worker(connectionPool, i)); thread.start(); } } static class Worker implements Runnable { private ConnectionPool connectionPool; private int workerId; public Worker(ConnectionPool connectionPool, int workerId) { this.connectionPool = connectionPool; this.workerId = workerId; } @Override public void run() { try (Connection connection = connectionPool.getConnection()) { System.out.println("Worker " + workerId + " 获取到数据库连接"); // 模拟操作持有连接的时间 Thread.sleep(3000); System.out.println("Worker " + workerId + " 完成操作,释放数据库连接"); } catch (SQLException | InterruptedException e) { e.printStackTrace(); } } } }
关于SQLException
SQLException
是 Java 中的一个异常类,用于表示与数据库相关的异常。当使用 JDBC 连接数据库时,很多操作都可能会抛出 SQLException
异常,比如连接数据库、执行查询、更新数据等过程中出现的错误。
SQLException
是 java.sql.SQLException
类的全名,它是 java.sql
包中的一个类,专门用于处理数据库操作可能出现的异常情况。该异常类提供了一系列方法,用于获取关于异常的详细信息,比如异常消息、SQL 状态码、引起异常的原因等,方便开发人员进行异常处理和调试。
在使用 JDBC 连接数据库时,通常会在代码中捕获 SQLException
异常,并根据具体情况进行异常处理,比如输出异常信息、回滚事务、关闭连接等操作,以确保程序的稳定性和可靠性。
下面是一个简单的示例,演示了如何捕获并处理 SQLException
异常:
import java.sql.*; public class Main { public static void main(String[] args) { String url = "jdbc:mysql://localhost:3306/your_database_name"; String username = "your_username"; String password = "your_password"; Connection connection = null; try { connection = DriverManager.getConnection(url, username, password); // 执行数据库操作... } catch (SQLException e) { System.out.println("数据库操作失败:" + e.getMessage()); e.printStackTrace(); } finally { if (connection != null) { try { connection.close(); } catch (SQLException e) { System.out.println("关闭数据库连接失败:" + e.getMessage()); e.printStackTrace(); } } } } }
在上面的示例中,我们在连接数据库和关闭数据库连接的过程中捕获了 SQLException
异常,并通过 e.getMessage()
方法获取异常信息进行输出。这样可以帮助我们更好地理解和处理与数据库交互过程中可能出现的异常情况。
到此这篇关于java自定义JDBC实现连接池的文章就介绍到这了,更多相关java JDBC连接池内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Spring MVC 404 Not Found无错误日志的解决方法
这篇文章主要为大家详细介绍了Spring MVC 404 Not Found无错误日志的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2017-12-12教你在 Java 中实现 Dijkstra 最短路算法的方法
这篇文章主要教你在 Java 中实现 Dijkstra 最短路算法的方法,在实现最短路算法之前需要先实现带权有向图,文章中给大家介绍的非常详细,需要的朋友可以参考下2022-04-04Java基于Spire Cloud Excel把Excel转换成PDF
这篇文章主要介绍了Java基于Spire Cloud Excel把Excel转换成PDF,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下2020-05-05Mybatis基于MapperScan注解的动态代理加载机制详解
这篇文章主要介绍了Mybatis基于MapperScan注解的动态代理加载机制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧2023-01-01java中ThreadLocal和ThreadLocalMap浅析
这篇文章主要介绍了java中ThreadLocal和ThreadLocalMap浅析,ThreadLocal类用来设置线程私有变量 本身不储存值 主要提供自身引用 和 操作ThreadLocalMap 属性值得方法,需要的朋友可以参考下2023-09-09
最新评论