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

Сторонний пул соединений JDBC Configuration Database

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

Контекст

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

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

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

  1. Скачайте пакет драйвера JDBC. Подробности см. в Downloading the JDBC or ODBC Driver.

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

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

    Параметр

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

    Описание

    driverClassName

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

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

    url

    N/A

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

    username

    N/A

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

    password

    N/A

    Password.

    connectionProperties

    N/A

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

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

    defaultAutoCommit

    N/A

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

    defaultReadOnly

    N/A

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

    defaultTransactionIsolation

    N/A

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

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

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

    defaultCatalog

    N/A

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

    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

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

    minIdle

    0

    Минимальное количество неактивных соединений. Минимальное количество неактивных соединений, которое следует сохранять в пуле. Если количество неактивных соединений опускается ниже этого значения, создаются новые неактивные соединения. Значение 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

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

    timeBetweenEvictionRunsMillis

    -1

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

    numTestsPerEvictionRun

    3

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

    minEvictableIdleTimeMillis

    1000 * 60 * 30

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

    softMinEvictableIdleTimeMillis

    -1

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

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

    Если minEvictableIdleTimeMillis задано положительным числом, evictor неактивных соединений сначала проверяет его значение (независимо от количества неактивных соединений в текущем пуле), а затем значение (включая условие minIdle) softMinEvictableIdleTimeMillis.

    maxConnLifetimeMillis

    -1

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

    logExpiredConnections

    true

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

    connectionInitSqls

    N/A

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

    lifo

    true

    Последний пришёл — первый ушёл.

    • Последний пришёл — первый ушёл. Если этот параметр установлен в true, пул соединений возвращает сначала последнее использованное соединение (если в пуле есть доступные неактивные соединения).
    • Если этот параметр установлен в 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

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

    Если значение 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 Connection Pool

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

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

    Table 2 параметры пула соединений Hikari CP

    Параметр

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

    Описание

    driverClassName

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

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

    jdbcUrl

    N/A

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

    username

    N/A

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

    password

    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

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

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

    схема

    N/A

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

    threadFactory

    N/A

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

    scheduledExecutor

    N/A

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

Настройка Druid Connection Pool

  1. Скачайте пакет драйвера JDBC. Подробности см. в Downloading the JDBC or ODBC Driver.

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

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

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

    Параметр

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

    Описание

    url

    N/A

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

    username

    N/A

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

    password

    N/A

    Пароль.

    driverClassName

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

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

    initialSize

    0

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

    maxActive

    8

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

    minIdle

    0

    Минимальное количество неактивных потоков в пуле потоков. Druid периодически сканирует количество соединений. Если количество превышает указанное значение, избыточные соединения закрываются. Если соединений меньше, создаются новые. Этот параметр помогает управлять соединениями при высоких объёмах запросов, хотя может занимать много времени.

    connectTimeout

    N/A

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

    socketTimeout

    N/A

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

    maxWait

    -1

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

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

    poolPreparedStatements

    false

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

    maxOpenPreparedStatements

    N/A

    Если PSCache включён, значение этого параметра должно быть greater than 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, чтобы обеспечить безопасность без снижения производительности. Если время простоя больше чем значения timeBetweenEvictionRunMillis, выполнение команды validationQuery не поможет.

    timeBetweenEvictionRunsMillis

    60s

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

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

    1. Устанавливает интервал, с которым поток Destroy проверяет соединения.
    2. Служит справочным материалом для проверки testWhileIdle. Подробности см. в описании атрибута testWhileIdle.

    minEvictableIdleTimeMillis

    30min

    Максимальное время жизни простоя соединения перед выселением. Если время с момента последней активности превышает minEvictableIdleTimeMillis, соединение закрывается потоком Destroy.

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

    connectionInitSqls

    N/A

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

    exceptionSorter

    N/A

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

    filters

    N/A

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

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

    proxyFilters

    N/A

    The type is List<com.alibaba.druid,filter.Filter>. You can configure both filter and proxyFilters.

    removeAbandoned

    false

    Нужно ли восстанавливать утекшие соединения.

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

    removeAbandonedTimeout

    300s

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

    logAbandoned

    false

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

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

    removeAbandonedTimeoutMillis

    5min

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

    maxEvictableIdleTimeMillis

    7hours

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

    maxPoolPrepareStatementPerConnectionSize

    20

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

    keepAlive

    false

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

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

    notFullTimeoutRetryCount

    0

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

    logSlowSql

    false

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

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

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

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