数据库连接的建立及关闭时非常消耗资源的操作,尤其多层架构的应用环境中,这种资源消耗对系统的影响更明显,频繁的打开、关闭连接将造成系统性能低下,数据库连接池的解决方案大大缓解了这个难题即当应用程序启动时,系统主动建立足够的数据库连接,并将这些连接组成一个连接池,每次应用程序请求数据库连接时,无须重新打开连接,而是从连接池中取出已有的连接使用,用完后不再关闭数据库连接,而是直接将连接还给连接池,这将大大降低系统开销
JDBC2.0规范引入了数据库连接池技术,通过几个参数管理连接池:
数据库的初始连接数连接池的最大连接数连接池的最小连接数连接池每次增加的容量JDBC的数据库连接池使用javax.sql.DataSource来表示,DataSource只是一个接口,该接口通常由商用服务器(如WebLogic、WebSphere)提供实现,也有一些开源组织提供实现(如DBCP和C3P0等)
DBCP是Apache的开源连接池实现,该连接池依赖common-pool,如果需要使用该连接池,则需要增加commons-dbcp.jar和commons-pool.jar,可以通过https://commons.apache.org/下载 Tomcat的连接池正式采用该连接池实现的,数据库连接池既可以与应用服务器整合使用,也可以由应用程序独立使用
//创建数据源对象 BasicDataSource ds=new BasicDataSource(); //设置连接池所需的驱动 ds.setDriverClassName("com.mysql.jdbc.Driver"); //设置连接数据库的URL ds.setUrl("jdbc:mysql://localhost:3306/javaee"); //设置连接数据库的用户名 ds.setUsername("root"); //设置连接数据库的密码 ds.setPassword("pass"); //设置连接池的初始连接数 ds.setInitialSize(5); //设置连接池最多可以有多少个活动连接数 ds.setMaxActive(20); //设置连接池中最少有两个空闲连接 ds.setMinIdle(20); //通过数据源获取数据库连接 Connection conn = ds.getConnection(); //释放数据源连接 conn.close();数据源和数据库连接不同,它无须创建多个,它是产生数据库连接的工厂,整个应用只需要一个数据源即可,也就是说对于一个应用,上面的代码只要执行一次即可,因此建议将ds设置成static成员变量,并且在应用开始时立即初始化数据源对象,程序中所有需要获取数据库连接地方直接访问该ds对象并获取连接即可
C3P0的性能更好,它不仅可以自动清理不再使用的Connection,还可以自动清理Statement和ResultSet,如果要使用C3P0需要增加c3p0-0.9.1.2.jar它是C3P0的具体实现,可以通过http://sourceforge.net/projects/c3p0/下载
// 创建连接池实例 ComboPooledDataSource ds = new ComboPooledDataSource(); //设置连接池连接数据库所需的驱动 ds.setDriverClass("com.mysql.jdbc.Driver"); //设置连接数据库的URL ds.setJdbcUrl("jdbc:mysql://localhost:3306/javaee"); //设置连接数据库的用户名 ds.setUser("root"); //设置连接数据库的密码 ds.setPassword("pass"); //设置练级吃的最大连接数 ds.setMaxPoolSize(40); //设置连接池的最小连接数 ds.setMinPoolSize(2); //设置连接池的初始连接数 ds.setInitialPoolSize(10); //设置连接池的缓存Statement的最大数 ds.setMaxStatements(180);