数据库连接池
数据库连接池
连接池技术的核心思想是:连接复用,通过建立一个数据库连接池以及一套连接使用、分配、管理策略,使得该连接池中的连接可以得到高效、
安全的复用,避免了数据库连接频繁建立、关闭的开销。
java提供的连接池接口:javax.sql.DataSource,连接池厂商的连接池类需要实现这一接口。
1、实现DataSource(javax.sql)接口,并实现连接池功能的步骤:
2、在DataSource构造函数中批量创建与数据库的连接(Connection),并把创建的连接保存到一个集合对象中()
创建好连接之后,把连接放到一个集合中。LinkedList.
3、实现getConnection方法,让getConnection方法每次调用时,从集合对象中取一个Connection返回给用户。
4、当用户使用完Connection,调用Connection.close()方法时,Collection对象应保证将自己返回到连接池的集合对象中,而不要把conn还给数据库。
池参数(所有池参数都有默认值):
初始大小:10个
最小空闲连接数:3个
增量:一次创建的最小单位(5个)
最大空闲连接数:12个
最大连接数:20个
最大的等待时间:1000毫秒
四大连接参数
连接池也是使用四大连接参数来完成创建连接对象!
实现的接口
连接池必须实现:javax.sql.DataSource接口!
连接池返回的Connection对象,它的close()方法与众不同!调用它的close()不是关闭,而是把连接归还给池!
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
DBCP
1、整理:
连接池:存储连接的结合。
需要实现javax.sql.datasource.----sun公司要求的。
2、开源连接池。DBCP 她实现了javax.sql.datasource.
1、getConnection(); 从集合中获取连接。
dbcp 提供的实现类。BasicDataSrouce
需要告诉dbcp的连接数据库参数信息。
ds.seturl
ds.setusername
ds.setpassword
ds.setdriverClassName
public class JDBC_DBCP { public static void main(String[] args) { BasicDataSource ds=new BasicDataSource(); ds.setDriverClassName("com.mysql.jdbc.Driver");//设置驱动 ds.setUrl("jdbc:mysql://localhost:3306/stu"); ds.setUsername("root");//设置用户密 ds.setPassword("123");//设置密码 /* * JDBC六步 * */ Connection conn=null; PreparedStatement ps=null; try { conn=ds.getConnection(); String sql="INSERT INTO student (sname,gender) VALUES(?,?)"; ps=conn.prepareStatement(sql); ps.setString(1, "赵1"); ps.setInt(2, 22); ps.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); } //关闭资源 try { ps.close(); conn.close(); ds.close(); } catch (SQLException e) { e.printStackTrace(); } } }
3、可以通过配置文件的方式,配置数据库的连接参数。
dbcp要求的连接参数要放入到properties中。
url=jdbc:mysql://localhost:3306/day08
username=root
password=123456
driverClassName=com.mysql.jdbc.Driver
把properties这个文件,转换为Properties对象给
Properties prop = new Propterties(); prop.load(InputStream is); BasicDataSrouceFatory.createDataBAse(Propterties prop);
代码:
public class JDBC_DBCP { public static void main(String[] args){ /* * JDBC六步 * */ Connection conn=null; PreparedStatement ps=null; DataSource ds=null; try { Properties p=new Properties(); InputStream in=new FileInputStream("src/dbconfig.properties"); p.load(in); ds=BasicDataSourceFactory.createDataSource(p); conn=ds.getConnection(); String sql="INSERT INTO student (sname,gender) VALUES(?,?)"; ps=conn.prepareStatement(sql); ps.setString(1, "赵2"); ps.setInt(2, 22); ps.executeUpdate(); } catch (Exception e) { e.printStackTrace(); } //关闭资源 try { ps.close(); conn.close(); } catch (SQLException e) { e.printStackTrace(); } } }
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
C3P0
手动配置
jar:c3p0-0.9.2-pre1.jar、c3p0-oracle-thin-extras-0.9.2-pre1.jar、mchange-commons-0.2.jar ComboPooledDataSource ds = new ComboPooledDataSource(); ds.setJdbcUrl("jdbc:mysql://localhost:3306/mydb1"); ds.setUser("root"); ds.setPassword("123"); ds.setDriverClass("com.mysql.jdbc.Driver"); ds.setAcquireIncrement(5) ;/*每次增加五*/ ds.setInitialPoolSize(20) ;//初始化连接数 ds.setMinPoolSize(2) ;//最少连接 ds.setMaxPoolSize(50) ;//最多连接 Connection con = ds.getConnection();
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
C3P0配置文件
1. 通过默认配置初始化连接池
配置文件要求:
文件名称:必须叫c3p0-config.xml
文件位置:必须在src下
<default-config> <property name="xxx">XXX</property> </defualt-config>
2. 通过命名配置初始化连接池
<named-config name="orcale-config"> <property name="xxx">XXX</property> </named-config>
/** * 配置文件的默认配置 * @throws SQLException */ @Test public void fun2() throws SQLException{ /** * 在创建连接池对象时,这个对象就会自动加载配置文件!不用我们来指定 */ ComboPooledDataSource dataSource = new ComboPooledDataSource(); Connection con = dataSource.getConnection(); System.out.println(con); con.close(); } /** * 使用命名配置信息 * @throws SQLException */ @Test public void fun3() throws SQLException{ /** * 构造器的参数指定命名配置元素的名称! * <named-config name="oracle-config"> */ ComboPooledDataSource dataSource = new ComboPooledDataSource("oracle-config"); Connection con = dataSource.getConnection(); System.out.println(con); con.close(); } }
修改JdbcUtils
public class JdbcUtils { private static DataSource dataSource = new ComboPooledDataSource(); public static DataSource getDataSource() { return dataSource; } public static Connection getConnection() { try { return dataSource.getConnection(); } catch (Exception e) { throw new RuntimeException(e); } } }