Java y C Principios y Aplicaciones de la piscina # base de datos de conexión

Java y C # base de datos de principio de agrupación de conexiones

En el desarrollo actual de Internet, de alta concurrencia en la corriente principal, y que es la parte más crítica de las operaciones de base de datos y el acceso, en el desarrollo actual de Internet, el marco ORM no es pobre, tales como: Net-Core de EFCore, SqlSugar, pulcro. El JAVA Primavera-DataJpa (EntityManager), mybatis, MybatisPlus etc.

Pero cuando se trata de ORM en realidad esencialmente operar componentes de acceso a la base de datos de nivel más bajo: Ado.net, JDBC

Hoy vengo a conversar principio de agrupación de conexiones de base de datos el acceso de dos

Al hablar ante Ado.net y la conexión JDBC conjunto de datos, primero tiene que entender lo que es la agrupación de conexiones de base de datos

Conectar con el servidor de base de datos por lo general tarda mucho tiempo en varios pasos. se deben establecer canales físicos (tales como enchufes o canalizaciones con nombre) debe ser el apretón de manos inicial con es necesario el servidor para analizar la información de la cadena de conexión, deben ser autenticados por el servidor está conectado, para ejecutar una comprobación debe estar registrado en la transacción actual, y similares.

De hecho, la mayoría de las aplicaciones utilizan sólo una o unas pocas configuraciones de conexión diferentes. Esto significa que durante la ejecución de la aplicación, muchos de la misma conexión se abre y se cierra repetidamente. Este es el costo de rendimiento de la CPU. Con el fin de minimizar el costo de la conexión abierta, ADO.NET utilizando técnicas de optimización conocidos como la agrupación de conexiones. Las técnicas de optimización de Java es la agrupación de conexiones JDBC.

En general, el proceso de las aplicaciones Java que acceden a la base de datos son:

  1. Cargar el controlador de base de datos;
  2. conexión de base de datos se establece a través de JDBC;
  3. El acceso a la base de datos, ejecutar sentencias SQL;
  4. Desconectarse de la base de datos.

Este es un paso común de conexión de base de datos Tomcat de conexiones de cartografía y de base de datos Jdbc

El proceso de las aplicaciones .Net Framwork / .Net Core que acceden a la base de datos es la base cuatro sujetos por el proveedor de datos de .NET:

1.Conexión: conexión a la base de datos 2.Command: ejecutar comandos de base de datos 3.DataReader: 4.DataAdapter responsable de leer los datos de una fuente de datos: de contacto responsable de la recolección de datos y base de datos

Esta es la conexión de base de datos de mapeo Ado.net

Ado.net:

Ado.net etapa de conexión de base de datos:

1.新建一个数据库连接字符串
string conStr = “Data Source=.;Initial Catalog=MySchoolDB;Integrated Security=True”;
2.引入命名空间:
using System.Data.SqlClient;
3.创建SqlConnection对象
SqlConnection conn = new SqlConnection(conStr);
4.打开连接:
conn.Open();
5.关闭连接:
conn.Close();
五、使用Command对象的步骤:
1.创建数据库连接
SqlConnection conn = new SqlConnection(conStr);
2.定义sql语句
string sql = “insert into Admin values(‘值’)”;
3.创建SqlCommand对象
SqlCommand cmd = new SqlCommand(conn,sql);
4.执行命令
cmd.ExecuteScalar();

Ya sabemos que en el momento de la conexión, si en el caso de un aumento repentino de momento el tráfico, a continuación, el hilo se abrirá más de acceso a la base de datos, que es la conexión básica ha sido insuficiente esta vez para hacer frente a la elevada acceso concurrente a los altos QPS

Esta vez Mircosoft creado una base de datos proporcionada por el proveedor de datos de conexión de la piscina agrupación de conexiones --Ado.net: permite aplicaciones para guardar la conexión utilizado en la agrupación de conexiones para evitar cada vez para completar la creación / cierre completa la conexión del proceso.

Proveedor de datos completa el proceso de establecer una conexión a la recepción de una solicitud de conexión es:

  1. El establecimiento de una nueva conexión con el conjunto de conexiones (es decir, "conexión lógica"), y el establecimiento de la "conexión lógica" correspondiente "conexión física." Establecer una "conexión lógica" debe ir acompañada de la creación de una "conexión física."
  2. Proveedor de datos unidos completan un procedimiento cerrado es apagar "conexión lógica" correspondiente "conexión física" y destruido "conexión lógica".
  3. Destrucción "conexión lógica" debe ir acompañado de cerca "conexión física", SqlConnection.Open () está solicitando una conexión de proveedor de datos no necesariamente tiene que ser completado para establecer un proceso completo de conectar al proveedor de datos, puede simplemente separados del conjunto de conexiones disponibles puedes;
  4. SQLConnection.close () es una petición para cerrar una conexión, el proveedor de datos no tiene por qué terminar un ciclo completo de cerrar la conexión, puede que sólo necesite el conector puede ser liberado de nuevo a la agrupación de conexiones.

Ahora escribo un código de prueba a prueba sin necesidad de utilizar un pool de conexiones de conexiones de base de efecto: mientras que detecto un consumo de CPU con contadores de rendimiento de Windows

class Program
{
    static void Main(string[] args)
    {
        SqlConnection con = new SqlConnection("server=.\\sqlexpress;database=zsw;pooling=true;trusted_connection=true;uid=sa;pwd=zsw158991626ZSW;");
        for (int i = 0; i < 10; i++)
        {
            try
            {
                con.Open();
                Console.WriteLine("开始连接数据库" + System.Threading.Thread.CurrentThread.Name);
                System.Threading.Thread.Sleep(1000);
            }
            catch (Exception e) { Console.WriteLine(e.Message); }
            finally
            {
                con.Close();
                System.Threading.Thread.Sleep(1000);
            }
        }
        Console.Read();
    }
}

Esta vez mi código se encuentra en la agrupación de conexiones de base de datos, y mis conexiones sólo uno, pero cuando nos deshacemos de Console.Readkey establecimiento de la agrupación = false en este momento cuando mi conexión de datos ocupa 10, debido a mi equipo pruebas de rendimiento de SQL Server no se abre, pero que más tarde puede ir en línea Baidu intentan ver el número de conexiones

Pero! .Net Core conectado a una base de datos parece ser la agrupación de conexiones de datos por defecto abierto, lo que encuentro por un largo documento no hay resultados.

Esta puesta en común Entonces, ¿qué es?

Cada vez que el programa necesita tiempo para leer y escribir en la base de datos. Connection.Open () utilizará la ConnectionString para conectarse a la base de datos, la base de datos va a establecer una conexión para el programa, y ​​permanece abierta, después de lo cual el programa puede utilizar instrucciones T-SQL para consultar / actualizar la base de datos. Al realizar la Connection.close (), la base de datos se cerrará la conexión actual. Bueno, todo se ve son tan metódica.

Pero si mi necesidad programa no programada para abrir y cerrar las conexiones (como ASP.Net o servicio Web), por ejemplo, cuando Http solicitud enviada al servidor ,, tenemos que abrir la conexión y luego usar el Select * from tabla devuelve una DataTable / conjunto de datos al cliente / navegador, y luego cerrar la conexión actual. Que cada Abrir / Cerrar conexión operación de manera frecuente para todo el sistema, sin duda, convertirse en un desperdicio.

ADO.Net equipo dará una mejor métodos de solución. La conexión guardada anterior, la próxima vez que necesite conexiones abiertas cuando la conexión anterior a la próxima conexión. Este es el conjunto de conexiones.

Pues bien, esta agrupación es cómo funciona?

En primer lugar, cuando un programa se ejecuta Connection.open (), ADO.net necesidad de juzgar, esto soportes de conexión Connection Pool (por defecto es True Pooling), si se especifica Falso, ADO.net se crea entre la base de datos y una conexión (por para evitar confusiones, todos conectados a la base de datos, utilizar la descripción de "conexión"), entonces vuelve al programa. Si especifica cierto que ConnectString ADO.net se basará crear un pool de conexiones, y luego siga los pasos de conexión al pool de conexiones (programa de todas las conexiones .net, utilizar la descripción de "conexión"). Conexión para llenar el número determinado por el tamaño Min piscina (por defecto es 0) propiedades. Por ejemplo, si se especifica 5, el tiempo entre ADO.net base de datos SQL abierta 5 está conectado, la conexión 4, almacenada en el conjunto de conexiones, una conexión de retorno.

Cuando el programa se ejecuta a Connection.close () de. La agrupación de conexiones piscina se puso Si es True, ADO.net actual puesto de conexión y se mantiene entre la base de datos de conexión. Mientras que también la determinación de por vida de la conexión (por defecto es 0) propiedades, 0 representa el infinito, si hay tiempo excede de conexión LifeTime Conexión, ADO.net conexión se cerrará mientras está desconectado de la conexión a la base de datos, en lugar de volver a guardarlo en conexión acumularse en.

(Esto se utiliza principalmente en la agrupación de bases de datos SQL, cargar los propósitos de equilibrio). Si Pooling designado Falso, la desconectados directamente entre la base de datos.

Entonces la próxima vez Connection.Open () la ejecución de las veces, ADO.Net conexión determinará si el nuevo ConnectionString connectionString previamente almacenado en el conjunto de conexiones es consistente. (ADO.Net ConnectionString se convertirá en una secuencia binaria, por decirlo así, el nuevo ConnectionString debe coincidir exactamente con ConnectionString de la conexión guarda en pool de conexiones en incluso agregó un espacio adicional, o modificar ciertos atributos en la cadena de conexión el orden hará ADO.Net piensan que esto es una conexión nueva, y volver a crear una nueva conexión, por lo que si usted está utilizando un ID de usuario, contraseña método de autenticación, modificar la contraseña dará lugar a una conexión, si está utilizando el SQL la autenticación integrada, tiene que salvar a dos conexiones con el mismo).

ADO.net entonces necesario determinar si la conexión actual piscina de conexión no se puede utilizar (no está siendo utilizado por otro programa), si no, es necesario determinar ADO.net máximo del grupo ajuste Tamaño ConnectionString (por defecto es 100), si la conexión toda conexión piscina no alcanza Tamaño máximo del grupo, ADO.net se conectará a la base de datos de nuevo para crear una conexión, y luego volverá al programa de conexión.

Si ha llegado a MaxPoolSize, ADO.net nuevo no va a crear nuevas conexiones, pero espera pool de conexiones están ocupadas por otros programas Liberación de la conexión, este tiempo de espera por SqlConnection.ConnectionTimeout (por defecto es de 15 segundos) restricciones, también es decir, si hay más de 15 segundos, SqlConnection tirará error (lo que a veces si SqlConnection.open () método genera un error de tiempo de espera, una posible razón es que no hay tiempo Connnection cierre previo, mientras que el número de pool de conexiones alcanzó la MaxPoolSize.)

Si uno está disponible Conexión, retirado del conjunto de conexiones La conexión no se devuelve directamente al programa, ADO.net También es necesario comprobar la propiedad ConnectionString ConnectionReset (el valor predeterminado es True) la necesidad de que la mayor parte de restablecimiento de conexión tiempo. Esto es porque, antes de volver de la conexión de programa puede haber sido modificado, por ejemplo, el uso del método para modificar la conexión actual, entonces de conexión devuelto puede haber sido conectado a la conexión actual de cadena no se especifica en la base de datos de catálogo inicial SqlConnection.ChangeDatabase. Es necesario restablecer una conexión actual. Sin embargo, debido a todas las comprobaciones adicionales aumentarán ADO.net Connection Pool sobrecarga en el sistema.

grupo de conexión se crea para cada cadena de conexión única. Cuando se crea una piscina, se crea una pluralidad de objeto de conexión y se añade a la piscina con el fin de cumplir con el lote mínimo. La necesidad de añadir a la piscina está conectado, pero no puede superar el tamaño máximo del conjunto (por defecto es 100). nuevo en la piscina liberado cuando la conexión está cerrada o abierta.

resumen

Cuando la solicitud objeto SqlConnection, si hay una conexión disponible de la piscina para obtener el objeto. Disponible para conectar, no debe ser utilizado, teniendo un juego contexto de transacción asociados o cualquier contexto de transacción, y el servidor tiene un enlace válido.

La puesta en común de conexión al proceso mediante la reasignación cuando una conexión se libera de nuevo a la piscina, para satisfacer estas solicitudes de conexión. Si el tamaño máximo de la piscina se ha alcanzado y no hay conexión disponible, se pondrá en cola la solicitud. Entonces, el proceso de tratar de restablecer la piscina cualquier conexión hasta alcanzar el tiempo de espera (por defecto es de 15 segundos). Si la piscina antes de que el proceso de conexión no puede satisfacer la solicitud, se produce una excepción.

El buen uso de la agrupación de conexiones mejorará en gran medida el rendimiento de la aplicación. Por el contrario, si se usa incorrectamente, entonces más daño que beneficio. En general, debe seguir los siguientes principios:

  1. En la última solicitud de tiempo de conexión, la conexión se libera a la mayor brevedad.
  2. Desactive la transacción definida por el usuario relevante cuando se cierra la conexión.
  3. Asegurar y mantener el conjunto de conexiones tiene al menos una conexión abierta.
  4. Trate de evitar la generación de desechos celulares. incluyendo los restos celulares y escombros generados piscina integrado de seguridad generada por el uso de muchas bases de datos.

JDBC:

Tener un Ado.net venir a hablar JDBC, lenguaje Java porque yo también recientemente aprendido de forma natural los dos se compararon

La agrupación de conexiones JDBC base de datos predeterminada

El método no proporciona un pool de conexiones JDBC API. Algunas grandes servidores de aplicaciones web, tales como BEA WebLogic y WebSphere de IBM proporcionan mecanismo de agrupación de conexiones, pero debe haber un métodos especiales de clase de su apoyo de terceros para el uso conjunto de conexiones.

JDBC de agrupación de conexiones de base de datos utilizada para representar javax.sql.DataSource, el origen de datos sólo es una interfaz que es típicamente proporcionada por un servidor implementado (WebLogic, WebSphere, Tomcat), se proporcionan una serie de implementación de código abierto:

  ①DBCP agrupación de conexiones de base de datos

  ②C3P0 agrupación de conexiones de base de datos

  DataSource se refiere generalmente como fuente de datos, la agrupación de conexiones y que comprende dos porciones de gestión de piscina conectado, los hábitos refiere a menudo como un origen de datos de agrupación de conexiones

  Conectados a diferentes fuentes de datos y las bases de datos, sin necesidad de crear una pluralidad de fuentes de datos, que está conectado a la planta de generación de base de datos, la totalidad de las necesidades de la aplicación a una sola fuente de datos.

  Después del final de acceso de base de datos, el programa sigue siendo la misma que antes de cerrar la conexión de base de datos: conn.Close (), pero por encima de código no se cierra la conexión física a la base de datos, es sólo la liberación de la conexión de base de datos, devuelto a la agrupación de conexiones de base de datos.

JDBC mecanismo de agrupación de conexiones de base de datos:

agrupación de conexiones de base de datos es responsable de la distribución, la gestión y la liberación de conexiones de bases de datos. agrupación de conexiones de base de datos en la inicialización, crea un cierto número de conexiones en la agrupación de conexiones, se hace el número de éstos conexión de base para establecer el número mínimo de conexiones de bases de datos. Si no han utilizado la conexión de base de datos, el conjunto de conexiones siempre permanecerá allí, al menos tantos número de conexiones. El número máximo de agrupación de conexiones de base de datos limita el número máximo de conexiones ocupado por la agrupación de conexiones, cuando el número de solicitudes de conexión de la aplicación a la agrupación de conexiones es superior a este límite, se añadirá la solicitud a la cola de espera. El número mínimo de conexiones y el número máximo de conexiones de base de datos creada en cuenta varios factores:

1) El número mínimo de conexiones a la conexión de base de agrupación de conexiones de bases de datos se mantendrá, si cuando una aplicación utiliza la conexión de base de datos no es particularmente grande, habrá un gran número de recursos de conexión de base de datos se pierden;

2) número máximo de conexiones es el número máximo de conexiones a la lata aplicación de base de datos, si este número excede un solicitudes de conexión de base de datos, más tarde se añadirán solicitud de conexión de base de datos a la cola de espera, de manera que éste afectará el funcionamiento de la base de datos;

3) Si el número mínimo de conexiones y el número máximo de conexiones que hay mucha diferencia, entonces la solicitud de conexión será el primero en ganancias, después de más de un número mínimo de conexiones de la conexión es equivalente a re-crear una nueva conexión de base de datos. Sin embargo, éstos mayor que el mínimo número de conexiones no se ha terminado de utilizar la conexión de base de datos se libera inmediatamente, se coloca en el grupo de conexiones después de esperar el tiempo de espera de inactividad reutilizado o liberado.

Ahora tratamos de utilizar manera DBCP para conectarse a la base de datos

1, crear un proyecto Maven y crear un nuevo archivo en db.properties recursos

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mysql?&useSSL=false&serverTimezone=UTC
jdbc.username=root //用户名
jdbc.password=123456 //密码
initSize=10 //初始化连接数
maxTotal=200 //最大连接数
maxIdle=60 //最大空闲数,数据库连接的最大空闲时间。超过空闲时间,数据库连接将被标记为不可用,然后被释放。设为0表示无限制。

2, seguido de la introducción de la experta en dependencia paquete

<dependencies>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.19</version>
    </dependency>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-dbcp2</artifactId>
        <version>2.7.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-pool2</artifactId>
        <version>2.7.0</version>
    </dependency>

    <dependency>
        <groupId>commons-logging</groupId>
        <artifactId>commons-logging</artifactId>
        <version>1.2</version>
    </dependency>
</dependencies>

copia directa y pegar, pero por favor, nota que debe volver a JDK versión predeterminada 8 o superior!

3, a continuación, una nueva clase JdbcUtil

package com.jdbc.util;    
import org.apache.commons.dbcp2.BasicDataSource;
import java.io.InputStream;
import java.sql.Connection;
import java.util.Properties;

/**
 * DBCP的方式链接数据库
 */
public class JdbcUtil {
    private static String driver;
    private static String url;
    private static String username;
    private static String password;
    private static int initSize;
    private static int maxTotal;
    private static  int maxIdle;
    private static BasicDataSource ds;
    static {
        ds = new BasicDataSource();
        Properties cfg=new Properties();
        try { //读取db.properties文件
            InputStream in = JdbcUtil.class
                    .getClassLoader()
                    .getResourceAsStream("db.properties");
            cfg.load(in);
            //初始化参数
            driver=cfg.getProperty("jdbc.driver");
            url=cfg.getProperty("jdbc.url");
            username=cfg.getProperty("jdbc.username");
            password=cfg.getProperty("jdbc.password");
            initSize=Integer.parseInt(cfg.getProperty("initSize"));
            maxTotal=Integer.parseInt(cfg.getProperty("maxTotal"));
            maxIdle=Integer.parseInt(cfg.getProperty("maxIdle"));
            in.close();
            //初始化连接池
            ds.setDriverClassName(driver);
            ds.setUrl(url);
            ds.setUsername(username);
            ds.setPassword(password);
            ds.setInitialSize(initSize);
            ds.setMaxTotal(maxTotal);
            ds.setMaxIdle(maxIdle);
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }
    public static Connection getConnection() {//连接数据库封装类
        try {
            /*
             * getConnection()从连接池中获取的重用
             * 连接,如果连接池满了,则等待。
             * 如果有归还的连接线,则获取重用的连接
             */
            Connection conn = ds.getConnection();
            return conn;
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }
    public static void close(Connection conn) {//关闭数据库的连接方法,封装复杂的关闭过程;
        if(conn!=null) {
            try {
                //将用过的连接归还到连接池
                conn.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

4, se escribe una prueba de clase para verificar

package com.jdbc.service;
import com.jdbc.util.JdbcUtil;

import java.sql.Connection;
import java.sql.SQLException;

public class JdbcTest {
    public static void main(String[] args) {
        try {
            for (int i=0;i<1000;i++){
                Thread a= new Thread(new TestThread(),"线程:"+(i+1));
                a.start();
                System.out.println(a.getName()+"已启动");
            }
        }
        catch (Exception ex){
            ex.printStackTrace();
        }
    }
    private static class TestThread implements Runnable{

        private Connection con= JdbcUtil.getConnection();
        @Override
        public void run() {
            try {
                if (con.isClosed()){
                    System.out.println("连接已经关闭");
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
            finally {
                //JdbcUtil.close(con);
                //System.out.println("\t"+Thread.currentThread().getName()+"已关闭");
            }
        }
    }
}

Ahora ejecute la prueba y se encontró que la producción

Puerto ocupa 200, abrió el grupo de subprocesos de trabajo, pero no dio a conocer el puerto de conexión, pero cambia un bit db.properties número máximo de conexiones de 300, ahora vamos a ver los resultados

Se puede ver se está dando nuestra conexión de base de datos, esta es la razón? Debido a que mi puerto de conexión local MySQL 200 sólo cuando el puerto está conectado a más de 200 colapsará. También es común la base de datos cuello de botella conectividad

Ahora cerramos el código sin comentar la conexión, se puede ver que incluso si hay 1.000 conexiones se realizan de forma rápida, y no ocupará puerto adicional

DBCP camino es el camino de la utilización de servidores Tomcat, por lo que en Tomcat mediante un pool de conexiones de datos o necesario, por lo menos en concurrencia general de continuar! La agrupación de conexiones de base de datos puede utilizar ya sea integrado con el servidor de aplicaciones, la aplicación también se puede utilizar de forma independiente.

resumen

El JDBC de Java y Microsoft Ado.net de hecho esencial diferencia no es muy grande, al igual que para el funcionamiento de la base de datos, la mayor base de datos de su enlace de cuello de botella fundamental es realmente el problema?

A continuación, el índice de la base de datos, la base de datos ahora sub-biblioteca subtabla, hay una tecnología de separación de leer y escribir es debido a lo que? Por lo tanto, la agrupación de conexiones de base de datos es uno de los optimización del rendimiento, optimización de base de datos y muchos más en el futuro funcionamiento de esperar a que la gente explore

Tales como la corriente de Alibaba Druida, es el más demanda de mejores resultados, ORM de Microsoft también se han abierto temprana están optimizados para la agrupación de conexiones de base de datos, que marca el futuro de Internet no es un cuello de botella ha sido la situación con una base de datos relacional tradicional

NoSQL futura intervención popular por lo que la alta concurrencia mejor asumir la tarea de grandes proyectos de Internet!

De hecho, para Ado.net y JDBC no me tomo el tiempo para comparar el rendimiento, yo como C # también como Java, este es un excelente lenguaje de aprender unos de otros, y luego escribir el código, como algoritmo de aprendizaje, si usted comienza a entender la forma de escritura creo que un buen código, no se preocupan por las ventajas de rendimiento de la lengua.

Este artículo se refiere a:

https://blog.csdn.net/huwei2003/article/details/71459198

https://blog.csdn.net/hliq5399/article/details/73292023

https://blog.csdn.net/weixin_40751299/article/details/81609332

https://www.cnblogs.com/justdoitba/p/8087984.html

https://www.cnblogs.com/albertrui/p/8421791.html

https://blog.csdn.net/L_it123/article/details/88205528

Gracias por encima de los peces gordos del artículo, por lo que puede ahorrar tiempo para escribir este artículo.

Supongo que te gusta

Origin www.cnblogs.com/sandaman2019/p/12558313.html
Recomendado
Clasificación