数据连接池
-
概念:是一个容器(集合),存放数库连接对象的容器。
- 当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完后,会将连接对象归还给容器
-
优点:
- 节约资源
- 用户访问高效
-
实现
- 标准接口
// 标准接口,javax.sql 包下 public interface DataSource extends CommonDataSource, Wrapper 一个连接到这个DataSource对象所代表的物理数据源的工厂。 DataSource接口由驱动程序供应商实现。 有三种类型的实现: * 基本实现 - 生成标准的Connection对象 * 连接池实现 - 生成将自动参与连接池的Connection对象。 此实现与中间层连接池管理器配合使用。 * 分布式事务实现 - 生成可用于分布式事务的Connection对象,并且几乎总是参与连接池。 此实现与中间层事务管理器一起工作,并且几乎总是使用连接池管理器。 方法: * Connection getConnection() 尝试建立与此 DataSource对象所代表的数据源的连接。 * 如果连接对象Connection是从连接池中获取的,那么调用Connection.close()方法,不再关闭连接,而是还连接
- 数据库连接池技术
- C3P0:
- Druid:由阿里巴巴提供的
-
C3P0
- 步骤:
- 导入jar包
c3p0-0.9.5.2.jar
和mchange-commons-java-0.2.12.jar
,不要忘记导入数据库的驱动jar
包 - 定义配置文件
2.1 名称:c3p0.properties
或者c3p0-config.xml
2.2 路径:直接将文件放在src
目录下即可
<?xml version="1.0" encoding="utf-8"?> <c3p0-config> <default-config> <!--连接参数--> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql://localhost:3306/db2</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="otherc3p0"> <!--连接参数--> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql://localhost:3306/db2</property> <property name="user">root</property> <property name="password">root</property> <!--连接池参数--> <!--初始化申请的连接数--> <property name="initialPoolSize">5</property> <!--最大的连接数量--> <property name="maxPoolSize">8</property> <!--超时时间--> <property name="checkoutTimeout">3000</property> </named-config> </c3p0-config>
- 创建核心对象:数据库连接池对象
ComboDooledDataSource
- 获取连接:
getConnection
// c3p0实现演示 // 1.创建数据连接池对象 ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource(); // 2.获取连接对象 Connection connection = comboPooledDataSource.getConnection(); // 3.打印 System.out.println(connection);
// c3p0 配置文件演示 // 1.获取DataSource,使用指定名称的配置 ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource("otherc3p0"); // 2.获取连接 for (int i = 0; i < 8; i++) { try { Connection connection = comboPooledDataSource.getConnection(); System.out.println(i+":="+connection); if(i==4){ connection.close(); } } catch (SQLException e) { e.printStackTrace(); } }
-
druid
- 步骤
- 导入jar包
druid-1.0.9.jar
- 定义配置文件
2.1 是properties
形式
2.2 可以叫任意名称,可以放在任意目录
# driverClassName=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/db2 username=root password=root # 初始化的连接数量 initialSize=5 # 最大连接数 maxActive=10 # 最大等待时间 maxWait=3000
- 加载配置文件
- 获取数据库连接池对象:通过工厂类来获取
DruidDataSourceFactory
- 获取连接:
getConnection
// druid演示 // 1.导入druid的jar包与数据库的驱动jar包 // 2.定义配置文件 // 3.加载配置文件 Properties properties = new Properties(); ClassLoader classLoader = DruidDemo1.class.getClassLoader(); InputStream resourceAsStream = classLoader.getResourceAsStream("druid.properties"); properties.load(resourceAsStream); // 4.获取连接池对象 DataSource dataSource = DruidDataSourceFactory.createDataSource(properties); // 5.获取连接 Connection connection = dataSource.getConnection(); System.out.println(connection);
- 定义工具类
- 定义一个类JDBCUtils
- 提供静态代码块加载配置文件,初始化连接池
- 提供方法
- 获取连接方法:通过数据库连接池
- 释放资源
- 获取连接池的方法
// 定义JDBCUtils工具类 public class JDBCUtils { // 1.定义成员变量 DataSource private static DataSource ds; static { try { // 1.加载配置文件 Properties properties = new Properties(); properties.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties")); // 2.获取DataSource ds = DruidDataSourceFactory.createDataSource(properties); } catch (Exception e) { e.printStackTrace(); } } // 获取连接的方法 public static Connection getConnection() throws SQLException { return ds.getConnection(); } // 释放资源的方法 public static void close(Statement stmt,Connection con){ if(stmt!=null){ try { stmt.close(); } catch (SQLException e) { e.printStackTrace(); } } if(con!=null){ try { con.close(); // 归还连接 } catch (SQLException e) { e.printStackTrace(); } } } public static void close(ResultSet rs,Statement stmt, Connection con){ if(rs!=null){ try { rs.close(); // 归还连接 } catch (SQLException e) { e.printStackTrace(); } } close(stmt,con); } // 获取连接池的方法 public static DataSource getDataSource(){ return ds; } }
// 使用新的工具类 // 给account表添加一条记录 Connection connection=null; PreparedStatement preparedStatement=null; try { // 1.获取连接 connection= JDBCUtils.getConnection(); // 2.定义sql String sql="insert into account values(null,?,?)"; // 3.获取PreparedStatement对象 preparedStatement = connection.prepareStatement(sql); // 4.给?赋值 preparedStatement.setString(1,"zhaoliu"); preparedStatement.setDouble(2,5000); // 5.执行sql preparedStatement.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); }finally { JDBCUtils.close(preparedStatement,connection); }