数据库连接池
Posted 晓梦蝶
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库连接池相关的知识,希望对你有一定的参考价值。
数据库连接池
作用:使用池来管理连接的生命周期,节省资源,提高性能。
java提供的连接池接口:javax.sql.DataSource,连接池厂商的连接池类需要实现这一接口。
池参数(所有池参数都有默认值):
初始大小:10个
最小空闲连接数:3个
增量:一次创建的最小单位(5个)
最大空闲连接数:12个
最大连接数:20个
最大的等待时间:1000毫秒
四大连接参数
连接池也是使用四大连接参数来完成创建连接对象!
实现的接口
连接池必须实现:javax.sql.DataSource接口!
连接池返回的Connection对象,它的close()方法与众不同!调用它的close()不是关闭,而是把连接归还给池!
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
DBCP
jar:commons-pool.jar、commons-dbcp.jar
BasicDataSource ds = new BasicDataSource();
ds.setUsername("root");
ds.setPassword("123");
ds.setUrl("jdbc:mysql://localhost:3306/mydb1");
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setMaxActive(20); //最大连接数
ds.setMaxIdle(10); //最大空闲
ds.setInitialSize(10) ;//初始化
ds.setMinIdle(2) ;//最小空闲
ds.setMaxWait(1000) ;//最大等待时间
Connection con = ds.getConnection();
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
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(); } }
==============================================================================================
Tomcat配置连接池
在server.xml中,或在conf/catalina/localhost/下创建xml文件
<Context> <Resource name="myc3p0" type="com.mchange.v2.c3p0.ComboPooledDataSource" factory="org.apache.naming.factory.BeanFactory" user="root" password="123" classDriver="com.mysql.jdbc.Driver" jdbcUrl="jdbc:mysql://127.0.0.1/mydb1" maxPoolSize="20" minPoolSize ="5" initialPoolSize="10" acquireIncrement="2"/> </Context>
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
获取Tomcat资源
Context cxt = new InitialContext(); DataSource ds = (DataSource)cxt.lookup("java:/comp/env/myc3p0"); Connection con = ds.getConnection();
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
修改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); } } }
==============================================================================================
DBUtils
jar:commons-dbutils.jar
核心类:QueryRunner、ResultSetHandler
QueryRunner方法:
* update():DDL、DML
* query():DQL
* batch():批处理
-------------
增、删、改
public void fun1() throws SQLException { QueryRunner qr = new QueryRunner(); String sql = "insert into user values(?,?,?)"; qr.update(JdbcUtils.getConnection(), sql, "u1", "zhangSan", "123"); }
-------------
查
DataSource ds = JdbcUtils.getDataSource(); QueryRunner qr = new QueryRunner(ds); String sql = "select * from tab_student"; // 把结果集转换成Bean Student stu = qr.query(sql, new BeanHandler<Student>(Student.class)); // 把结果集转换成Bean的List List<Student> list = qr.query(sql, new BeanListHandler<Student>(Student.class)); // 把结果集转换成Map Map<String,Object> map = qr.query(sql, new MapHandler()); // 把结果集转换成List<Map> List<Map<String,Object>> list = qr.query(sql, new MapListHandler() ); // 把结果集转换成一列的List List<Object> list = qr.query(sql, new ColumnListHandler("name")) ; // 把结果转换成单行单列的值 Number number = (Number)qr.query(sql, new ScalarHandler());
批处理
DataSource ds = JdbcUtils.getDataSource(); QueryRunner qr = new QueryRunner(ds); String sql = "insert into tab_student values(?,?,?,?)"; Object[][] params = new Object[10][]; //表示 要插入10行记录 for(int i = 0; i < params.length; i++) { params[i] = new Object[]{"S_300" + i, "name" + i, 30 + i, i%2==0?"男":"女"}; } qr.batch (sql, params);
以上是关于数据库连接池的主要内容,如果未能解决你的问题,请参考以下文章