文章目录
数据库连接池
为什么要有连接池?
由于建立数据库连接是一种非常耗时、耗资源的行为,所以通过连接池预先同数据库建立一些连接,放在内存中,应用程序需要建立数据库连接时直接到连接池中申请一个就行,使用完毕后再归还到连接池中,能明显提高对数据库操作的性能。
一、DBCP连接池
DBCP(DataBase Connection Pool)数据库连接池,是Java数据库连接池的一种,由Apache开发,通过数据库连接池,可以让程序自动管理数据库连接的释放和断开。
使用步骤:
1、导入 jar包(commons-dbcp-1.4.jar和commons-pool-1.5.6.jar)
2、配置信息
采用硬编码方式
//创建连接池
BasicDataSource ds = new BasicDataSource();
//配置信息
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql:///mydb");
ds.setUsername("root");
ds.setPassword("123456");
//ds.setMaxWait(5000); //设置最大等待连接时间
//其他参数也可自行调用方法设置,不设置即为默认值
采用配置文件方式
Java代码
Properties properties = new Properties();
properties.load(new FileReader("src/dbcp.properties"));
//创建一个工厂,获取连接池
DataSource ds = new BasicDataSourceFactory().createDataSource(properties);
配置文件
#连接基本设置
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mydb
username=root
password=123456
#<!--扩展配置 了解-->
#初始化连接
initialSize=10
#最大连接数量
maxActive=50
#<!-- 最大空闲连接 -->
maxIdle=20
#<!-- 最小空闲连接 -->
minIdle=5
#<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 -->
maxWait=60000
#JDBC驱动建立连接时附带的连接属性属性的格式必须为这样:[属性名=property;]
#注意:"user" 与 "password" 两个属性会被明确地传递,因此这里不需要包含他们。
connectionProperties=useUnicode=true;characterEncoding=gbk
#指定由连接池所创建的连接的自动提交(auto-commit)状态。
defaultAutoCommit=true
#driver default 指定由连接池所创建的连接的只读(read-only)状态。
#如果没有设置该值,则“setReadOnly”方法将不被调用。(某些驱动并不支持只读模式,如:Informix)
defaultReadOnly=
#driver default 指定由连接池所创建的连接的事务级别(TransactionIsolation)。
#可用值为下列之一:(详情可见javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE
defaultTransactionIsolation=READ_UNCOMMITTED
3、获取连接对象
Connection conn = ds.getConnection();
二、C3P0连接池
C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate、Spring等。
使用步骤:
1、导入jar包(c3p0-0.9.1.2.jar)
2、配置信息
采用硬编码方式
ComboPooledDataSource ds = new ComboPooledDataSource();
//设置基本参数
ds.setDriverClass("com.mysql.jdbc.Driver");
ds.setJdbcUrl("jdbc:mysql:///mydb");
ds.setUser("root");
ds.setPassword("123456");
采用配置文件方式
采用此方式需注意:
要求1:配置文件的名称:c3p0.properties 或者 c3p0-config.xml
要求2:配置文件的路径:必须在 src 下
//new ComboPooledDataSource() //使用默认的配置
//使用命名的配置 若配置的名字找不到,使用默认的配置
//new ComboPooledDataSource(String configName)
//c3p0-config.xml的第二种配置
ComboPooledDataSource ds = new ComboPooledDataSource("MyConfig");
c3p0.properties
c3p0.driverClass=com.mysql.jdbc.Driver
c3p0.jdbcUrl=jdbc:mysql:///mydb
c3p0.user=root
c3p0.password=123456
c3p0-config.xml
<c3p0-config>
<!-- 默认配置,如果没有指定则使用这个配置 -->
<default-config>
<!-- 基本配置 -->
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/mydb</property>
<property name="user">root</property>
<property name="password">123456</property>
<!--扩展配置-->
<property name="checkoutTimeout">30000</property>
<property name="idleConnectionTestPeriod">30</property>
<property name="initialPoolSize">10</property>
<property name="maxIdleTime">30</property>
<property name="maxPoolSize">100</property>
<property name="minPoolSize">10</property>
<property name="maxStatements">200</property>
</default-config>
<!-- 命名的配置 第二配置 -->
<named-config name="MyConfig">
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/mydb</property>
<property name="user">root</property>
<property name="password">123456</property>
<!--扩展配置-->
<property name="acquireIncrement">5</property>
<property name="initialPoolSize">20</property>
<property name="minPoolSize">10</property>
<property name="maxPoolSize">40</property>
<property name="maxStatements">20</property>
<property name="maxStatementsPerConnection">5</property>
</named-config>
</c3p0-config>
3、获取连接对象
Connection conn = ds.getConnection();
三、Druid 阿里德鲁伊连接池
DRUID是阿里巴巴开源平台上一个数据库连接池实现,它结合了C3P0、DBCP、PROXOOL等DB池的优点,同时加入了日志监控,可以很好的监控DB池连接和SQL的执行情况,可以说是针对监控而生的DB连接池。
使用步骤:
1、导入jar包(druid-1.1.9.jar)
2、配置信息
采用硬编码方式
//创建数据源
DruidDataSource ds = new DruidDataSource();
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql:///mydb");
ds.setUsername("root");
ds.setPassword("123456");
采用配置文件方式
Properties properties = new Properties();
properties.load(new FileReader("src/druid.properties"));
//通过一个工厂类,创建一个数据源
DataSource ds =new DruidDataSourceFactory().createDataSource(properties);
配置文件
#基本配置
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost/mydb
username=root
password=123456
#可选配置
filters=stat
initialSize=2
maxActive=300
maxWait=60000
timeBetweenEvictionRunsMillis=60000
minEvictableIdleTimeMillis=300000
validationQuery=SELECT 1
testWhileIdle=true
testOnBorrow=false
testOnReturn=false
poolPreparedStatements=false
maxPoolPreparedStatementPerConnectionSize=200
3、获取连接对象
Connection conn = ds.getConnection();
DBUtils 工具类库
Commons DbUtils 是Apache组织提供的一个对JDBC进行简单封装的开源工具类库,
使用它能够简化JDBC应用程序的开发,同时也不会影响程序的性能。
//导入jar包(commons-dbutils-1.4.jar)
//创建 QueryRunner 对象
Properties properties = new Properties();
properties.load(new FileReader("src/druid.properties"));
DataSource dataSource = new DruidDataSourceFactory().createDataSource(properties);
//注意传入数据源
QueryRunner queryRunner = new QueryRunner(dataSource);
//编写执行SQL语句
//编写执行DML、DQL语句 返回值:影响的行数 参2、参3为问号的值
int i = queryRunner.update("insert into users values(?,?)", "张三", "123456");
//查询语句
//BeanListHandler 把从数据库查出来的多条数据,封装到对象里面,再把对象放到集合里面
List<User> list = queryRunner.query("select * from users", new BeanListHandler<User>(User.class));
//BeanHandler 查询一条结果,把这个结果封装进对象里面
User user = queryRunner.query("select * from users", new BeanHandler<User>(User.class));
// MapHandler 把查询的结果封装到Map集合里面
Map<String, Object> map = queryRunner.query("select * from users", new MapHandler());