Pool de conexão de banco de dados (classe de ferramenta c3p0 + druid + druid)
Nota: Este experimento é para configurar o arquivo pom.xml para importar o pacote jar no projeto maven
Pool de conexão de banco de dados: na verdade, um contêiner (coleção), um contêiner para armazenar conexões de banco de dados
Depois que o sistema é inicializado, o contêiner é criado e alguns objetos de conexão são aplicados no contêiner. Quando um usuário acessa o banco de dados, o objeto de conexão é obtido do contêiner. Depois que o usuário acessa o banco de dados, o objeto de conexão é retornado para o contêiner.
- economizar recursos
- O acesso do usuário é mais eficiente
- javax.sql.DataSource
- A interface não possui uma classe de implementação específica, mas o fornecedor do driver implementa a interface durante o uso
DataSource 接口由驱动程序供应商实现。共有三种类型的实现 1. 基本实现 - 生成标准的 Connection 对象 2. 连接池实现 - 生成自动参与连接池的 Connection 对象。此实现与中间层连接池管理器一起使用。 3. 分布式事务实现 - 生成一个 Connection 对象,该对象可用于分布式事务,大多数情况下总是参与连接池。此实现与中间层事务管理器一起使用,大多数情况下总是与连接池管理器一起使用。 4. 接口的方法(获取连接) Connection getConnection() 尝试建立与此 DataSource 对象所表示的数据源的连接。 Connection getConnection(String username, String password) 尝试建立与此 DataSource 对象所表示的数据源的连接。 5. 归还链接:如果连接对象connection是从连接池中获取的,那么调用Connection.close()方法,则不会关闭连接了,而是归还连接给连接池。
- Tecnologia de pool de conexão de banco de dados C3P0
Etapas para uso:
- Importar dependências c3p0
<dependencies> <dependency> <groupId>com.mchange</groupId> <artifactId>mchange-commons-java</artifactId><!-- c3p0所依赖的jar包 --> <version>0.2.12</version> </dependency> <dependency> <groupId>com.mchange</groupId> <artifactId>c3p0</artifactId> <!-- 必要依赖 --> <version>0.9.5.2</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <!-- 必要依赖 --> <version>5.1.6</version> <scope>runtime</scope> <!-- 只在运行时生效 --> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> </dependencies>
- Crie o arquivo de configuração c3p0-config.xml
Nota: c3p0-config.xml deve ser colocado no diretório de recursos para cumprir os requisitos do diretório do projeto maven
<c3p0-config> <!-- 使用默认的配置读取连接池对象 --> <default-config> <!-- 连接参数 --> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql://localhost:3306/xskc</property> <property name="user">root</property> <property name="password">root</property> <!-- 连接池参数 --> <property name="initialPoolSize">5</property><!-- 初始池中连接数量 --> <property name="maxPoolSize">10</property><!-- 最大连接数量,超过此数量会报错 --> <property name="checkoutTimeout">3000</property><!-- 超时时间 --> </default-config> <named-config name="anotherc3p0"><!-- 指定名称的配置,可以在DataSource中指定名称调用此配置,而不再使用默认配置 --> <!-- 连接参数 --> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql://localhost:3306/xskc</property> <property name="user">root</property> <property name="password">root</property> <!-- 连接池参数 --> <property name="initialPoolSize">5</property> <property name="maxPoolSize">8</property> <property name="checkoutTimeout">1000</property> </named-config> </c3p0-config>
- Use o pool de conexão C3P0
package zhi.itlearn; import com.mchange.v2.c3p0.ComboPooledDataSource; import javax.sql.DataSource; import java.sql.Connection; import java.sql.SQLException; public class C3P0Utils { public static void main(String[] args) throws SQLException { //创建数据库连接池对象 DataSource ds = new ComboPooledDataSource(); //使用anotherc3p0连接池配置 //DataSource ds2 = new ComboPooledDataSource("anotherc3p0"); //获取连接对象 Connection connection = ds.getConnection(); //打印connection,测试是否有拿到连接对象 System.out.println(connection); } }
- Tecnologia de pool de conexão de banco de dados Durid
Durid: tecnologia de implementação de pool de conexão de banco de dados, fornecida pela Alibaba
- Etapas para uso
- Importar dependência de pacote jar
<dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.2.4</version> </dependency>
- Defina o arquivo de configuração (usando o arquivo de configuração de propriedades)
Nota: O arquivo de configuração de propriedades pode ter qualquer nome, mas precisa ser colocado na pasta de recursos.
Nomeado aqui: druid-config.properties
driverClassName=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/xskc username=root password=root initialSize=5 maxActive=10 maxWait=3000
- Obtenha o objeto de pool de conexão de banco de dados, obtenha a conexão Connection: por meio da classe DruidDataSourceFactory
package zhi.itlearn; import com.alibaba.druid.pool.DruidDataSourceFactory; import javax.sql.DataSource; import java.io.IOException; import java.io.InputStream; import java.sql.Connection; import java.util.Properties; public class DuridDemo { public static void main(String[] args) throws Exception { //加载配置文件 Properties pro = new Properties(); //通过类加载器获取资源文件,并返回字节流 InputStream asStream = DuridDemo.class.getClassLoader().getResourceAsStream("duril-config.properties"); //加载字节流 pro.load(asStream); //获取连接池对象:通过DruidDataSourceFactory类 DataSource source = DruidDataSourceFactory.createDataSource(pro); //获取连接 Connection connection = source.getConnection(); System.out.println(connection); } }
- Defina a classe da ferramenta Durid: JDBCUtils.class
package zhi.itlearn; import com.alibaba.druid.pool.DruidDataSourceFactory; import javax.sql.DataSource; import java.io.IOException; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Properties; public class JDBCUtils { private static DataSource ds; static { try { //加载配置文件 Properties pro = new Properties(); pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("duril-config.properties")); //获得DataSource连接池对象 ds = DruidDataSourceFactory.createDataSource(pro); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } public static DataSource getDateSource(){ return ds; } public static Connection getConnection() throws SQLException { return ds.getConnection(); } public static void close(Statement stat,Connection conn){ close(null,stat,conn); } public static void close(ResultSet rs, Statement stat, Connection conn){ if (rs!=null){ try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if (stat!=null){ try { stat.close(); } catch (SQLException e) { e.printStackTrace(); } } if (conn!=null){ try { conn.close(); //归还连接 } catch (SQLException e) { e.printStackTrace(); } } } }
- Teste a classe da ferramenta JDBCUtils
package zhi.itlearn; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class JDBCUtilsTest { public static void main(String[] args) throws SQLException { Connection connection = JDBCUtils.getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT * FROM student WHERE sage = 19"); ResultSet set = statement.executeQuery(); while(set.next()){ System.out.println(set.getString("sname")); } JDBCUtils.close(set,statement,connection); } }