Java JDBC连接池设计与优化实例

原创 矫情吗;* 2024-09-21 02:39 166阅读 0赞

在Java开发中,JDBC(Java Database Connectivity)连接池是一种常用的设计模式,它可以有效管理和复用数据库连接。

以下是一个简单的Java JDBC连接池设计与优化实例:

  1. 创建连接池类(如ConnectionPool.java)
  1. import java.sql.Connection;
  2. import java.sql.DriverManager;
  3. import java.util.concurrent.Executors;
  4. import java.util.concurrent.RejectedExecutionException;
  5. public class ConnectionPool {
  6. private static final String DB_URL = "jdbc:mysql://localhost:3306/testdb";
  7. private static final int MAX_CONNECTIONS = 10; // 连接池最大连接数
  8. private static final int MIN_CONNECTIONS = 5; // 连接池最小连接数
  9. private ConnectionPool() { } // 构造器私有化,防止外部创建
  10. public synchronized static Connection getConnection() {
  11. Connection connection = null;
  12. try {
  13. // 判断连接池状态
  14. if (connectionsInUse() >= MAX_CONNECTIONS) {
  15. // 若连接已经满,等待新的连接释放
  16. connection = waitAndAcquireConnection();
  17. } else {
  18. // 若连接池中还有可用连接,直接获取
  19. connection = DriverManager.getConnection(DB_URL);
  20. }
  21. } catch (Exception e) {
  22. System.out.println("Error occurred while acquiring database connection: " + e.getMessage());
  23. if (connection != null) { // 如果已经获取到的连接,关闭释放
  24. try {
  25. connection.close();
  26. } catch (SQLException se) {
  27. System.out.println("Failed to close database connection after error: " + se.getMessage());
  28. }
  29. }
  30. }
  31. return connection;
  32. }
  33. private static boolean connectionsInUse() {
  34. ConnectionPool pool = ConnectionPool.getInstance();
  35. if (pool != null && !pool.isEmpty()) {
  36. // 如果连接池中有连接,则返回true
  37. return true;
  38. }
  39. return false;
  40. }
  41. private static Connection waitAndAcquireConnection() throws InterruptedException, RejectedExecutionException {
  42. // 将获取连接的任务放入线程池中,等待被处理
  43. Executor executor = Executors.newSingleThreadExecutor();
  44. executor.execute(() -> {
  45. try {
  46. // 获取数据库连接
  47. Connection connection = DriverManager.getConnection(DB_URL);
  48. // 从连接池中移除这个已使用的连接
  49. ConnectionPool.getInstance().removeConnection(connection);
  50. // 连接返回,用于后续操作
  51. return connection;
  52. } catch (Exception e) {
  53. System.out.println("Error occurred while acquiring database connection: " + e.getMessage());
  54. // 如果获取到的连接有问题,需要关闭释放
  55. try {
  56. if (connection != null) {
  57. connection.close();
  58. }
  59. } catch (SQLException se) {
  60. System.out.println("Failed to close database connection after error: " + se.getMessage());
  61. }
  62. }
  63. }));
  64. }
  65. private static ConnectionPool getInstance() {
  66. // 若连接池尚未创建,创建一个新的连接池实例
  67. if (ConnectionPool.pool == null) {
  68. ConnectionPool.pool = new ConnectionPool();
  69. }
  70. return ConnectionPool.pool;
  71. }
  72. public static void destroy() {
  73. // 如果连接池已经创建,销毁当前的连接池实例
  74. if (ConnectionPool.pool != null) {
  75. ConnectionPool.pool.clear();
  76. ConnectionPool.pool = null;
  77. }
  78. }
  79. }

在这个例子中:

  • ConnectionPool是连接池类,它维护一个连接列表。
  • getInstance()用于获取唯一的连接池实例。
  • getConnection()是线程安全的获取数据库连接的方法。当连接池中可用连接数量不足时,会阻塞等待直到有新连接释放出来。
  • destroy()方法用于销毁连接池,清空连接列表。

这个设计在高并发场景下具有较好的性能和资源管理能力。

文章版权声明:注明蒲公英云原创文章,转载或复制请以超链接形式并注明出处。

发表评论

表情:
评论列表 (有 0 条评论,166人围观)

还没有评论,来说两句吧...

相关阅读