Как использовать ресурс пула соединений JDBC? [Дубликат]

Вы можете использовать GUI для этого:

  1. Выберите свою LetterColumn, а затем Transform / GroupBy:
  2. Выберите Добавить столбец / Пользовательская колонка:
  3. Нажмите противоположные стрелки в правом верхнем углу нового столбца AllData для извлечения значений из нового столбца AllData:
  4. Удалить столбец AllData.

101
задан Luiggi Mendoza 23 June 2014 в 08:27
поделиться

12 ответов

Не изобретайте колесо.

Попробуйте один из легко доступных сторонних компонентов:

Apache DBCP предлагает другой пример настройки пула ] javax.sql.DataSource . Вот один пример , который может помочь вам начать работу.

14
ответ дан Alexander Pogrebnyak 22 August 2018 в 15:39
поделиться
  • 1
    Это называется C3P0. Он, кстати, более эффективен, чем DBCP в многопоточных средах, поскольку DBCP блокирует доступ к одному потоку. – BalusC 15 May 2010 в 02:57
  • 2
    @BalusC. Спасибо за исправление, мой disclecsia стал лучше меня. Вы можете видеть, что ссылка верна. :) – Alexander Pogrebnyak 15 May 2010 в 14:48
  • 3
    @Mudassir. Я бы порекомендовал посмотреть на замещение замены для DBCP, внесенного Tomcat с Spring - & gt; [Д0] static.springsource.com/projects/tc-server/2.0/admin/htmlsingle/… . Вам не нужен весь сервер Tomcat, чтобы использовать его, только одну банку tomcat-jdbc. Вы можете получить его от Maven Central - & gt; org.apache.tomcat:tomcat-jdbc:jar:7.0.22 - & gt; search.maven.org/… – Alexander Pogrebnyak 18 November 2011 в 16:20
  • 4
    @ АлександрПогребняк: Спасибо, Александр, это мило с твоей стороны. Я планирую использовать CP в веб-службе Axis. Подумайте о своем предложении. - Мудасир 7 минут назад – Mudassir 18 November 2011 в 16:36
  • 5
    По состоянию на 2017 год также существует HikariCP: brettwooldridge.github.io/HikariCP – Arto Bendiken 4 August 2017 в 16:31

В конце 2017 года Proxool, BoneCP, C3P0, DBCP в настоящее время в основном не функционируют. HikariCP (созданный в 2012 году) кажется многообещающим, удаляет двери из всего остального, о чем я знаю. http://www.baeldung.com/hikaricp

Proxool имеет ряд проблем: - при большой нагрузке может превышать максимальное количество подключений и не возвращаться ниже max - может управлять чтобы не возвращаться к минимальным соединениям даже после истечения срока действия соединений. Может заблокировать весь пул (и все потоки сервера / клиента), если у него возникли проблемы с подключением к базе данных во время потока HouseKeeper (не использует .setQueryTimeout) - поток HouseKeeper при подключении блокировка пула для его процесса, запрашивает поток Prototyper для воссоздания соединений (sweep), что может привести к условию / блокировке гонки. В этом методе последний параметр всегда должен быть развернут: false во время цикла, только подметать: true под ним. - HouseKeeper нуждается только в одиночной прокрутке PrototypeController в конце и имеет больше [упомянутых выше] - поток HouseKeeper проверяет проверку соединений, прежде чем видеть, какие соединения могут быть истекли [некоторый риск тестирования истекшего соединения, которое может быть нарушено / завершено с помощью других тайм-аутов до DB в брандмауэре и т. Д.] - проект имеет незавершенный код (свойства, которые определены, но не действуют). Максимальный срок службы соединения по умолчанию, если он не определен, составляет 4 часа (чрезмерный) - поток HouseKeeper запускается каждые пять секунд на пул (избыток) Вы можете изменить код и внести эти улучшения. Но поскольку он был создан в 2003 году и обновлен в 2008 году, ему не хватало почти 10 лет усовершенствований Java, которые используют такие решения, как hikaricp.

3
ответ дан bluejaguar 22 August 2018 в 15:39
поделиться

Пул

  • Механизм объединения - это способ создания Объектов заранее. Когда класс загружен.
  • Он улучшает приложение performance [путем повторного использования одного и того же объекта для выполнения любых действий над объектными данными] & amp; memory [выделение и деактивация многих объектов создает значительные издержки управления памятью].
  • Очистка объекта не требуется, поскольку мы используем тот же объект, уменьшая нагрузку на сбор мусора.

«Пул пула [ Object , String Константный пул, Thread Пул, пул соединений]

String Константный пул

  • Строковый литеральный пул поддерживает только одну копию каждого отдельного строкового значения. который должен быть неизменным.
  • Когда вызывается метод intern, он проверяет наличие объекта с тем же содержимым в пуле с использованием метода equals. «Если String-copy доступен в пуле, то возвращает ссылку. «В противном случае объект String добавляется в пул и возвращает ссылку.

Пример: String для проверки Уникального объекта из пула.

public class StringPoolTest {
    public static void main(String[] args) { // Integer.valueOf(), String.equals()
        String eol = System.getProperty("line.separator"); //java7 System.lineSeparator();

        String s1 = "Yash".intern();
        System.out.format("Val:%s Hash:%s SYS:%s "+eol, s1, s1.hashCode(), System.identityHashCode(s1));
        String s2 = "Yas"+"h".intern();
        System.out.format("Val:%s Hash:%s SYS:%s "+eol, s2, s2.hashCode(), System.identityHashCode(s2));
        String s3 = "Yas".intern()+"h".intern();
        System.out.format("Val:%s Hash:%s SYS:%s "+eol, s3, s3.hashCode(), System.identityHashCode(s3));
        String s4 = "Yas"+"h";
        System.out.format("Val:%s Hash:%s SYS:%s "+eol, s4, s4.hashCode(), System.identityHashCode(s4));
    }
}

Пул соединений с использованием Type-4 Драйвер с использованием сторонних библиотек [ DBCP2 , c3p0 , Tomcat JDBC ]

Type 4 - The Thin driver converts JDBC calls directly into the vendor-specific database protocol Ex[Oracle - Thick, MySQL - Quora]. wiki

В механизме пула соединений, когда класс загружен он получает physical JDBC connection объекты и предоставляет физический объект подключения для пользователя. PoolableConnection является оберткой вокруг фактического соединения.

  • getConnection() выберите одно из бесплатного завернутого соединения из соединения objectpool и возвращает его.
  • close() вместо закрытия возвращает обратно завершенное соединение в пул.

Пример: Использование пула соединений ~ DBCP2 с Java 7 [ try-with-resources ]

public class ConnectionPool {
    static final BasicDataSource ds_dbcp2 = new BasicDataSource();
    static final ComboPooledDataSource ds_c3p0 = new ComboPooledDataSource();
    static final DataSource ds_JDBC = new DataSource();

    static Properties prop = new Properties();
    static {
        try {
            prop.load(ConnectionPool.class.getClassLoader().getResourceAsStream("connectionpool.properties"));

            ds_dbcp2.setDriverClassName( prop.getProperty("DriverClass") );
            ds_dbcp2.setUrl( prop.getProperty("URL") );
            ds_dbcp2.setUsername( prop.getProperty("UserName") );
            ds_dbcp2.setPassword( prop.getProperty("Password") );
            ds_dbcp2.setInitialSize( 5 );

            ds_c3p0.setDriverClass( prop.getProperty("DriverClass") );
            ds_c3p0.setJdbcUrl( prop.getProperty("URL") );
            ds_c3p0.setUser( prop.getProperty("UserName") );
            ds_c3p0.setPassword( prop.getProperty("Password") );
            ds_c3p0.setMinPoolSize(5);
            ds_c3p0.setAcquireIncrement(5);
            ds_c3p0.setMaxPoolSize(20);

            PoolProperties pool = new PoolProperties();
            pool.setUrl( prop.getProperty("URL") );
            pool.setDriverClassName( prop.getProperty("DriverClass") );
            pool.setUsername( prop.getProperty("UserName") );
            pool.setPassword( prop.getProperty("Password") );
            pool.setValidationQuery("SELECT 1");// SELECT 1(mysql) select 1 from dual(oracle)

            pool.setInitialSize(5);
            pool.setMaxActive(3);
            ds_JDBC.setPoolProperties( pool );
        } catch (IOException e) {   e.printStackTrace();
        } catch (PropertyVetoException e) { e.printStackTrace(); }
    }

    public static Connection getDBCP2Connection() throws SQLException {
        return ds_dbcp2.getConnection();
    }

    public static Connection getc3p0Connection() throws SQLException {
        return ds_c3p0.getConnection();
    }

    public static Connection getJDBCConnection() throws SQLException {
        return ds_JDBC.getConnection();
    }
}
public static boolean exists(String UserName, String Password ) throws SQLException {
    boolean exist = false;
    String SQL_EXIST = "SELECT * FROM users WHERE username=? AND password=?";
    try ( Connection connection = ConnectionPool.getDBCP2Connection();
          PreparedStatement pstmt = connection.prepareStatement(SQL_EXIST); ) {
        pstmt.setString(1, UserName );
        pstmt.setString(2, Password );

        try (ResultSet resultSet = pstmt.executeQuery()) {
            exist = resultSet.next(); // Note that you should not return a ResultSet here.
        }
    }
    System.out.println("User : "+exist);
    return exist;
}

jdbc:<DB>:<drivertype>:<HOST>:<TCP/IP PORT>:<dataBaseName> jdbc: oracle :thin:@localhost:1521:myDBName jdbc: mysql ://localhost:3306/myDBName

connectionpool.properties

URL         : jdbc:mysql://localhost:3306/myDBName
DriverClass : com.mysql.jdbc.Driver
UserName    : root
Password    :

Веб Приложение: Кому избегайте проблем подключения, когда все соединения закрыты [MySQL «wait_timeout» по умолчанию 8 часов], чтобы повторно открыть соединение с базовым БД.

Вы можете сделать это, чтобы проверить каждый Соединение путем установки testOnBorrow = true и validationQuery = «SELECT 1» и donot использует autoReconnect для сервера MySQL, поскольку он устарел. issue

===== ===== context.xml ===== =====
<?xml version="1.0" encoding="UTF-8"?>
<!-- The contents of this file will be loaded for a web application -->
<Context>
    <Resource name="jdbc/MyAppDB" auth="Container" 
        factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" 
        type="javax.sql.DataSource" 

        initialSize="5" minIdle="5" maxActive="15" maxIdle="10"

        testWhileIdle="true"
            timeBetweenEvictionRunsMillis="30000"

        testOnBorrow="true"
            validationQuery="SELECT 1"
            validationInterval="30000"


        driverClassName="com.mysql.jdbc.Driver" 
        url="jdbc:mysql://localhost:3306/myDBName" 
        username="yash" password="777"
    />
</Context>

===== ===== web.xml ===== =====
<resource-ref>
    <description>DB Connection</description>
    <res-ref-name>jdbc/MyAppDB</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>
===== ===== DBOperations ===== =====
servlet «   init() {}
Normal call used by sevlet  « static {}

static DataSource ds;
static {
    try {
        Context ctx=new InitialContext();
        Context envContext = (Context)ctx.lookup("java:comp/env");
        ds  =   (DataSource) envContext.lookup("jdbc/MyAppDB");
    } catch (NamingException e) {   e.printStackTrace();    }
}

См. также:

96
ответ дан Community 22 August 2018 в 15:39
поделиться
  • 1
    Благодарю. Даже не нужно было обращаться к документам c3p0. :) – Gaurav 21 December 2011 в 11:44
  • 2
    То же самое. Я уже много лет наблюдаю за блокировкой DBCP под нагрузкой. Версия после версии. – Vasiliy 1 November 2013 в 19:13
  • 3
    да, но C3P0 также, у меня был лучший опыт работы с BoneCP – Nicolas Mommaerts 8 May 2015 в 13:08
  • 4
    В примере с пулом String Constant я понимаю, когда вы написали & quot; Если String-copy доступен [.equals ()] в пуле, то возвращает ссылку. «В противном случае объект String добавляется в пул и возвращает ссылку. & Quot; Но в public class StringPoolTest есть только два метода void, поэтому они ничего не возвращают. Этот код действительно проходит процесс управления пулом строк? Кажется, он даже не использует никаких аргументов. – jeffery_the_wind 6 July 2016 в 08:59
  • 5
    @jeffery_the_wind: - это просто знать концепцию пула, для проверки пула строк я просто использовал hashCode, identityHashCode методы . изменил код ... – Yash 6 July 2016 в 09:31
  • 6
    Извините, s1 не определен? – jeffery_the_wind 6 July 2016 в 09:45
  • 7
    @jeffery_the_wind: - извините, в спешке пропустили две линии ... – Yash 6 July 2016 в 10:01
  • 8
    Хорошо, просто хотел убедиться, что я все это видел. Я буду работать над этим. Что мне нужно для чего-то ближе к вашему классу ConnectionPool. Спасибо. – jeffery_the_wind 6 July 2016 в 10:19

Я бы рекомендовал использовать библиотеку commons-dbcp . Существует множество примеров , которые перечислены о том, как его использовать, вот ссылка на перемещение простой . Использование очень просто:

 BasicDataSource ds = new BasicDataSource();
 ds.setDriverClassName("oracle.jdbc.driver.OracleDriver")
 ds.setUsername("scott");
 ds.setPassword("tiger");
 ds.setUrl(connectURI);
 ...
 Connection conn = ds.getConnection();

Вам нужно только создать источник данных один раз, поэтому убедитесь, что вы прочитали документацию, если не знаете, как это сделать. Если вы не знаете, как правильно писать инструкции JDBC, чтобы не утечка ресурсов, вам также может понадобиться прочитать эту страницу Wikipedia .

14
ответ дан Eric Hauser 22 August 2018 в 15:39
поделиться
  • 1
    Создает ли это пул соединений? – llm 14 May 2010 в 18:05
  • 2
    @llm Конечно! Определение интерфейса javax.sql.DataSource содержит реализацию «Объединение пулов». (кроме того, я думаю, вы уже знаете, что такое интерфейс JDBC) – Eddy 14 November 2016 в 10:26

Как уже было сказано другими, вы, вероятно, будете довольны Apache Dbcp или c3p0 .

Не имеет ли javax.sql или java.sql объединения реализаций соединений?

Что касается вашего сомнения

Почему бы не использовать их лучше?

Они не предоставляют реализаций, а скорее интерфейсов и некоторых классов поддержки, но только для программистов, которые реализуют сторонние библиотеки (пулы или драйверы ). Обычно вы даже не смотрите на это. Ваш код должен иметь дело с соединениями из вашего пула, так же, как и «простые» соединения прозрачным способом.

4
ответ дан leonbloy 22 August 2018 в 15:39
поделиться

MiniConnectionPoolManager является реализацией одного Java-файла, если вы ищете встраиваемое решение и не слишком озабочены действиями (хотя я не тестировал его в этом отношении) .

Это многопрофильный EPL , LGPL и MPL .

В его документации также дает альтернативы, заслуживающие проверки (над DBCP и C3P0):

0
ответ дан Matthieu 22 August 2018 в 15:39
поделиться

Вы должны рассмотреть возможность использования UCP. Пул универсальных подключений (UCP) - пул соединений Java. Это богатый возможностями пул соединений и тесно интегрирован с базами данных Oracle Real Application Clusters (RAC), ADG, DG.

Подробнее о UCP см. на этой странице .

1
ответ дан Nirmala 22 August 2018 в 15:39
поделиться

На сервере приложений мы используем то, где я работаю (Oracle Application Server 10g, как я помню), пул обрабатывается сервером приложений. Мы извлекаем javax.sql.DataSource с помощью поиска JNDI с помощью javax.sql.InitialContext .

он сделал что-то вроде этого

try {     
   context = new InitialContext();
   jdbcURL = (DataSource) context.lookup("jdbc/CachedDS");
   System.out.println("Obtained Cached Data Source ");
}
catch(NamingException e)   
{  
    System.err.println("Error looking up Data Source from Factory: "+e.getMessage());
}

(Мы не пишем этот код, он скопирован из этой документации .)

7
ответ дан Powerlord 22 August 2018 в 15:39
поделиться

Для этой цели Apache Commons имеет библиотеку: DBCP . Если у вас нет странных требований к вашим пулам, я бы использовал библиотеку, поскольку она будет сложнее и тонче, чем вы могли бы надеяться.

3
ответ дан sblundy 22 August 2018 в 15:39
поделиться

Обычно, если вам нужен пул соединений, вы пишете приложение, которое выполняется в некоторой управляемой среде, то есть вы работаете на сервере приложений. Если это так, убедитесь, что проверьте, какие средства пула соединений, которые ваш сервер приложений предоставляет , перед тем, как попробовать какие-либо другие параметры.

Исходное решение будет лучше всего интегрировано с остальными ресурсами серверов приложений. Если, однако, вы не работаете внутри сервера приложений, я бы порекомендовал компонент Apache Commons DBCP . Он широко используется и обеспечивает всю базовую функциональность объединения, требуемую большинством приложений.

18
ответ дан Tendayi Mawushe 22 August 2018 в 15:39
поделиться

HikariCP

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

14
ответ дан tobijdc 22 August 2018 в 15:39
поделиться
97
ответ дан Community 5 November 2018 в 13:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: