Облачная платформаAdvanced

Сторонний пул соединений конфигурационной базы данных JDBC

Язык статьи: Русский
Показать оригинал
Страница переведена автоматически и может содержать неточности. Рекомендуем сверяться с английской версией.

Контекст

У DWS нет собственного JDBC‑пула соединений, и унаследованный пул соединений PostgreSQL находится в офлайн‑режиме. Используйте сторонние пулы соединений, такие как Druid, HikariCP или DBCP 2.

Note
  • Пул соединений, унаследованный JDBC от PostgreSQL, выведен из эксплуатации и не рекомендуется.
  • Определите версию JDBC и драйвера для загрузки, а также способ настройки параметров пула соединений в соответствии с требованиями сайта.

Настройка пула соединений DBCP 2

  1. Скачайте пакет драйвера JDBC. Для получения подробной информации см. Скачивание драйвера JDBC или ODBC.

  2. Добавьте пакет драйвера JDBC и commons-dbcp2, commons-logging, и commons-pool2 пакеты драйверов в проект и настройте параметры, связанные с пулом соединений базы данных.

    Note
    • Включение removeAbandoned разрешает пулу соединений вернуть и повторно использовать отбрасываемое соединение. Это происходит, когда условия (getNumIdle() < 2) и (getMaxTotal() - 3) выполнены.
      • Например, если maxTotal установлен в 20, имеется 18 активных соединений и одно соединение ограничено. В этом случае, removeAbandoned срабатывает.
      • Активное соединение удаляется только когда оно не используется в течение периода времени, указанного в removeAbandonedTimeout. Значение по умолчанию — 300 секунд.
      • Обход результирующего набора не считается использованием. Создание statement, prepared statement, callable statement или выполнение запроса сбрасывает the lastUsed свойство родительского соединения.
    • В системах с высокой нагрузкой установка maxIdle установление небольшого значения может привести к немедленному закрытию новых соединений. Это происходит потому, что активные потоки закрывают соединения быстрее, чем те, которые открывают соединения. В результате количество неактивных соединений превышает значение maxIdle. В системах с высокой нагрузкой наиболее подходящее значение maxIdle в системе с высокой нагрузкой зависит от сценария применения, но значение по умолчанию является хорошим начальным значением.
    Таблица 1 Параметры пула соединений DBCP 2

    Параметр

    Значение по умолчанию

    Описание

    driverClassName

    Введите значение org.postgresql.Driver.

    Имя драйвера базы данных.

    url

    N/A

    URL для подключения к базе данных.

    имя пользователя

    N/A

    Имя пользователя.

    пароль

    N/A

    Пароль.

    connectionProperties

    N/A

    Параметры соединения отправляются драйверу JDBC при установке нового соединения. Строка должна быть в формате [Parameter name=Parameter value;].

    NOTE:

    Необходимо указать атрибуты имени пользователя и пароля. Поэтому эти два параметра здесь включать не нужно.

    defaultAutoCommit

    N/A

    Автоматическая фиксация. По умолчанию соединение, созданное через текущий пул соединений, находится в состоянии автоматической фиксации. Если этот параметр не установлен, setAutoCommit метод не вызывается.

    defaultReadOnly

    N/A

    Настройка только для чтения. По умолчанию соединение, созданное через текущий пул соединений, является только для чтения. Если соединение не задано, то setReadOnly метод не вызывается.

    defaultTransactionIsolation

    N/A

    Уровень изоляции транзакций.

    Политика изоляции транзакций по умолчанию используется для соединений, созданных через этот пул. Значение может быть одним из следующих:

    • NONE
    • READ_COMMITTED: Операция чтения зафиксирована.
    • READ_UNCOMMITTED: Операция чтения не зафиксирована.
    • REPEATABLE_READ
    • SERIALIZABLE

    defaultCatalog

    N/A

    Каталог по умолчанию используется для соединений, созданных через этот пул.

    cacheState

    true

    Статус кеша пула соединений.

    Если этот параметр установлен в true, текущий статус только для чтения и параметры автокоммита кешируются во время первой операции чтения или записи после подключения пула ресурсов. Это устраняет необходимость дополнительных запросов к базе данных на последующих getter вызовы.

    Если к базовому соединению обращаются напрямую, изменения состояния только для чтения или параметров автокоммита не обновят кеш. Установите этот параметр в false чтобы отключить кеширование в таких случаях.

    defaultQueryTimeout

    null

    Интервал таймаута запроса.

    • Введите целое число, которое используется для указания интервала тайм‑аута запроса при создании оператора.
    • Если значение null, используются настройки драйвера по умолчанию.

    enableAutoCommitOnReturn

    true

    Когда соединение возвращается в пул, соединение автоматически отправляется.

    Установка его в true вернет соединение в пул с autoCommit установлено в true по умолчанию.

    rollbackOnReturn

    true

    Откатить все операции, когда соединение возвращается в пул.

    Установка его в true будет автоматически выполнено "rollback()" когда соединение возвращается в пул, при условии, что включена автоматическая отправка.

    initialSize

    0

    Количество начальных соединений. Количество соединений, создаваемых во время инициализации при запуске текущего пула соединений. Начальная версия — 1.2.

    maxTotal

    8

    Максимальное количество активных соединений в пуле. Отрицательное значение означает отсутствие ограничения.

    maxIdle

    8

    Maximum number of idle connections in the pool. Excess idle connections are released when returned to the pool. A negative value means there is no limit.

    minIdle

    0

    Минимальное количество idle соединений. Минимальное количество idle соединений, которое следует сохранять в пуле. Если количество idle соединений падает ниже этого значения, создаются новые idle соединения. Значение 0 означает, что бездействующие соединения не создаются.

    ПРИМЕЧАНИЕ:

    Значение применяется только когда timeBetweenEvictionRunsMillis установлено положительное число.

    maxWaitMillis

    N/A

    Максимальное время ожидания получения соединения из пула соединений.

    • Если этот параметр установлен в –1 и если соединение недоступно, пул соединений ждёт бесконечно, пока соединение не будет получено.
    • Если параметр установлен в N, пул соединений ждёт N миллисекунд. Если время ожидания недостаточно, генерируется исключение.

    validationQuery

    SELECT 1

    SQL‑оператор подтверждения запроса, проверяющий соединение до его возврата вызывающему через пул соединений.

    • Если указано, запрос должен быть SELECT оператор, возвращающий как минимум одну строку данных.
    • Если значение не указано, соединение проверяется вызовом "isValid()" метод.

    validationQueryTimeout

    N/A

    Интервал тайм‑аута запроса для корректных SQL‑операторов, в секундах.

    Если параметр установлен положительным числом, значение передаётся в "setQueryTimeOut()" метод JDBC‑драйвера. Настройка применяется к SQL‑оператору, подтверждающему валидность запроса.

    testOnCreate

    false

    Проверять действительность соединения сразу после создания. Если проверка не проходит, попытка создания завершается неудачей.

    testOnBorrow

    true

    Проверять действительность соединения, когда оно берётся из пула. Если проверка не проходит, соединение освобождается, и берётся другое.

    testOnReturn

    false

    Проверять действительность соединения перед его возвратом в пул.

    testWhileIdle

    false

    Проверять действительность неактивных соединений с помощью эвиктора, если доступен. Недействительные соединения освобождаются.

    timeBetweenEvictionRunsMillis

    -1

    Время простоя (в миллисекундах) для потока эвикции неактивных объектов. Неположительное значение отключает поток.

    numTestsPerEvictionRun

    3

    Количество объектов, проверяемых во время работы каждого потока удаления простаивающих объектов.

    minEvictableIdleTimeMillis

    1000 * 60 * 30

    Минимальное количество миллисекунд, в течение которых объекты, удовлетворяющие условиям удаления, находятся в простое в пуле. Минимальная длительность освобождения простаивающего соединения, в миллисекундах.

    softMinEvictableIdleTimeMillis

    -1

    Минимальное количество миллисекунд, в течение которых объекты, удовлетворяющие условиям удаления, находятся в простое в пуле.

    Простаивающие соединения освобождаются после как минимум N миллисекунд, при условии, что сохраняется по крайней мере количество соединений, указанное параметром minIdle, в пуле.

    Если miniEvictableIdleTimeMillis установлен в положительное число, удалитель простаивающих соединений проверяет miniEvictableIdleTimeMillis сначала, а затем softMinEvictableIdleTimeMillis и minIdle условие.

    maxConnLifetimeMillis

    -1

    Максимальное время жизни соединения (в миллисекундах). Соединения, превышающие это время, завершаются при следующей активации, пассивации или проверке. Значение 0 или отрицательное значение означает неограниченное время жизни.

    logExpiredConnections

    true

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

    connectionInitSqls

    N/A

    Этот параметр выполняет набор SQL‑запросов для инициализации физического соединения при его первом создании. Эти запросы выполняются только один раз для каждого соединения.

    lifo

    true

    Последний зашел, первый вышел.

    • Последний зашел, первый вышел. Если этот параметр установлен в true, пул соединений возвращает последнее использованное соединение первым (if there are available idle connections in the pool).
    • Если этот параметр установлен в false, пул работает как очередь FIFO и получает соединения из пула неактивных соединений в порядке, в котором они возвращаются.

    poolPreparedStatements

    false

    Это определяет, будет ли применяться пул предварительной обработки запросов в пуле соединений.

    maxOpenPreparedStatements

    N/A

    Максимальное количество операторов, которое может быть выделено в пуле операторов одновременно. Отрицательное значение означает отсутствие ограничений.

    Этот параметр также применяется к предварительно обработанному пулу операторов. Когда для каждого соединения создаётся пул операторов, в него включаются предварительно обработанные операторы, создаваемые следующим методом.

    public PreparedStatement prepareStatement(String sql)
    public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency)
    ПРИМЕЧАНИЕ:

    Убедитесь, что соединения оставляют ресурсы для других операторов, задав maxOpenPreparedStatements в значение, меньшее максимального количества курсоров.

    accessToUnderlyingConnectionAllowed

    false

    Это определяет, может ли PoolGuard получать доступ к базовым соединениям.

    removeAbandonedOnMaintenance

    removeAbandonedOnBorrow

    false

    Нужно ли удалять оставшиеся без внимания соединения, которые были оставлены более длительное время, чем указано в параметре removeAbandonedTimout.

    Если значение true, соединения, не использованные дольше чем removeAbandonedTimeout считаются заброшенными и удаляются.

    Создание или выполнение операторов сбрасывает lastUsed свойство родительского соединения.

    Установка этого параметра в true помогает восстанавливать соединения в приложениях с небольшим количеством операций записи.

    removeAbandonedTimeout

    300

    Интервал таймаута для удаления отклонённого соединения, в секундах.

    logAbandoned

    false

    Включать ли трассировку стека для отменённых операторов или подключённого кода в приложении. При включении трассировки стека для отменённых операторов и журналов, связанных с подключением, они будут перезаписываться каждый раз при открытии соединения или создании оператора.

    abandonedUsageTracking

    false

    Когда этот параметр установлен в true, пул соединений записывает трассировку стека каждый раз, когда вызывается метод на соединении из пула, сохраняя последнюю трассировку стека для облегчения отладки оставленных соединений.

    ПРИМЕЧАНИЕ:

    Установка этого параметра в true увеличит нагрузку. Будьте осторожны при выполнении этой операции.

    fastFailValidation

    false

    Этот параметр относится к быстрому отказу от операторов проверки, если происходит фатальное исключение, без выполнения isValid() или запрос проверки. Фатальные исключения включают конкретные SQL_STATE коды.

    • 57P01 (ADMIN SHUTDOWN)
    • 57P02 (CRASH SHUTDOWN)
    • 57P03 (CANNOT CONNECT NOW)
    • 01002 (SQL92 disconnect error)
    • JZ0C0 (Sybase disconnect error)
    • JZ0C1 (Sybase disconnect error)
    • Любой код SQL_STATE, начинающийся с "08"

    Коды исключений необходимо переопределить. Для получения деталей см disconnectionSqlCodes.

    disconnectionSqlCodes

    N/A

    Код исключения, представляющий собой код SQL_STATE, разделенный запятыми (,). Этот параметр действителен только когда fastFailValidation установлен в true.

    jmxName

    N/A

    Этот параметр регистрирует DataSource как JMX MBean с указанным именем, соответствующим синтаксису имени объекта JMX.

    registerConnectionMBean

    true

    Нужно ли регистрировать и подключаться к JMX MBean.

Настройка пула подключений Hikari CP

  1. Скачайте пакет драйвера JDBC. Для деталей смотрите Скачивание драйвера JDBC или ODBC.

  2. Добавьте в проект пакеты драйверов JDBC, HikariCP и SLF4J и настройте параметры, связанные с пулом подключений к базе данных.

    Таблица 2 Параметры пула соединений Hikari CP

    Параметр

    Значение по умолчанию

    Описание

    driverClassName

    Введите значение org.postgresql.Driver.

    Имя драйвера базы данных.

    jdbcUrl

    N/A

    URL для подключения к базе данных.

    Имя пользователя

    N/A

    Имя пользователя.

    Пароль

    N/A

    Пароль.

    autoCommit

    true

    Нужно ли автоматически отправлять транзакции, когда соединение возвращается в пул соединений.

    connectionTimeout

    30000

    Максимальный интервал ожидания получения соединений из пула соединений.

    idleTimeout

    60000

    Максимальное время жизни простоя соединения. Этот параметр вступает в силу только когда значение minimumIdle меньше, чем у maximumPoolSize.

    • Если количество простоя соединений больше значения minimumIdle и время простоя соединения больше значения idleTimeout, соединение удаляется из пула соединений.
    • 0 указывает отсутствие тайм‑аута.

    keepaliveTime

    0

    Интервал проверки наличия простоя соединений, в миллисекундах. 0 указывает, что функция отключена.

    maxLifetime

    1800000

    Максимальное время жизни соединения, в миллисекундах. 0 указывает отсутствие ограничения.

    connectionTestQuery

    N/A

    Запрос для проверки соединения.

    minimumIdle

    10

    Минимальное количество простоя соединений. Чтобы улучшить производительность, рекомендуется не задавать этот параметр. Размер пула соединений фиксирован.

    maximumPoolSize

    10

    Максимальное количество подключений.

    metricRegistry

    N/A

    Этот параметр может быть доступен только через программную конфигурацию или контейнер IoC.

    Этот параметр указывает экземпляр Codahale/Dropwizard MetricRegistry, используемый пулом для записи различных метрик.

    healthCheckRegistry

    N/A

    Этот параметр может быть доступен только через программную конфигурацию или контейнер IoC.

    Этот параметр указывает экземпляр Codahale/Dropwizard HealthCheckRegistry, используемый пулом для записи информации о состоянии.

    poolName

    N/A

    Имя пула подключений.

    initializationFailTimeout

    1

    Указывает, быстро ли пул подключений завершает инициализацию при ошибке.

    • Если значение больше 0, система пытается получить соединение в течение указанного времени (connectionTimeout + initializationFailTimeout). Если не удалось, пул не включается, и выбрасывается исключение.
    • Если значение равно 0, система пытается получить и проверить соединение. Если проверка не проходит, пул не включается.
    • Если значение меньше 0, пул запускается без попытки инициализации соединения.

    isolateInternalQueries

    false

    Определяет, следует ли изолировать запросы HikariCP в транзакции. Этот параметр вступает в силу, когда autoCommit установлен в false.

    allowPoolSuspension

    false

    Разрешать ли приостановку и возобновление пула соединений через JMX. Когда пул соединений приостановлен, соединение не завершает время ожидания, пока пул соединений не будет восстановлен.

    readOnly

    false

    Определяет, является ли соединение только для чтения.

    registerMbeans

    false

    Разрешить ли включить JMX.

    catalog

    N/A

    База данных по умолчанию catalog.

    connectionInitSql

    N/A

    SQL-запрос, исполняемый после инициализации пула соединений.

    transactionIsolation

    N/A

    Уровень изоляции транзакций по умолчанию.

    validationTimeout

    5000

    Интервал тайм‑аута для обнаружения соединения. Значение должно быть больше, чем значение connectionTimeout. Минимальное значение 250.

    leakDetectionThreshold

    0

    Максимальная продолжительность, на которую соединение может быть предоставлено.

    Минимальное значение — 2000 миллисекунд, используется для журналирования утечек соединения.

    schema

    N/A

    База данных по умолчанию schema.

    threadFactory

    N/A

    The java.util.concurrent.ThreadFactory экземпляр используется пулом соединений для создания потоков. Этот параметр может быть доступен только через программную конфигурацию или контейнер IoC.

    scheduledExecutor

    N/A

    The java.util.concurrent.ScheduledExecutorService экземпляр используется пулом соединений для выполнения запланированных задач. Этот параметр может быть доступен только через программную конфигурацию или контейнер IoC.

Настройка пула соединений Druid

  1. Скачайте пакет драйвера JDBC. Для получения подробностей см Скачивание драйвера JDBC или ODBC.

    Скачайте пакет драйвера Druid с https://druid.apache.org/downloads/.

  2. Добавьте пакеты драйверов JDBC и Druid в проект и настройте параметры, связанные с пулом соединений базы данных.

    Таблица 3 Параметры пула соединений Druid

    Параметр

    Значение по умолчанию

    Описание

    url

    N/A

    URL для подключения к базе данных.

    имя пользователя

    N/A

    Имя пользователя.

    пароль

    N/A

    Пароль.

    driverClassName

    Введите значение org.postgresql.Driver.

    Имя драйвера базы данных.

    initialSize

    0

    Количество физических соединений, устанавливаемых во время инициализации. Инициализация происходит, когда init method is invoked explicitly or when the getConnection method is invoked for the first time.

    maxActive

    8

    Maximum number of connections in the thread pool.

    minIdle

    0

    Minimum number of idle threads in the thread pool. Druid periodically scans the number of connections. If the number exceeds the specified parameter, redundant connections are closed. If fewer connections are available, new ones are created. This parameter helps manage connections during high request volumes, though it can be time-consuming.

    connectTimeout

    N/A

    Timeout interval for connecting to the database, in milliseconds.

    socketTimeout

    N/A

    Timeout interval for the socket to connect to the database, in milliseconds.

    maxWait

    -1

    Время ожидания нового запроса, когда соединения в пуле соединений исчерпаны, в миллисекундах.

    –1 указывает на бесконечное ожидание до возникновения таймаута.

    poolPreparedStatements

    false

    Определяет, кэшировать ли preparedStatement, то есть PSCache. PSCache значительно улучшает производительность базы данных, поддерживающей курсоры.

    maxOpenPreparedStatements

    N/A

    Если PSCache включён, значение этого параметра должно быть больше 0.

    Если значение больше 0, poolPreparedStatements будет автоматически установлено в true.

    validationQuery

    SELECT 1

    SQL‑запрос, используемый для проверки корректности соединения.

    Если validationQuery равно null, testOnBorrow, testOnReturn, и testWhileIdle параметры не вступают в силу, поскольку три параметра используются для проверки корректности соединения с базой данных путем выполнения SQL‑запроса, указанного validationQuery.

    testOnBorrow

    N/A

    При запросе соединения, validationQuery команда проверяет её корректность. Эта конфигурация может снизить производительность, поэтому используйте её с осторожностью.

    testOnReturn

    N/A

    Когда соединение возвращается, validationQuery команда проверяет её валидность. Эта конфигурация также может влиять на производительность, поэтому используйте её осторожно.

    testWhileIdle

    true

    Нужно ли проверять соединение, когда оно запрашивается. Лучше всего установить этот параметр в true чтобы обеспечить безопасность без ущерба для производительности. Если время простоя больше значения timeBetweenEvictionRunMills, выполняя validationQuery команда для проверки валидности соединения не будет иметь никакого эффекта.

    timeBetweenEvictionRunsMillis

    60s

    Эта validationQuery команда проверяет действительность соединения. Если количество неактивных соединений превышает minIdle, избыточные соединения закрываются. Если доступны меньшие количества неактивных соединений, создаются новые. Соединения, не использованные в течение времени, указанного в timeBetweenEvictionRunsMillis отключены.

    Этот параметр также:

    1. Sets the interval for the Destroy thread to check connections.
    2. Функционирует как ссылка для проверки testWhileIdle. Для получения подробностей см. описание testWhileIdle атрибут.

    minEvictableIdleTimeMillis

    30min

    Maximum lifetime of an idle connection before eviction. If the time since the last activity exceeds minEvictableIdleTimeMillis, соединение закрывается потоком Destroy.

    ПРИМЕЧАНИЕ:

    Этот параметр конфликтует с timeBetweenEvictionRunsMillis параметр. Вы можете оставить этот параметр пустым.

    connectionInitSqls

    N/A

    SQL‑запрос выполняется при инициализации физического соединения.

    exceptionSorter

    N/A

    Когда база данных генерирует некоторые необратимые исключения, соединение отбрасывается.

    filters

    N/A

    Этот параметр настраивает расширяющий плагин с использованием псевдонима. Тип атрибута — строка. Общие плагины включают фильтры, используемые для мониторинга и статистики:

    • stat: статистика мониторинга
    • log4j: запись журнала
    • стена: SQL предотвращение инъекций

    proxyFilters

    N/A

    Тип List<com.alibaba.druid,filter.Filter>. Вы можете настроить оба фильтр и proxyFilters.

    removeAbandoned

    false

    Восстанавливать ли утечки соединений.

    Когда getNumActive() подходы getMaxActive(), система восстанавливает недействительные соединения, не использованные в течение removeAbandonedTimeout период (300 секунд по умолчанию). Соединения, превышающие этот тайм-аут, принудительно закрываются.

    removeAbandonedTimeout

    300s

    Временной предел для Druid принудительно восстанавливать соединения, в секундах. Druid принудительно восстанавливает соединение из пула после того, как указанное время прошло с момента установления соединения, начиная с момента, когда программа получает соединение из пула.

    logAbandoned

    false

    Нужно ли выводить Лог при восстановлении утекших соединений.

    Этот параметр указывает, следует ли записывать информацию о стеке текущего потока в логи, когда removeAbandoned происходит.

    removeAbandonedTimeoutMillis

    5min

    Интервал таймаута для восстановления соединений. Если removeAbandoned установлен в true, Druid периодически проверяет, переполняется ли пул потоков. Если пул потоков не находится в рабочем состоянии и указанное время превышено, пул потоков освобождается.

    maxEvictableIdleTimeMillis

    7 часов

    Максимальное время простоя. Значение по умолчанию — 7 часов.

    maxPoolPrepareStatementPerConnectionSize

    20

    Максимальное количество SQL‑запросов, которые могут быть кэшированы для каждого соединения.

    keepAlive

    false

    Количество подключений minIdle, которые необходимо поддерживать при инициализации пула.

    Если количество подключений опускается ниже minIdle и время простоя превышает minEvictableIdleTimeMillis, the keepAlive операция выполняется для поддержания minIdle value.

    notFullTimeoutRetryCount

    0

    Количество повторных попыток, когда сумма количества выданных соединений в пуле соединений и количества доступных соединений меньше максимального допустимого количества соединений. Значение по умолчанию 0.

    logSlowSql

    false

    Выводить ли медленные SQL‑запросы.

  3. Используйте пул соединений Druid, основываясь на следующем примере.

    Создайте db.properties файл в ресурс каталог.

    # Database connection parameters
    url=jdbc:postgresql://10.10.0.13:8000/gaussdb
    username=user
    password=pass
    validationQuery=select 1
    validationQueryTimeout=300
    #driverClassName=JDBC driver name
    driverClassName=org.postgresql.Driver
    # Number of initialized connections
    initialSize=1
    # Maximum number of connections
    maxActive=20
    # Number of core threads. If the number of core threads is greater than this configured value, the threads are released.
    minIdle=10

    Пример кода:

    import com.alibaba.druid.pool.DruidDataSource;
    import com.alibaba.druid.pool.DruidDataSourceFactory;
    import com.alibaba.druid.pool.DruidPooledConnection;
    import java.io.IOException;
    import java.io.InputStream;
    import java.sql.ResultSet;
    import java.sql.Statement;
    import java.util.Properties;
    public class TestDataSource {
    private static DruidDataSource dataSource;
    public static void main(String[] args) throws Exception {
    Properties properties = loadProperties();
    dataSource = (DruidDataSource) DruidDataSourceFactory.createDataSource(properties);
    dataSource.setTimeBetweenEvictionRunsMillis(50 * 1000);
    dataSource.setRemoveAbandoned(true);
    dataSource.setRemoveAbandonedTimeout(120);
    dataSource.setSocketTimeout(5000);
    dataSource.setConnectTimeout(5000);
    dataSource.setQueryTimeout(5);
    final DruidPooledConnection connection = dataSource.getConnection();
    final Statement statement = connection.createStatement();
    execute(statement);
    }
    public static void execute(Statement statement) {
    ResultSet resultSet = null;
    try {
    resultSet = statement.executeQuery("select 1");
    while (resultSet.next()) {
    String str = resultSet.getString(1);
    System.out.println("n1 :" + str);
    return;
    }
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    /**
    * Load the configuration file and obtain parameters from the configuration file.
    */
    public static Properties loadProperties() {
    InputStream inputStream = TestDataSource.class.getClassLoader().getResourceAsStream("db.properties");
    Properties ps = new Properties();
    try {
    ps.load(inputStream);
    } catch (IOException e) {
    e.printStackTrace();
    }
    return ps;
    }
    }