1.为什么要有数据库连接池?
首先我们来看看传统两个连接数据库的方法
方法一:直接在main方法里连接数据库 也是最简单的连接(使用的时候注意导入msql驱动包),然后执行查询 获得名字和年龄性别
conn=DriverManager.getConnection("jdbc:mysql://localhost/study1?seUnicode=true&characterEncoding=UTF-8","root","root"); System.out.println(conn.getClass()); stmt = conn.prepareStatement("select * from t_person"); resultSet = stmt.executeQuery(); while(resultSet.next()) { String name = resultSet.getString("Name"); int age=resultSet.getInt("Age"); boolean gender = resultSet.getBoolean("Gender"); System.out.println("名字:"+name+"年龄"+age+"性别"+(gender?"男":"女")); }
方法二:通过封装JDBCGB把数据库的连接放到常用类中,并通过静态类来加载 只加载一次
public class JDBCGB{ private static final String drivername; private static final String dburl; private static final String dbusername; private static final String dbpassword; static { InputStream instream=null; try{ instream = JDBCGB.class.getResourceAsStream("config.pro"); Properties prop = new Properties(); prop.load(instream); drivername=prop.getProperty("drivername"); dburl=prop.getProperty("dburl"); dbusername=prop.getProperty("dbusername"); dbpassword = prop.getProperty("dbpassword"); } catch(IOException ex) { throw new RuntimeException("config",ex); } finally { if(instream!=null) { try { instream.close(); }catch(IOException e) { } } } try { Class.forName(drivername); } catch (ClassNotFoundException e) { throw new RuntimeException("mysql jdbc",e); } }
相关配置文件放到src下面
config.pro
drivername=com.mysql.jdbc.Driverdburl=jdbc:mysql://localhost/study1?seUnicode=true&&characterEcoding=UTF8dbusername=rootdbpassword=root
当我们每次打开数据库系统的时候会进行许多工作,如安全验证,内存回收分配,连接断开等,当我们使用传统的方式操作数据库时,
频繁的连接会导致数据库的性能降低,因此数据库连接池就出现了。如c3p0
2.怎么去使用c3p0数据库?
首先要导入c3p0数据库的驱动包,有
c3p0-0.9.5.jar
mchange-commons-java-0.2.9.jarmysql-connector-java-5.1.7-bin.jar然后写好C3p0的配置文件到src目录下,这样第一步就完成了
com.mysql.jdbc.Driver jdbc:mysql://localhost:3306/dataSourceDemo?characterEncoding=UTF8 root root 15 3 3 3 600 0
package dataSourceDemo;import java.sql.Connection;import java.sql.SQLException;import javax.sql.DataSource;import com.mchange.v2.c3p0.ComboPooledDataSource;public class Test {public void main(String args[]){ //datasource这个接口的实现类 combopool DataSource dataSource= new ComboPooledDataSource(); //这样就创建了数据库的对象,它会自动的加载数据库的配置文件 try { Connection conn=dataSource.getConnection(); //做你需要做的事情 /* * */ //归还连接给连接池 conn.close(); } catch (SQLException e) { e.printStackTrace(); }//获得数据库的连接 }
数据库连接池的原理,特点
- 程序启动时 连接池就会创建若干连接并且保存到连接池内
- 当用户需要的时候,就直接从连接池给出
- 当用户使用完毕后,就把链接还给连接池
- 如果超过连接池的最大连接,就会等待用户归还,否则创建。
可以在配置文件xml中配置连接池的连接数,等待时间等。
下面是常用的配置参数
maxPoolSize连接池的最大连接数目
minPoolSize最小连接数目 initialPoolSize初始化连接数目 maxIdleTime最大等待时间 超过就销毁连接池