【问题标题】:Implement Connection pooling in JDBC using apache dbcp [duplicate]使用 apache dbcp 在 JDBC 中实现连接池 [重复]
【发布时间】:2013-11-29 17:30:42
【问题描述】:

这是实现池的好代码吗?我想在我的项目中实现这一点,该项目有 30 个线程同时运行,每个线程每个请求需要四个以上的连接?这段代码有效吗?

    import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import java.sql.Connection;
import java.sql.SQLException;
import org.apache.commons.dbcp.BasicDataSource;

/**
 *
 * @author
 * taher_JAVAHUNTER
 */

    public class JDBCHelper {

        private final static String username = "root";
        private final static String password = "";
        private final static String url = "jdbc:mysql://localhost:3306/treamisdemo";
        public static Connection connection = null;
        public static int connectionCount = 0;
    //    public JDBCHelper(boolean setCon) {
    //        try {
    //            setConnectionTest();
    //        } catch (Exception e) {
    //            System.out.println("Error in Connection:" + e.toString());
    //        }
    //    }
        public static BasicDataSource dataSource;

        public static Connection getConnection() throws SQLException {
            try {
                if (dataSource == null) {
                    dataSource = new BasicDataSource();
                    String driver = "com.mysql.jdbc.Driver";
                    try {
                        dataSource.setDriverClassName(driver);
                        dataSource.setUrl(url);
                        dataSource.setUsername(username);
                        dataSource.setPassword(password);
                        dataSource.setMaxActive(100);
                        dataSource.setMaxWait(10000);
                        dataSource.setMaxIdle(10);
                        if (connection == null || connection.isClosed()) {
                            System.out.println(" requeition CONNECTION WITH FIRST SERVER.");
                            connection = dataSource.getConnection();
                            connectionCount++;
                        }
                    } catch (SQLException e) {
                        System.out.println("***Connection Requisition*** Could not connect to the database msg :" + e.getMessage());
                    }
                } else {
                    connection = dataSource.getConnection();
                    connectionCount++;
                }
            } catch (Exception e) {
                System.out.println("open connection exception" + e);
            }
            return connection;
        }

        public static void close(ResultSet c) {
            try {
                if (c != null) {
                    c.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        public static void close(Statement c) {
            try {
                if (c != null) {
                    c.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        public static void close(Connection c) {
            try {
                if (c != null) {
                    c.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

}

【问题讨论】:

  • DBCP 基本上被抛弃了,我推荐HikariCP,但我又一次有偏见,因为我帮助编写了它。
  • @brettw“被谁抛弃”?你有这方面的统计数据吗?
  • @EJP 上下文。当我在 2013 年 11 月发表评论时,DBCP 的最新版本是Feb. 2010。它最近似乎有了一点生命。

标签: java mysql jdbc apache-commons-dbcp


【解决方案1】:

我会推荐这种方法。你基本上是在创建一个连接并挂在它上面。我不喜欢你的模式,但像这样会更好:

public class DataTransaction {
   private final static BasicDataSource dataSource;

   static {
      dataSource = new BasicDataSource();
      dataSource.setDriverClassName("com.mysql.jdbc.Driver");
      dataSource.setUrl("jdbc:mysql://127.0.0.1:3306/registrationtest");
      dataSource.setUsername("root");
      dataSource.setPassword("root");
      dataSource.setMaxActive(100);
      dataSource.setMaxWait(10000);
      dataSource.setMaxIdle(10);
   }

   private DataTransaction() {
   }

   public static DataSource getDataSource() {
      return dataSource;
   }
}

此外,我不会硬编码任何 DataSource 参数,而是从属性文件初始化 DataSource。

【讨论】:

  • 你好可以看到我上面的更新代码,请问它是否有效?
  • 看起来还不错。因为 getConnection() 是不同步的,两个线程同时命中(第一次)可以初始化 DataSource 两次(因为都认为它是空的)。如果您所展示的只是您想要做的,我建议您只使用 SansORM 库中的 SQLClosure 类,而不要费心编写自己的帮助程序。
猜你喜欢
  • 2013-01-06
  • 2019-12-02
  • 2019-03-03
  • 2010-10-05
  • 2013-05-28
  • 1970-01-01
  • 2019-10-18
  • 2011-03-06
相关资源
最近更新 更多