Пул соединений JOOQ с использованием gradle

Я читаю из activemq и запускаю хранимую процедуру для значения, полученного из activemq.

Поскольку я собираюсь запускать большой объем с регулярной скоростью, мы включили Threading для чтения сообщений из activemq и запуска хранимой процедуры.

После этого я обнаружил, что JOOQ не использует пул соединений и последовательно выполняет все операции SQL.

Журнал JOOQ:

15:30:51.843 [Thread-19973] DEBUG org.jooq.tools.StopWatch - Query executed           : Total: 03:27
15:30:51.843 [Thread-19973] DEBUG org.jooq.tools.LoggerListener - Fetched result           : +-----------------------+
15:30:51.843 [Thread-19973] DEBUG org.jooq.tools.LoggerListener -                          : |loadoutputtobatchoutput|
15:30:51.843 [Thread-19973] DEBUG org.jooq.tools.LoggerListener -                          : +-----------------------+
15:30:51.843 [Thread-19973] DEBUG org.jooq.tools.LoggerListener -                          : |                       |
15:30:51.843 [Thread-19973] DEBUG org.jooq.tools.LoggerListener -                          : +-----------------------+
15:30:51.844 [Thread-19973] DEBUG org.jooq.tools.StopWatch - Finishing                : Total: 03:27, +0.272ms
15:30:51.856 [Thread-19975] DEBUG org.jooq.tools.StopWatch - Query executed           : Total: 03:27
15:30:51.856 [Thread-19975] DEBUG org.jooq.tools.LoggerListener - Fetched result           : +-----------------------+
15:30:51.856 [Thread-19975] DEBUG org.jooq.tools.LoggerListener -                          : |loadoutputtobatchoutput|
15:30:51.856 [Thread-19975] DEBUG org.jooq.tools.LoggerListener -                          : +-----------------------+
15:30:51.856 [Thread-19975] DEBUG org.jooq.tools.LoggerListener -                          : |                       |
15:30:51.856 [Thread-19975] DEBUG org.jooq.tools.LoggerListener -                          : +-----------------------+
15:30:51.856 [Thread-19975] DEBUG org.jooq.tools.StopWatch - Finishing                : Total: 03:27, +0.267ms
15:30:51.905 [Thread-19976] DEBUG org.jooq.tools.StopWatch - Query executed           : Total: 03:28
15:30:51.905 [Thread-19976] DEBUG org.jooq.tools.LoggerListener - Fetched result           : +-----------------------+
15:30:51.905 [Thread-19976] DEBUG org.jooq.tools.LoggerListener -                          : |loadoutputtobatchoutput|
15:30:51.905 [Thread-19976] DEBUG org.jooq.tools.LoggerListener -                          : +-----------------------+
15:30:51.905 [Thread-19976] DEBUG org.jooq.tools.LoggerListener -                          : |                       |
15:30:51.905 [Thread-19976] DEBUG org.jooq.tools.LoggerListener -                          : +-----------------------+
15:30:51.906 [Thread-19976] DEBUG org.jooq.tools.StopWatch - Finishing                : Total: 03:28, +0.256ms
15:30:51.938 [Thread-19977] DEBUG org.jooq.tools.StopWatch - Query executed           : Total: 03:28

Сборка Gradle для инициализации JOOQ:

jooq {
   csmart(sourceSets.main) {
      jdbc {
         driver = 'org.postgresql.Driver'
         url = 'jdbc:postgresql://0.0.0.0:8000/XXX'
         user = 'XXX'
         password = 'XXX'
         schema = 'public'
      }
      generator {
         name = 'org.jooq.util.DefaultGenerator'
         strategy {
            name = 'org.jooq.util.DefaultGeneratorStrategy'
         }
         database {
            name = 'org.jooq.util.postgres.PostgresDatabase'
            inputSchema = 'public'
            customTypes {
               customType {
                  name = 'JsonElement'
                  type = 'com.google.gson.JsonElement'                 
                  converter = 'XXX'
               }
            }
            forcedTypes {
               forcedType {
                  name = 'JsonElement'
                  expression = 'public\\.batchoutput\\.batchoutput_json|public\\.batchinput\\.batchinput_json'                           
               }
            }
         }
         generate {
           // relations = false
           //records = false            
           // pojos = true  
           // daos = true         
         }
         target {
            packageName = 'XXX'
            directory = 'jooq'
         }
      }
   }
}

РЕДАКТИРОВАТЬ:

Класс подключения JOOQ:

package com.check.orchestrator.di.configuration;

import com.jolbox.bonecp.BoneCPDataSource;
import org.jooq.SQLDialect;
import org.jooq.impl.DataSourceConnectionProvider;
import org.jooq.impl.DefaultConfiguration;
import org.jooq.impl.DefaultDSLContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy;
import org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;
import javax.sql.DataSource;

@Configuration
@ComponentScan({
       "check.dal.jooq.tables.daos"
})
@EnableTransactionManagement
public class DBContextConfiguration {
    private static final String PROPERTY_NAME_DB_DRIVER = "db.driver";
    private static final String PROPERTY_NAME_DB_PASSWORD = "db.password";    
    private static final String PROPERTY_NAME_DB_URL = "db.url";
    private static final String PROPERTY_NAME_DB_USERNAME = "db.username";
    private static final String PROPERTY_NAME_JOOQ_SQL_DIALECT = "sql.dialect";
    private Properties properties;  

    @Bean(destroyMethod = "close")
    public DataSource dataSource() {        
        BoneCPDataSource dataSource = new BoneCPDataSource();
        properties = new Properties();      

        try {
            properties.load(new FileInputStream("src/config.properties"));          
        }
        catch (IOException e) {         
        }

        dataSource.setDriverClass(properties.getProperty(PROPERTY_NAME_DB_DRIVER));
        dataSource.setJdbcUrl(properties.getProperty(PROPERTY_NAME_DB_URL));
        dataSource.setUsername(properties.getProperty(PROPERTY_NAME_DB_USERNAME));
        dataSource.setPassword(properties.getProperty(PROPERTY_NAME_DB_PASSWORD));      

        return dataSource;
    }

    @Bean
    public LazyConnectionDataSourceProxy lazyConnectionDataSource() {
        return new LazyConnectionDataSourceProxy(dataSource());
    }

    @Bean
    public TransactionAwareDataSourceProxy transactionAwareDataSource() {
        return new TransactionAwareDataSourceProxy(lazyConnectionDataSource());
    }

    @Bean
    public DataSourceTransactionManager transactionManager() {
        return new DataSourceTransactionManager(lazyConnectionDataSource());
    }

    @Bean
    public DataSourceConnectionProvider connectionProvider() {
        return new DataSourceConnectionProvider(transactionAwareDataSource());
    }   

    @Bean
    public DefaultConfiguration configuration() {
        DefaultConfiguration jooqConfiguration = new DefaultConfiguration();

        jooqConfiguration.set(connectionProvider());        

        String sqlDialectName = properties.getProperty(PROPERTY_NAME_JOOQ_SQL_DIALECT);        
        SQLDialect dialect = SQLDialect.valueOf(sqlDialectName);
        jooqConfiguration.set(dialect);

        return jooqConfiguration;
    }

    @Bean
    public DefaultDSLContext dslContext() {
        return new DefaultDSLContext(configuration());
    }  

}

person The6thSense    schedule 09.11.2017    source источник
comment
Как вы настраиваете свой jOOQ Configuration / DSLContext (обратите внимание, конфигурация генерации кода, вероятно, здесь не помогает)   -  person Lukas Eder    schedule 10.11.2017
comment
@LukasEder Приносим извинения за неудобства, я добавил класс подключения.   -  person The6thSense    schedule 10.11.2017


Ответы (1)


На самом деле это не вопрос, связанный с jOOQ, а вопрос, связанный с BoneCP и его конфигурацией по умолчанию. Вы не указали, сколько соединений вы хотели бы иметь в своем пуле, поэтому будет применяться значение по умолчанию - что, вероятно, недостаточно.

Документация BoneCP не слишком конкретна в отношении его значений по умолчанию, но вы можете легко перепроектировать это из com.jolbox.bonecp.BoneCPConfig. Соответствующие атрибуты:

/** Min number of connections per partition. */
private int minConnectionsPerPartition = 1;
/** Max number of connections per partition. */
private int maxConnectionsPerPartition = 2;
/** Number of partitions. */
private int partitionCount = 1;

Таким образом, по умолчанию ваш пул соединений будет иметь максимум 2 соединения. Не слишком впечатляюще.

person Lukas Eder    schedule 10.11.2017