JDBC数据库连接池
数据库的连接和关闭是很耗费资源的操作,前面介绍的DriverManager方式获取的数据库连接,一个Connection对象就对应了一个物理数据库连接,每次操作都要打开一个连接,使用完关闭,需要使用时又重新连接。这将严重影响系统性能。
为了解决这个问题,JDBC2.0引入了数据库连接池。当程序启动时,系统预先创建一批数据库连接对象,形成一个连接池。当程序请求连接时,不需要重新打开物理数据库连接,而是从连接池中获取一个连接,使用完之后,也不是直接关闭物理数据库连接,而是将这个连接对象再次放入连接池。通过使用连接池,大大提高程序性能。
JDBC提供了连接池接口,即javax.sql.DataSource. 一些商用服务器(例如WebLogic, Websphere)提供了具体实现。另外也有一些开源组织提供了实现,例如DBCP和C3P0)
DBCP数据源
这是apache针对JDBC的DataSource接口的开源实现,Tomcat的连接池就是使用它来实现的。
要使用DBCP,需要在工程类库中加入,commons-dbcp.jar和commons-pool.jar两个包。
典型的用法如,
1 // 创建连接池连接对象 2 BasicDataSource ds = new BasicDataSource(); 3 // 连接池的数据库配置信息 4 ds.setDriverClassName("com.mysql.jdbc.Driver"); 5 ds.setUrl("url=jdbc:mysql://127.0.0.1:3306/dedecms?useUnicode=true&characterEncoding=utf8"); 6 ds.setUsername("root"); 7 ds.setPassword("pass"); 8 // 设置连接池的初始连接数 9 ds.setInitialSize(5); 10 // 设置连接池最多可以有多少个活动连接 11 ds.setMaxActive(20);
实际应用中,建议将连接池对象设置为static,这样在需要使用数据连接的地方,只需要通过ds获取一个连接池中的连接即可,使用完之后再放回连接池,
1 //从连接池中拿出一个连接来使用 2 Connection conn = ds.getConnection(); 3 //并非关闭物理连接,而是把连接对象放回连接池 4 conn.close();
C3P0连接池
C3P0不仅可以自动清理不再使用的Connection,还可以清理Statement和ResultSet.因此Hibernate就推荐使用它。
要使用C3P0,只需要在工程中引入c3p0-xxxx.jar包即可,典型用法跟DBCP差不多,
1 ComboPooledDataSource ds = new ComboPooledDataSource(); 2 // 连接池的数据库配置信息 3 ds.setDriverClassName("com.mysql.jdbc.Driver"); 4 ds.setUrl("url=jdbc:mysql://127.0.0.1:3306/dedecms?useUnicode=true&characterEncoding=utf8"); 5 ds.setUsername("root"); 6 ds.setPassword("pass"); 7 // 设置连接池的初始连接数 8 ds.setInitialSize(40); 9 // 设置最大连接数 10 ds.setMaxPoolSize(2); 11 // 设置最小连接数 12 ds.setMinPoolSize(2); 13 // 设置连接池缓存Statement的最大数 14 ds.setMaxStatements(180); 15 16 Connection conn = ds.getConnection();