Hola nuevamente Ivan

El 13-08-2015 a las 16:38, Ivan Perales M. escribió:
Muchas gracias por sus comentarios.

Con respecto a las bases de datos, si tienen razón en que debí usar mejor schemas, pero ya que todo lo hago atravéz de jdbc, se me hizo más facil solo resolver una base de datos diferente dependiendo el cliente seleccionado, en lugar de estar asignando el schema a los queries, desconosco si el driver de postgres se pueda asignar el search_path por thread, aunque voy a tener que investigar mas a fondo.

Con respecto al pgbouncer lo voy a revisar tambien, en su momento no lo consideré por que el software no es de alta concurrencia y mientras menos dependencias externas para mi mejor.

si alguna vez has entrado a instagram, has pasado por un pgbouncer :D, pues tengo entendido que ellos lo utilizan, puede ser una excelente referencia de alta concurrencia.
http://highscalability.com/blog/2012/4/9/the-instagram-architecture-facebook-bought-for-a-cool-billio.html


saludos


Si la creación de una nueva conexió tarda algunos milisegundos, por el volumen de uso tan mínimo creo que no es problema por lo pronto cerrar conexiones cada que se termine la transacción.

Saludos y de nuevo muchas gracias por su tiempo a Alvaro y Anthony

2015-08-13 14:12 GMT-05:00 Anthony Sotolongo <asotolo...@gmail.com <mailto:asotolo...@gmail.com>>:



    On 13/08/15 15:52, Ivan Perales M. wrote:
    No creo que pgbouncer sea mi opción, presisamente mi problema es
    que las conexiones se cachean llegando así al límite de las 100
    predeterminadas que vienen en postgres.

    lo has probado?

    Lo que necesito es algo así como un datasource global al que le
    pueda pasar datasources de bases de datos específicas y éste se
    encargue de checar idle times para cerrar conexiones.

    el pgbouncer hace algo como eso, chequea parámetros de
    configuracion(https://pgbouncer.github.io/config.html) como:


          server_lifetime

    The pooler will try to close server connections that have been
    connected longer than this. Setting it to 0 means the connection
    is to be used only once, then closed. [seconds]

    Default: 3600.0


          server_idle_timeout

    If a server connection has been idle more than this many seconds
    it will be dropped. If 0 then timeout is disabled. [seconds]

    Default: 600.0


          server_connect_timeout

    If connection and login won’t finish in this amount of time, the
    connection will be closed. [seconds]

    Default: 15.0


          query_timeout

    Queries running longer than that are canceled. This should be used
    only with slightly smaller server-side statement_timeout, to apply
    only for network problems. [seconds]

    Default: 0.0 (disabled)


          query_wait_timeout

    Maximum time queries are allowed to spend waiting for execution.
    If the query is not assigned to a server during that time, the
    client is disconnected. This is used to prevent unresponsive
    servers from grabbing up connections. [seconds]

    Default: 0.0 (disabled)


          client_idle_timeout

    Client connections idling longer than this many seconds are
    closed. This should be larger than the client-side connection
    lifetime settings, and only used for network problems. [seconds]

    Default: 0.0 (disabled)


          idle_transaction_timeout

    If client has been in “idle in transaction” state longer, it will
    be disconnected. [seconds]

    Default: 0.0 (disabled)



    saludos


    Pero no encontré  ninguno y tampoco creo que lo haya, ya que no
    es un muy buen diseño manejar cantidad variables de bases de
    datos, pero bueno, es el diseño que mejor cumple nuestro
    requerimiento. Creo que lo que tendré que hacer es asignar un
    tiempo de vida a las conexiones idle para que se vayan cerrando
    las conexiones mas viejas, y ya que el sistema no es de alta
    concurrencia, a lo mucho 10 usuarios, espero no impacte el
    performance de estar abriendo conexiones cada cierto tiempo.

    Saludos

    2015-08-13 13:00 GMT-05:00 Anthony Sotolongo
    <asotolo...@gmail.com <mailto:asotolo...@gmail.com>>:

        Hola Ivan

        On 13/08/15 14:38, Ivan Perales M. wrote:

            Buenas tardes, pido su opinión ya que no soy muy bueno
            administrando bases de datos.

            Tengo un software el cua maneja bases de datos dinámicas,
            es decir, una base de datos fija principal y se crea una
            base de datos por cada cliente que se registra en el
            programa. El software está desarrollado en java y utilizo
            BasiDataSource de apache como pool de conexiones para
            cada base de datos.

            El software es también cliente-servidor, lo que significa
            que un usuario puede estar trabajando con una base de
            datos y otro usuario con otra, lo que significa que se
            tienen una o más conexiones por cada base de datos, mas
            aparte un usuario puede switchear entre clientes con solo
            seleccionarlo de un listado, lo que implica crear
            conexiones a esa base de datos si nadie la estaba usando.

            Hace poco noté que un cliente del software registró mas
            de 100 clientes en el programa, y pusieron a una muchacha
            a cargar cierta información a cada cliente, por lo que se
            crearon 1 conexión por cada base y a eso le sumamos que
            otros usuarios estaban trabajando con algunos clientes,
            pues algunas bases de datos llegaron a tener hasta 5
            conexiones. Llego un momento en que se superaron las 100
            conexiones predeterminadas para usuarios regulares que ya
            no se pudo trabajar en muchos clientes. Al checar en
            pg_stat_activity efectivamente estaban 99 conexiones. El
            ultimo uso de la mayoria de conexiones tenia varios
            minutos, de entre 3 hasta 10, por lo que seguramente
            fueron las primeras bases de datos que se abrieron.

            Lo que me gustaria me aconsejaran es a decidir si aumento
            el numero de conexiones para usuarios regulares u
            optimizo los datasource para que cierren la conexión a
            por decir 2 o 3 minutos de que no se utilize. No se que
            tanto le impacte al performance que se esten abriendo
            nuevas conexiones en lugar de mantenerlas abiertas, por
            poner un ejemplo un usuario genera un reporte y comienza
            a analizar la información, puede llevar 10 segundos en lo
            que genera otro reporte para mejorar el análisis ó puede
            llevarse mas de 10 minutos.

        No conocemos los recursos que dispones, pero aumentar el num
        de conexiones en PostgreSQL no vas a resolver mucho, no
        conozzo como tu driver utiliza el pool de conexiones, pero
        sino no estas claro,  se te aconseja utilizar alguno, el
        pgbouncer te puede ayudar a resolver el tema

            Además, van a existir algunos procesos automáticos que
            agarren cada base de datos para generar reportes
            utilizando el datasource, por lo que yo no tengo control
            sobre cuantas conexiones crea cada uno.

            Saludos y gracias por su tiempo

-- Lindolfo Iván Perales Mancinas
            Solo existen 10 tipos de personas en el mundo, las que
            saben binario y las que no.

        Saludos




-- Lindolfo Iván Perales Mancinas
    Solo existen 10 tipos de personas en el mundo, las que saben
    binario y las que no.




--
Lindolfo Iván Perales Mancinas
Solo existen 10 tipos de personas en el mundo, las que saben binario y las que no.

Responder a