这段时间家里有事,然后自己也颓了一段时间,但是后面还是要陆陆续续的补起来,路还长,不能太早下结论。。。
数据库连接池的作用:一次性批量制造一些连接connection对象放入连接池中,即在系统初始化时,将数据库连接作为对象存储在内存中,要使用时就从池子里面取出一个连接使用,当用完不需要时,再把连接放入池子中;达到了复用连接,避免了不断的创建关闭连接,从而达到优化
数据库连接池和JDBC:数据库连接池是分配、管理、释放数据库连接,提高对数据库操作的性能;JDBC是一种用于执行sql语句的Java API,为多种关系数据库提供统一访问;
开源的数据库连接池技术
1、DBCP数据库连接池,Apache上的一个Java项目,Tomcat使用的连接池组件;使用dbcp需要两个架包:commons--dbcp.jar、commons-pool.jar
//硬编码的方式实现连接池 public void testDbcp() throws Exception{ //dbcp连接池核心类 BasicDataSource dataSource = new BasicDataSource(); //连接池参数配置:连接字符串,驱动,用户,密码,初始化连接数,最大连接数,最大空闲时间 dataSource.setUrl("jdbc:mysql:///jdbc_demo"); dataSource.setDriverClassName("com.mysql.jdbc.Driver"); dataSource.setUsername("root"); dataSource.setPassword("1234"); dataSource.setInitialSize(3); dataSource.setMaxActive(6); dataSource.setMaxIdle(3000); //获取连接 Connection connection = dataSource.getConnection(); connection.prepareStatement("delete from admin where id=2").executeUpdate(); //关闭 connection.close(); } //配置方式实现,便于维护 public void testProp() throws Exception{ //加载配置文件 Properties properties = new Properties(); //获取文件流 InputStream inputStream = DbcpTest.class.getResourceAsStream("db.properties"); //加载属性配置文件 properties.load(inputStream); //根据配置,直接创建数据源对象 DataSource dataSource = BasicDataSourceFactory.createDataSource(properties); //获取连接 Connection connection = dataSource.getConnection(); connection.prepareStatement("delete from admin where id = 1").executeUpdate(); connection.close(); }
db.properties文件 url = jdbc:mysql:///jdbc_demo driverClassName = com.mysql.jdbc.Driver username = root password = 1234 initialSize = 3 maxActive = 6 maxIdle = 3000
2、C3P0开源的JDBC连接池,实现了数据和JNDI 的绑定,目前使用它的开源项目有hibernate、spring
2.1、JNDI:Java命名和目录接口,主要作用在于:可以把java对象放在一个容器中(JNDI容器),并为容器中的Java对象去一个名称,以后程序想要获取Java对象,只需通过名称检索即可;其核心API为context,代表JNDI容器,lookup方法为检索对象中对应名称的对象
//硬编码的方式,使用c3p0连接池管理连接 public void testC3P0() throws Exception{ //创建连接池核心工具类 ComboPooledDataSource dataSource = new ComboPooledDataSource(); //连接池参数配置:连接字符串,驱动,用户,密码,初始化连接数,最大连接数,最大空闲时间 dataSource.setJdbcUrl("jdbc:mysql:///jdbc_demo"); dataSource.setConnectionTesterClassName("com.mysql.jdbc.Driver"); dataSource.setUser("root"); dataSource.setPassword("1234"); dataSource.setInitialPoolSize(3); dataSource.setMaxPoolSize(6); dataSource.setMaxIdleTime(3000); //获取连接对象 Connection connection = dataSource.getConnection(); connection.prepareStatement("delete from admin where id = 2").executeUpdate(); connection.close(); } //配置文件方式 public void TestPro() throws Exception{ //创建c3p0连接池核心工具类 //自动加载src下c3p0的配置文件 ComboPooledDataSource dataSource = new ComboPooledDataSource(); PreparedStatement ps = null; Connection connection = dataSource.getConnection(); for (int i = 0; i < 11; i++) { String sql = "insert into admin (name,age) values(?,?)"; ps = connection.prepareStatement(sql); ps.setString(1, "july"+i); ps.setInt(2, 10); ps.executeUpdate(); } ps.close(); connection.close(); } <!-- c3p0-config.xml --> <c3p0-config> <default-config> <property name="jdbcUrl">jdbc:mysql://localhost:3306/jdbc_demo</property> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="user">root</property> <property name="password">root</property> <property name="initialPoolSize">3</property> <property name="maxPoolSize">6</property> <property name="maxIdleTime">1000</property> </default-config> <named-config name="oracle_config"> <property name="jdbcUrl">jdbc:mysql://localhost:3306/jdbc_demo</property> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="user">root</property> <property name="password">root</property> <property name="initialPoolSize">3</property> <property name="maxPoolSize">6</property> <property name="maxIdleTime">1000</property> </named-config> </c3p0-config>
3、Proxool:Java数据库连接池技术,sourceforge下的一个开源项目,关键在于这个连接池提供监控的功能
4、DBCP和C3P0的区别:前者没有自动回收空闲连接的功能,后者有自动回收空闲连接的功能