Java 使用ApacheDBCP在JDBC中实现连接池

Java 使用ApacheDBCP在JDBC中实现连接池,java,mysql,jdbc,apache-commons-dbcp,Java,Mysql,Jdbc,Apache Commons Dbcp,这是实现池的好代码吗?我想在我的项目中实现这一点,该项目有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

这是实现池的好代码吗?我想在我的项目中实现这一点,该项目有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();
            }
        }

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

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;
   }
}

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

我建议您阅读DBCP基本上被放弃了,我建议,但我在帮助编写它时又有偏见。@brettw“基本上被放弃了”是谁?你有这方面的统计数据吗?@ejpcontext。我在2013年11月发表评论时,DBCP的最新版本是。最近好像有点生气了。嗨,能在plz上面看到我更新的代码吗?看起来还可以。因为getConnection()是不同步的,两个线程同时命中(第一次)可能会初始化数据源两次(因为两个线程都认为它为null)。如果您所展示的就是您想要做的,我建议您只使用库中的
SQLClosure
类,而不要费心编写自己的助手。