Grupo de conexiones en marzo de 2021

1. Grupo de conexiones
Pregunta: ¿Qué es un grupo de conexiones y para qué sirve?
Pool de conexiones: Consiste en crear un contenedor para cargar múltiples objetos de conexión. Al usar el objeto de conexión, obtener una conexión del contenedor. Una vez completado el uso, vuelva a cargar la conexión en el contenedor. Este contenedor es el grupo de conexiones (DataSource), también conocido como fuente de datos.

Podemos obtener el objeto de conexión a través del grupo de conexiones.
Ventajas: ahorre la conexión y libere el consumo de rendimiento de la conexión: la conexión en el grupo de conexiones juega un papel en la multiplexación y mejora el rendimiento del programa.

,,,,,,,,,,,,,,,,,
agrupación de conexiones personalizado
1. Cree una clase MyDataSource y crear un LinkedList en esta clase
2. Inicializar la colección de lista en su método de construcción y cargarlo en que Cinco de conexión objetos.
3. Cree una conexión pública getConnection (), obtenga un objeto de conexión de la colección List y vuelva.
4. Cree un readd vacío público (Connection) Este método es para volver a cargar el objeto Connection usado en la colección List.
Problemas de código:
(1) Existe un estándar para la creación de grupos de conexiones.
Se define una interfaz DataSource en el paquete javax.sql. En
pocas palabras, todos los grupos de conexiones deben implementar la interfaz javax.sql.DataSource y nuestro grupo de conexiones personalizado debe implementar la interfaz DataSource.
(2) Cuando operamos, debemos usar el estándar, ¿cómo podemos hacer que con.close () no lo destruya, sino que lo recargue en el grupo de conexiones?
Para resolver este problema, la esencia es cambiar el comportamiento del método close () en la conexión.
Cómo cambiar el comportamiento de un método (mejorar la función del método)
1. Herencia: Debe poder controlar la estructura de esta clase.
2. El modo de decoración puede usar la clase de plantilla para evitar implementar todos los métodos
(1 ) La clase decorada y la clase decorada deben implementarse La misma interfaz o heredar la misma clase padre
(2) Tener una referencia de clase de decoración en la clase de decoración
(3) Mejorar la función del método
3. Proxy dinámico
El comportamiento se puede mejorar
Proxy.newProxyInstance (ClassLoader, Class [], InvocationHandler);
Conclusión: Si el objeto Connection se obtiene del grupo de conexiones, entonces el comportamiento de su método de cierre ha cambiado, no destruyendo, pero volviendo a cargar en el grupo de conexiones .
,,,,,,,,,,,,,,,,,,,,,,,,,,,
1. El grupo de conexiones debe implementar la interfaz javax.sql.DataSource
2. Se debe obtener el objeto de conexión a través del grupo de conexiones Hay un método getConnection en la interfaz DataSource
3. Vuelva a cargar Connection en el grupo de conexiones y use el método close () de Connection

2.
Grupo de conexiones de código abierto 1. c3p0 (debe cumplir)
c3p0 es un grupo de conexiones JDBC de código abierto, que implementa la fuente de datos y el enlace JNDI, admite la especificación JDBC3 y la extensión estándar JDBC2.
Los proyectos de código abierto que lo utilizan actualmente incluyen hibernate, spring, etc. La
diferencia entre c3p0 y dbcp es que
dbcp no tiene la función
de recuperar automáticamente las conexiones inactivas.
C3p0 tiene la función de recuperar automáticamente las conexiones inactivas. Uso del grupo de conexiones C3p0:
( 1) Uso de
c3p0-0.9.1.2.jar 1. Manual

ComboPooledDataSource cpds = nuevo ComboPooledDataSource ();
cpds.setDriverClass ("com.mysql.jdbc.Driver");
cpds.setJdbcUrl (“jdbc: mysql: /// día18”);
cpds.setUser ("raíz");
cpds.setPassword ("abc");

2. Automático (usando el archivo de configuración)

El archivo de configuración de c3p0 puede ser propiedades o xml.

Si el nombre del archivo de configuración c3p0 es c3p0.properties o c3p0-config.xml y está ubicado en la ruta classpath (el directorio de clases para aplicaciones web),
entonces c3p0 se buscará automáticamente.
Nota: Solo necesitamos colocar el archivo de configuración en src en ese momento.
usar:

ComboPooledDataSource cpds = new ComboPooledDataSource ();
1
Encontrará el archivo de configuración con el nombre especificado en el directorio especificado y cargará su contenido.

2.
dbcp (entender) dbcp es un grupo de conexiones de código abierto de apache.
Para utilizar el grupo de conexiones DBCP, descargue el paquete jar
. Importe dos
commons-dbcp-1.4.jar
commons-pool-1.5.6.jar al realizar la importación.
Acerca del uso del grupo de conexiones dbcp
1. Configuración manual (codificación manual)

		BasicDataSource bds = new BasicDataSource();
			// 需要设置连接数据库最基本四个条件
			bds.setDriverClassName("com.mysql.jdbc.Driver");
			bds.setUrl("jdbc:mysql:///day18");
			bds.setUsername("root");
			bds.setPassword("abc");
			// 得到一个Connection
			Connection con = bds.getConnection();

2. Configuración automática (usando archivos de configuración)

Propiedades props = new Properties ();
FileInputStream fis = new FileInputStream ("D: \ java1110 \ workspace \ day18_2 \ src \ dbcp.properties");
props.load (fis);
DataSource ds = BasicDataSourceFactory.createDataSource (apoyos);

Generalmente hay dos configuraciones para c3p0, una es para configurar a través del método set y la otra es para configurar configuraciones relacionadas a través del archivo c3p0-conflg.xml o c3p0.properties en el mismo directorio src.

c3p0 se configura mediante el método set

private static ComboPooledDataSource dataSource = new ComboPooledDataSource();
/**
 * 配置DataSource
 */
public static void configDataSource(){
    try {
        dataSource.setDriverClass("com.mysql.jdbc.Driver");
        dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/zhanghanlun");
        dataSource.setUser("zhanghanlun");
        dataSource.setPassword("123456");
        dataSource.setInitialPoolSize(3);
        dataSource.setMaxPoolSize(10);
        dataSource.setMinPoolSize(3);
        dataSource.setAcquireIncrement(3);
    } catch (PropertyVetoException e) {
        e.printStackTrace();
    }
}
/**
 * 获取Connection连接
 * @return
 */
public static Connection getConnection(){
    Connection conn = null;
    configDataSource();
    try {
        conn = dataSource.getConnection();
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return conn;
}

c3p0 se configura a través del archivo c3p0-config.xml.
En cuanto a la configuración a través del archivo de configuración,

Aquí debe colocar el método de archivo xml en la carpeta src, y c3p0 escaneará el archivo para la configuración relacionada.
Para agregar las dependencias c3p0 y mysql-connector-java a las dependencias de Maven, se debe escribir el número de versión.
No hay mucha tontería, aquí está el código del archivo c3p0-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
    <!-- 默认配置,如果没有指定则使用这个配置 -->
    <default-config>
        <property name="user">zhanghanlun</property>
        <property name="password">123456</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/zhanghanlun</property>
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="checkoutTimeout">30000</property>
        <property name="idleConnectionTestPeriod">30</property>
        <property name="initialPoolSize">3</property>
        <property name="maxIdleTime">30</property>
        <property name="maxPoolSize">100</property>
        <property name="minPoolSize">2</property>
        <property name="maxStatements">200</property>
    </default-config>
    <!-- 命名的配置,可以通过方法调用实现 -->
    <named-config name="test">
        <property name="user">zhanghanlun</property>
        <property name="password">123456</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/zhanghanlun</property>
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <!-- 如果池中数据连接不够时一次增长多少个 -->
        <property name="acquireIncrement">5</property>
        <!-- 初始化数据库连接池时连接的数量 -->
        <property name="initialPoolSize">20</property>
        <!-- 数据库连接池中的最大的数据库连接数 -->
        <property name="maxPoolSize">25</property>
        <!-- 数据库连接池中的最小的数据库连接数 -->
        <property name="minPoolSize">5</property>
    </named-config>
</c3p0-config>

El código java corresponde a lo siguiente :

    //加载名字为“test”的配置文件
    private static ComboPooledDataSource dataSource = new ComboPooledDataSource("test");
    /**
     * 获取Connection连接
     * @return
     */
    public static Connection getConnection(){
        Connection conn = null;
        try {
            conn = dataSource.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return conn;
    }

Es el código mucho más conciso, por lo que generalmente usamos archivos de configuración para crear grupos de conexiones de bases de datos.

Introducción a los parámetros
de configuración comunes de c3p0 En la configuración anterior relacionada de c3p0, hemos visto los parámetros de configuración de c3p0. Aquí presentamos varios parámetros de configuración comunes de c3p0

La configuración de parámetros más básica :
driverClass: controlador de la base de datos (como mysql u oracle)
jdbcUrl: dirección de conexión de la base de datos jdbc (como jdbc: mysql: // localhost: 3306 / zhanghanlun)
usuario: nombre de usuario de la base de datos
contraseña: y usuario de la base de datos Contraseña de la base de datos correspondiente al nombre

Configuración básica de parámetros
Parámetro valor predeterminado explicación
initialPoolSize 3 El número de conexiones creadas cuando se inicializa el grupo de conexiones (entre maxPoolSize y minPoolSize)
maxPoolSize 15 El número máximo de conexiones en el grupo de conexiones, si se obtiene una nueva conexión, el número total de conexiones superará este valor No adquirirá nuevas conexiones, pero esperará a que se liberen otras conexiones, por lo que este valor puede diseñarse para ser grande.
minPoolSize 3 El número mínimo de conexiones mantenidas por el grupo de conexiones. Las siguientes conexiones maxIdleTimeExcessConnections se utilizan en conjunto con esto para reducir la carga en el grupo de conexiones.
adquirirIncremento 3 El número de nuevas conexiones de base de datos creadas a la vez por el grupo de conexiones cuando no hay conexiones inactivas disponibles.

Tamaño del pool de administración y tiempo de conexión
parámetro de configuración valor predeterminado explicación
maxIdleTime 0 tiempo máximo de inactividad de la conexión, si supera este tiempo no se ha utilizado una conexión de base de datos, se desconectará. Si es 0, nunca se desconectará. Conexión abierta
maxConnectorAge 0 La edad absoluta máxima de la conexión, la unidad es segundos, 0 significa que la edad absoluta es infinita
maxIdleTimeExcessConnection 0 La unidad es segunda, para reducir la carga del grupo de conexiones, cuando el grupo de conexiones pasa por el pico de acceso a datos, se crean muchas conexiones, pero el grupo de conexiones no lo necesita más adelante Para mantener tantas conexiones, debe ser menor que maxIdleTime. Si la configuración no es 0, el número de grupos de conexiones se mantendrá en minPoolSize

Configurar prueba de conexión
Parámetro valor predeterminado explicación
automaticTestTable null Si no es nulo, c3p0 generará una tabla vacía con el nombre especificado y usará esta tabla para probar la conexión
connectionTesterClassName com.mchange.v2.c3p0.impl.DefaultConnectionTester-mediante la implementación de Clase ConnectionTester o QueryConnectionTester Pruebe la conexión. El nombre de la clase debe establecer la ruta completa.
idleConnectionTestPeriod 0 Comprueba las conexiones inactivas en todos los grupos de conexiones cada pocos segundos.
favoriteTestQuery null Define la declaración de prueba que se ejecutará para todas las pruebas de conexión. En el caso de utilizar la prueba de conexión, esta mejora significativamente la velocidad de la prueba. Nota: La tabla de prueba debe existir en el momento de la fuente de datos inicial.
TestConnectionOnCheckin false Si se establece en true, la validez de la conexión se verificará cuando se obtenga la conexión.
TestConnectionOnCheckout false Si es true, el colega verificará la validez del conexión cuando se libera la conexión Sexo.
Entre estos parámetros, idleConnectionTestPeriod, testConnectionOnCheckout y testConnectuonOnCheckin controlan cuándo se comprobará la conexión. automaticTestTable, connectionTesterClassName y perferedTestQuery controlan cómo se detectará la conexión.

Configurar grupo de sentencias
Parámetro valor predeterminado explicación
maxStatements 0 Parámetro estándar JDBC, utilizado para controlar el número de PreparedStatements cargados en la fuente de datos
maxStatementsPerConnection 0 maxStatementsPerConnection define el número máximo de sentencias almacenadas en caché propiedad de una sola conexión en el grupo de conexiones
statementCacheNumDeferredCloseThreads 0 Si es mayor que cero , el grupo de sentencias retrasará la instrucción de caché close () física hasta que su conexión principal no sea utilizada por ningún cliente, o sea utilizada internamente (por ejemplo, en pruebas) por el propio grupo.

Configure la recuperación de la interrupción de la base de datos.
Parámetro valor predeterminado explicación
purchaseRetryAttempts 30 Define el número de intentos repetidos después de adquirir una nueva conexión de la base de datos.
GenerateRetryDelay 1000. El intervalo entre dos conexiones, en milisegundos.
BreakAfterAcquireFailure false. Si no se adquiere una conexión, todos esperan para que el grupo de conexiones adquiera una conexión. El subproceso genera una excepción. Sin embargo, la fuente de datos aún se conserva de manera efectiva y la próxima vez que se llame a getConnection (), seguirá intentando obtener una conexión. Si se establece en verdadero, la fuente de datos se declarará desconectada y cerrada permanentemente después de que falle el intento de obtener la conexión.

Configurar transacciones no resueltas
Parámetro valor predeterminado explicación
autoCommitOnClose false Cuando se cierra la conexión, todas las operaciones no confirmadas se revierten de forma predeterminada. Si es verdadero, lo no confirmado se establece para confirmarse en lugar de revertirse.
forceIgnoreUnresolvedTransactions false Los documentos oficiales sugieren que esto no debe establecerse en true

Configuración de otra fuente de datos
Parámetro valor predeterminado explicación
checkoutTimeout 0 Cuando se agota el grupo de conexiones, el cliente llama a getConnection () y espera el tiempo para obtener una nueva conexión. Después del tiempo de espera, se lanzará SQLException. Si se establece en 0 , esperará indefinidamente. La unidad es milisegundos.
factoryClassLocation 0 especifica la ruta de las bibliotecas c3p0. Si (generalmente este es el caso), se puede obtener localmente, por lo que no es necesario configurarlo. El valor predeterminado es nulo.
numHelperThreads 3 c3p0 es una operación asíncrona y operaciones JDBC lentas se realizan a través del proceso de ayuda. La ampliación de estas operaciones puede mejorar el rendimiento de forma eficaz. Se pueden ejecutar varias operaciones al mismo tiempo mediante subprocesos múltiples.

DBUtils
DBUtils simplifica los pasos de desarrollo de JDBC, de modo que podemos usar una menor cantidad de código para lograr la función de conectarnos a la base de datos. Dirección de descarga de DBUtils

Componente
JavaBean JavaBean es una clase que se utiliza para encapsular datos En conexión con la base de datos, la función de JavaBean es encapsular los registros de la base de datos obtenidos en JavaBean. Las características son las siguientes:

  1. Necesita implementar la interfaz: java.io.Serializable, puede omitirla.
  2. Proporcionar campo privado: nombre de campo de tipo privado;
  3. Proporcione métodos getter / setter:
  4. Proporciona una estructura sin parámetros

DBUtils utiliza
DBUtils para encapsular las operaciones de JDBC. Las funciones principales son las siguientes:

Introducción a las tres funciones principales de
Dbutils 5. QueryRunner proporciona API para operaciones de instrucciones SQL.
6. La interfaz ResultSetHandler se utiliza para definir cómo encapsular el conjunto de resultados después de la operación de selección.
7. La clase DbUtils es una clase de herramienta que define el cierre Método de procesamiento de recursos y transacciones

Clase principal de QueryRunner:
8. QueryRunner (DataSource ds); el parámetro entrante es el grupo de conexiones
9. actualizar (String sql, Object ... params), ejecutar insertar actualización eliminar operación
10. query (String sql, ResultSetHandler rsh, Object. .. params), Realice la operación de selección
11. procesamiento por lotes, procesamiento por lotes

// ArrayHandler处理类的使用,一条记录封装到数组object
	public static void queryDemo01() throws SQLException{
		// 1.创建QueryRunner对象
		QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
		// 2.执行查询
		Object[] objs = qr.query("select * from category where cid = ?", new ArrayHandler(), 1);
		for(Object o: objs){		// object[]中保存了object对象
			System.out.println(o);
		}
	}
	
	// ArrayListHandler,多条记录封装到装有object数组的list集合
	public static void queryDemo02() throws SQLException{
		// 1.创建QueryRunner对象
		QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
		// 2.执行查询
		List<Object[]> objs = qr.query("select * from category ", new ArrayListHandler());
		for (Object[] objects : objs) {
			System.out.println(objects[0]+"\t"+objects[1]);
		}
	}
	
	// BeanHandler处理类的使用,封装到JavaBean类
JavaBean
JavaBean就是一个类,在开发中常用语封装数据。具有如下特性
1.需要实现接口:java.io.Serializable ,通常实现接口这步骤省略了,不会影响程序。
2.提供私有字段:private 类型 字段名;
3.提供getter/setter方法:
4. 提供无参构造

	public static void queryDemo03() throws SQLException{
		// 1.创建QueryRunner对象
		QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
		// 2.执行查询
		String sql = "select * from category";
		Category c = qr.query(sql, new BeanHandler<Category>(Category.class));
		System.out.println(c);
	}
	
	// BeanListHandler
	public static void queryDemo04() throws SQLException{
		// 1.创建QueryRunner对象
		QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
		// 2.执行查询
		String sql = "select * from category";
		List<Category> c = qr.query(sql, new BeanListHandler<Category>(Category.class));
		for (Category category : c) {
			System.out.println(category);
		}
	}
	
	// ColumnListHandler处理类的使用
	public static void queryDemo05() throws SQLException{
		// 1.创建QueryRunner对象
		QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
		// 2.执行查询
		String sql = "select * from category";
		List<Object> c = qr.query(sql, new ColumnListHandler<Object>("cname"));
		System.out.println(c);
	}
	
	ScalarHandler: 将单个值封装、 例如select count(*),求内容的条数;
	KeyedHandler:将多条记录封装到一个Map集合的Map集合中。并且外面的Map集合是可以指定的
	
	// MapHandler处理类的使用
	public static void queryDemo06() throws SQLException{
		// 1.创建QueryRunner对象
		QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
		// 2.执行查询
		String sql = "select * from category";
		Map<String, Object> map = qr.query(sql, new MapHandler());
		// 3.
		System.out.println(map);
	}
	
	// MapListHandler处理类的使用
	public static void queryDemo07() throws SQLException{
		// 1.创建QueryRunner对象
		QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
		// 2.执行查询
		String sql = "select * from category";
		List<Map<String, Object>> maps = qr.query(sql, new MapListHandler());
		// 3.List
		System.out.println(maps);
	}
	
	// MapListHandler处理类的使用
	public static void queryDemo08() throws SQLException{
		// 1.创建QueryRunner对象
		QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
		// 2.执行查询
		String sql = "select count(*) from category";
		Long count = qr.query(sql, new ScalarHandler<Long>());
		// 3.List
		System.out.println(count);
	}
}

Supongo que te gusta

Origin blog.csdn.net/weixin_44177643/article/details/114945177
Recomendado
Clasificación