Пул подключений Java - PullRequest
       11

Пул подключений Java

1 голос
/ 20 августа 2011

Вот ConnectionPool, который я реализовал. Это хороший дизайн, чтобы все переменные и методы были статическими. Пожалуйста, объясните, почему или почему нет

public class MyCp1 {

    private static final int MAX_SIZE=100;
    private static final BlockingQueue<Connection> bq;

    static{
         System.out.println("Inside begin static block" );
        bq= new ArrayBlockingQueue<Connection>(MAX_SIZE);
        for(int i=0;i<MAX_SIZE;i++)
        {
            try {
                try {
                    bq.put(makeConnection());
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

        System.out.println("total size:" + bq.size());
    }

    public static Connection getConnection() throws InterruptedException
    {
        System.out.println("size before getting connection "+ bq.size()+ "  Thread name  "+ Thread.currentThread().getName());
        Connection con=bq.take();
        System.out.println("size after getting connection  "+ bq.size()+"  Thread name  "+ Thread.currentThread().getName());
        return (con);
    }

    public static boolean releaseConnection(Connection con) throws InterruptedException
    {
        System.out.println("size before releasing connection  "+ bq.size()+" Thread name  "+ Thread.currentThread().getName());
        boolean bool =bq.add(con);
        System.out.println("size after releasing connection  "+ bq.size()+"  Thread name  "+ Thread.currentThread().getName());
        return (bool);
    }

    public static Connection makeConnection() throws SQLException {
        Connection conn = null;
        Properties connectionProps = new Properties();
        connectionProps.put("user", "root");
        connectionProps.put("password", "java33");
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }  
        conn = DriverManager.getConnection("jdbc:" + "mysql" + "://"
                + "localhost" + ":" + "3306" + "/test", connectionProps);

        System.out.println("Connected to database");
        return conn;
    }


}

Я знаю, что есть проблемы с исключительной обработкой и другие, но я был бы признателен, если бы вы могли придерживаться вышеупомянутого вопроса

EDIT ::

Похоже, что использование static не приветствуется. Так что я рефакторинг как можно больше, чтобы избавиться от статики Хотя это работает, не уверен, что это хороший дизайн

 public class ConnectionPool {

    private static final int MAX_SIZE = 100;
    private    BlockingQueue<Connection> bq;
    private static ConnectionPool cp= new ConnectionPool();


    private ConnectionPool(){
        System.out.println("inside constructor");
         bq = new ArrayBlockingQueue<Connection>(MAX_SIZE);
        Properties connectionProps = new Properties();
        connectionProps.put("user", "root");
        connectionProps.put("password", "java33");
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        for (int i = 0; i < MAX_SIZE; i++) {
            try {
                bq.put(makeConnection(connectionProps));
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }

        System.out.println("total size:" + bq.size());
    }
    public static ConnectionPool getInstance()
    {
        return cp;

    }

    public  Connection getConnection() throws InterruptedException {
        System.out.println("size before getting connection" + bq.size());
        Connection con = bq.take();
        System.out.println("size after getting connection" + bq.size());
        return (con);
    }

    public  void releaseConnection(Connection con)
            throws InterruptedException {
        System.out.println("size before releasing connection" + bq.size());
         bq.put(con);
        System.out.println("size after releasing connection" + bq.size());
        //return (bool);
    }

    private  Connection makeConnection(Properties connectionProps) throws SQLException {
        Connection conn = null;
        conn = DriverManager.getConnection("jdbc:" + "mysql" + "://"
                + "localhost" + ":" + "3306" + "/test", connectionProps);

        System.out.println("Connected to database");
        return conn;
    }

}

1 Ответ

2 голосов
/ 20 августа 2011

Абсолютно нет.То, что у вас есть, это больше объект по переработке объектов, что хорошо, если это то, что вам нужно.

(Однако, как переработчик, вам все еще не нужны статические поля, но вы просто создадите один экземплярпереработчик.)

Для пула соединений (и если это для чего-то вроде JDBC Connections) он должен быть потокобезопасным, и в идеале вам не нужно возвращать соединение.

Пулы соединений, которые являются поточно-ориентированными, будут использовать ThreadLocal для возврата соединения, которое когда-либо будет использоваться только в этом потоке.Если один из них недоступен, он создаст новое соединение, реализовав ThreadLocal.initialValue () .

Кроме того, ваши потоки должны быть созданы с использованием ExecutorService )поэтому вы также можете повторно использовать темы.

...