Cómo configurar de forma personalizada las propiedades de conexión de origen de datos en la Primavera de Arranque 1.3.x con defecto de Tomcat conexión de la piscina

Necesito establecer algunas específicas de Oracle JDBC propiedades de conexión con el fin de acelerar el lote INSERTs (defaultBatchValue) y la masa SELECTs (defaultRowPrefetch).
Tengo sugerencias cómo lograr esto con el DBCP (Gracias a M. Deinum), pero me gustaría:

  • mantener la opción por defecto de Tomcat jdbc connection pool
  • mantener la aplicación.yml para la configuración

Yo estaba pensando en una función de solicitud de apoyo spring.datasource.custom_connection_properties o similares en el futuro y porque de este tratado pretent esto ya era posible. Hice esto por que pasa la información pertinente al crear el origen de datos y manipular la creación del origen de datos como este:

@Bean
public DataSource dataSource() {
    DataSource ds = null;

    try {
        Field props = DataSourceBuilder.class.getDeclaredField("properties");
        props.setAccessible(true);
        DataSourceBuilder builder = DataSourceBuilder.create();
        Map<String, String> properties = (Map<String, String>) props.get(builder);

        properties.put("defaultRowPrefetch", "1000");
        properties.put("defaultBatchValue", "1000");

        ds = builder.url( "jdbc:oracle:thin:@xyz:1521:abc" ).username( "ihave" ).password( "wonttell" ).build();

        properties = (Map<String, String>) props.get(builder);

        log.debug("properties after: {}", properties);
    } ... leaving out the catches ...
    }
    log.debug("We are using this datasource: {}", ds);
    return ds;
}

En los registros puedo ver que estoy creando la correcta origen de datos:

2016-01-18 14:40:32.924 DEBUG 31204 --- [           main] d.a.e.a.c.config.DatabaseConfiguration   : We are using this datasource: [email protected]{ConnectionPool[defaultAutoCommit=null; ...

2016-01-18 14:40:32.919 DEBUG 31204 --- [           main] d.a.e.a.c.config.DatabaseConfiguration   : properties after: {password=wonttell, driverClassName=oracle.jdbc.OracleDriver, defaultRowPrefetch=1000, defaultBatchValue=1000, url=jdbc:oracle:thin:@xyz:1521:abc, username=ihave}

El actuador me muestra que mi código sustituye el origen de los datos:

Cómo configurar de forma personalizada las propiedades de conexión de origen de datos en la Primavera de Arranque 1.3.x con defecto de Tomcat conexión de la piscina

Pero la configuración no se activa, lo que puedo ver, mientras que el perfil de la aplicación. El defaultRowPrefetch se encuentra todavía en 10 que hace que mi SELECTs a ser mucho más lento de lo que serían si 1000 fue activada.

Modificación de las propiedades es no va a funcionar, no son esas propiedades desea modificar…
Yo pensaba que estas eran las propiedades que se pasa al conectar con el controlador JDBC. Lo que los hace diferentes de lo que yo pensaba ?
No, No lo son pasadas durante la conexión. Estas son las propiedades internas utilizadas por el DataSourceBuilder y contienen sólo un pequeño número de utilizable propiedades para uso interno.
Estás en lo correcto, me puse esto a través de en el depurador y vio que incluso si DataSourceBuilder haría honor a estas propiedades, el tomcat origen de datos jdbc / ~Proxy no directa setter para esto.

OriginalEl autor Marged | 2016-01-18

3 Kommentare

  1. 8

    Configuración de las piscinas connectionProperties debería funcionar. Aquellos que se pasan al controlador JDBC. Agregue esto a la aplicación.propiedades:

    spring.datasource.connectionProperties: defaultRowPrefetch=1000;defaultBatchValue=1000
    

    Editar (información básica):

    Tenga en cuenta también que puede configurar cualquiera de las fuentes de datos de la aplicación
    propiedades específicas a través de la primavera.origen de datos.*: consulte la
    la documentación de la conexión de la piscina de la aplicación que está utilizando para
    más detalles.

    fuente: primavera-inicio de documentación

    Esto parece funcionar para las propiedades que se pasan en la url de jdbc. En mi escenario defaultRowPrefetch debe ser aprobada en un conjunto de Properties que es el segundo parámetro utilizado en getConnection(String url, Properties prop) y sigue a la derecha después de la url de jdbc. Pero de todos modos gracias por tu edición.
    Como se mencionó aquí por el desarrollador líder en la Primavera de Arranque, a partir de la versión 1.4, que la propiedad ya no existe.

    OriginalEl autor Cyril

  2. 1

    Alguna información adicional para complementar la respuesta de @Cirilo. Si desea upvote uso de su respuesta, no la mía.

    Yo estaba un poco perplejo de lo fácil que es configurar otras propiedades de la conexión que en el fin de acostumbrarse al crear la conexión de base de datos. Así que hice un poco de investigación.

    spring.datasource.connectionProperties es no mencionado en el referencia. He creado un problema a causa de esto.
    Si hubiese usado el La primavera de Arranque YML editor, habría visto que las propiedades son compatibles. Aquí es lo que PTS sugiere al crear un application.yml y pulse Ctrl+Espacio:

    Cómo configurar de forma personalizada las propiedades de conexión de origen de datos en la Primavera de Arranque 1.3.x con defecto de Tomcat conexión de la piscina

    El guión no importa, porque de relajado unión pero si lo interpretamos literalmente los propertys nombre es spring.datasource.connection-properties.

    La correcta instalación de la aplicación.yml se parece a esto:

    spring:
        datasource:
            connection-properties: defaultBatchValue=1000;defaultRowPrefetch=1000
            ...
    

    Esto hace que el honor que es probado por mi perf4j mediciones de masa SELECTs.

    Antes:

    2016-01-19 08:58:32.604 INFO 15108 — [ principal]
    org.perf4j.TimingLogger : inicio[1453190311227]
    tiempo[1377] etiqueta[elementos]

    Después:

    2016-01-19 08:09:18.214 INFO 9152 — [ principal]
    org.perf4j.TimingLogger : inicio[1453187358066]
    tiempo[147] etiqueta[elementos]

    El tiempo tomado para completar la instrucción de las gotas de 1377ms a 147, lo cual es una enorme ganancia en rendimiento.

    No se menciona porque no es un general de la propiedad disponible. Funciona porque estás usando Tomcat JDBC, si usted quiere utilizar por ejemplo Commons DBCP o un HikariCP basado en la piscina que la propiedad no esté disponible o no trabajan. Es debido a la unión que funciona (tal vez es una característica que debe ser documenten).
    Estás en lo correcto, para otros grupos de conexión necesitamos un enfoque que mostró en mi otra pregunta. Pero como Tomcat JDBC de la piscina es el valor predeterminado duele no mencionar las opciones de configuración específicas 😉 he creado un tema en github porque de esto.
    Como he tratado de dejar claro que no hay defecto… depende de las dependencias que tiene.
    Tal vez estamos hablando sólo de la definición de «default». Mi definición de «default» en este caso es lo que se utiliza cuando no se selecciona otro grupo de conexión de la dependencia. Como el contenedor predeterminado en la Primavera de Arranque de Tomcat obtendrá automáticamente Tomcat JDBC piscina (a menos que cambie este)
    Código de sabio no tiene ningún valor predeterminado, que es lo que para mí es líder en… de Detección es de hecho siempre…

    OriginalEl autor Marged

  3. 1

    Después de cavar alrededor en el Tomcat código para un poco, he encontrado que la dataSource.getPoolProperties().getDbProperties() es el Properties objeto que realmente va a conseguir utiliza para generar conexiones para la piscina.

    Si utiliza el BeanPostProcessor enfoque mencionado por @m-deinum, pero en lugar de usarlo para rellenar el dbProperties así, usted debería ser capaz de añadir las propiedades de una manera que hace que se peguen y se pasan al controlador de Oracle.

    import java.util.Properties;
    import org.apache.tomcat.jdbc.pool.DataSource;
    import org.apache.tomcat.jdbc.pool.PoolConfiguration;
    
    @Component
    public class OracleConfigurer implements BeanPostProcessor {
        @Override
        public Object postProcessBeforeInitialization(Object bean, String name) throws BeansException {
            if (bean instanceof DataSource) {
                DataSource dataSource = (DataSource)bean;
                PoolConfiguration configuration = dataSource.getPoolProperties();
                Properties properties = configuration.getDbProperties();
                if (null == properties) properties = new Properties();
                properties.put("defaultRowPrefetch", 1000);
                properties.put("defaultBatchValue", 1000);
                configuration.setDbProperties(properties);
            }
            return bean;
        }
    
        @Override
        public Object postProcessAfterInitialization(Object bean, String name) throws BeansException {
            return bean;
        }
    }

    OriginalEl autor Russell B

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea