实际开发中,连接数据库是十分消耗资源的操作,但是,我们又需要频繁地连接数据库
这时候,为了提高效率,这里就会采用连接池技术:
连接池地通俗理解:
一个池里面放入很多的连接,需要哪一个取出来用即可,用完放回去,而不是关闭连接
这里使用到四个jar包
commons-dbcp-1.4.jar
commons-pool-1.5.6.jar
mysql-connector-java-5.1.37-bin.jar
commons-dbutils-1.6.jar
DataSource接口:连接池的规范接口
BasicDataSource类:导入的jar包中的实现类
连接池连接数据库的方法与配置:
package demo; import java.sql.Connection;
import java.sql.SQLException; import org.apache.commons.dbcp.BasicDataSource; public class DataSourceDemo {
public static void main(String[] args) {
BasicDataSource dataSource = new BasicDataSource();
// 常规基本配置
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/mybase");
dataSource.setUsername("root");
dataSource.setPassword("xuyiqing");
// 连接池配置
dataSource.setMaxActive(10);// 最大连接数
dataSource.setMaxIdle(5);// 最大空闲连接
dataSource.setMinIdle(2);// 最小空闲连接
dataSource.setInitialSize(5);// 初始化连接
try {
Connection con = dataSource.getConnection();
} catch (SQLException ex) {
ex.printStackTrace();
throw new RuntimeException("数据库连接失败");
}
}
}
接下来创建一个连接池的工具类,用于方便开发:
数据准备:创建表:
CREATE TABLE sort(
sid INT PRIMARY KEY AUTO_INCREMENT,
sname VARCHAR(100),
sprice DOUBLE,
sdesc VARCHAR(5000)
);
工具类:
package demo; import javax.sql.DataSource; import org.apache.commons.dbcp.BasicDataSource; public class JDBCUtils {
private static BasicDataSource dataSource = new BasicDataSource(); static {
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/mybase");
dataSource.setUsername("root");
dataSource.setPassword("xuyiqing");
dataSource.setInitialSize(10);
dataSource.setMaxActive(8);
dataSource.setMaxIdle(5);
dataSource.setMinIdle(1);
} public static DataSource getDataSource() {
return dataSource;
}
}
测试:
package demo; import java.sql.SQLException;
import java.util.List; import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.ArrayListHandler; public class QueryRunnerDemo {
private static QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource()); public static void main(String[] args) {
insert();
} public static void insert() {
String sql = "INSERT INTO sort (sname,sprice,sdesc)VALUES(?,?,?)";
Object[] params = { "水果", 20, "促销" };
try {
qr.update(sql, params);
} catch (SQLException ex) {
throw new RuntimeException("数据添加失败");
}
} public static void select() {
String sql = "SELECT * FROM sort";
try {
List<Object[]> list = qr.query(sql, new ArrayListHandler());
for (Object[] objs : list) {
for (Object obj : objs) {
System.out.println(obj + "\t");
}
}
} catch (SQLException ex) {
throw new RuntimeException("数据添加失败");
}
}
}