赞
踩
为什么要使用数据库连接池?主要有以下原因:
C3P0 是一个开源组织提供的一个数据库连接池,速度相对较慢,稳定性还可以。hibernate官方推荐使用。想要使用该数据库连接池,首要的就是要先导入依赖的jar包,我导入的是0.9.1.2版本的。其次,我们需要创建一个配置文件,命名为c3p0-config.xm。有配置如下:
- <?xml version="1.0" encoding="UTF-8"?>
-
- <c3p0-config>
-
- <named-config name="自定义名字">
- <!-- 提供获取连接的四个基本信息 -->
- <property name="driverClass">com.mysql.cj.jdbc.Driver</property>
- <property name="jdbcUrl">jdbc:mysql://localhost:3306/test</property>
- <property name="user">用户名</property>
- <property name="password">数据库连接密码</property>
-
- <!-- 进行数据库连接池管理的基本信息 -->
- <!-- 当数据库连接池中连接不够时,一次性向服务器申请的连接数 -->
- <property name="acquireIncrement">5</property>
- <!-- 初始化时的连接数量 -->
- <property name="initialPoolSize">10</property>
- <!-- 数据库连接池维护的最小连接数 -->
- <property name="minPoolSize">10</property>
- <!-- 数据库连接池中维护的最多连接数 -->
- <property name="maxPoolSize">100</property>
- <!-- 数据库连接池中维护的最多的Statement的个数 -->
- <property name="maxStatements">50</property>
- <!-- 每个连接中最多可以使用的Statement的个数 -->
- <property name="maxStatementsPerConnection">2</property>
-
-
- </named-config>
- </c3p0-config>
以上展示的仅仅是部分设置,如果想要更多设置请移步相关教程网站查询使用。有了配置文件后,我们就可以着手使用了,以下是一个简单的调用:
- @Test
- public void testGetConnection2() throws Exception {
- ComboPooledDataSource cpds = new ComboPooledDataSource("自定义的名字");
- Connection conn = cpds.getConnection();
- System.out.println(conn);
- }
运行成功便说明已经成功使用了。
Druid(德鲁伊)是阿里巴巴开源平台上一个数据库连接池实现,它结合了C3P0、DBCP、Proxool等DB池的优点,同时加入了 日志监控,可以很好的监控DB池连接和SQL的执行情况,可以说是针对监控而生的DB连接池,可以说是目前最好的连接池之一。
这次我导入的jar包是1.1.10版本的,德鲁伊的配置文件方式和jdbc相似,需要创建一个druid.properties文件,添加如下数据:
- url=jdbc:mysql://localhost:3306/test
- username=数据库用户名
- password=数据库密码
- driverClassName=com.mysql.cj.jdbc.Driver
-
- initialSize=10
- maxActive=10
就可以着手使用了:
- @Test
- public void druidtest() throws Exception {
- Properties pros = new Properties();
- InputStream is = ClassLoader.getSystemClassLoader().getSystemResourceAsStream("druid.properties");
- pros.load(is);
- DataSource source=DruidDataSourceFactory.createDataSource(pros);
- Connection conn=source.getConnection();
- System.out.println(conn);
- }
成功运行便能正常使用了。由于druid在开发中一般使用的次数较多,我在后附上相关的配置参数.
该类简单化了SQL查询,它与ResultSetHandler组合在一起使用可以完成大部分的数据库操作,能够大大减少编码量。
它的使用方法和之前文章中结构上是非常相似的,以下是插入的代码:
- @Test
- public void testInsert(){
- Connection conn=null;
- try {
- QueryRunner runner=new QueryRunner();
- conn = jdbcutils.getConnection2();
- String sql="insert into customers(name,email,birth) values(?,?,?)";
- runner.update(conn,sql,"坤坤","kk@126.com","1997-05-05");
-
- } catch (SQLException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }finally {
- jdbcutils.closeResource(conn, null);
- }
- }
我还有查询的代码:
- //BeanHandler:是ResultSetHandler接口的实现类,用于封装表中的一条记录
- @Test
- public void testSelect(){
- Connection conn=null;
- try {
- QueryRunner runner=new QueryRunner();
- conn = jdbcutils.getConnection2();
- String sql="select id,name,email,birth from customers where id =?";
- BeanHandler<Customer> handler=new BeanHandler<>(Customer.class);
- Customer cust = runner.query(conn, sql, handler, 20);
- System.out.println(cust);
- } catch (SQLException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }finally {
- jdbcutils.closeResource(conn, null);
- }
- }
-
- //BeanListHandler:是ResultSetHandler接口的实现类,用于封装表中的多条记录构成的集合
- @Test
- public void testSelect2(){
- Connection conn=null;
- try {
- QueryRunner runner=new QueryRunner();
- conn = jdbcutils.getConnection2();
- String sql="select id,name,email,birth from customers where id =?";
- BeanListHandler<Customer> handler=new BeanListHandler<>(Customer.class);
- List<Customer> list = runner.query(conn, sql, handler, 20);
- list.forEach(System.out::println);
- } catch (SQLException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }finally {
- jdbcutils.closeResource(conn, null);
- }
- }
-
- //MapHandler:是ResultHandler接口的实现类,将字段及相应字段的值作为map中的key和value
- @Test
- public void testSelect3(){
- Connection conn=null;
- try {
- QueryRunner runner=new QueryRunner();
- conn = jdbcutils.getConnection2();
- String sql="select id,name,email,birth from customers where id =?";
- MapHandler handler=new MapHandler();
- Map<String, Object> map = runner.query(conn, sql, handler, 20);
- System.out.println(map);
- } catch (SQLException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }finally {
- jdbcutils.closeResource(conn, null);
- }
- }
-
-
- //MapListHandler:是ResultHandler接口的实现类,将字段及相应字段的值作为map中的key和value,封装多个map的集合
- @Test
- public void testSelect4(){
- Connection conn=null;
- try {
- QueryRunner runner=new QueryRunner();
- conn = jdbcutils.getConnection2();
- String sql="select id,name,email,birth from customers where id =?";
- MapListHandler handler=new MapListHandler();
- List<Map<String, Object>> list = runner.query(conn, sql, handler, 20);
- list.forEach(System.out::println);
- } catch (SQLException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }finally {
- jdbcutils.closeResource(conn, null);
- }
- }
通过以上几个代码,我们发现了什么?除了sql语句的变化外,变化的还有传入的参数handler以及接收runner方法的类,因为大部分情况QueryRunner类已经帮我们包装好了,我们需要做的仅仅只有因地制宜选用合适的方法。但是凡事总有例外,如果真的没有合适的包装方法呢?我们可以选择自定义方法:
- //自定义ResultHandler的实现类
- @Test
- public void testSelect6(){
- Connection conn=null;
- try {
- QueryRunner runner=new QueryRunner();
- conn = jdbcutils.getConnection2();
- String sql="select id,name,email,birth from customers where id = ?";
- ResultSetHandler<Customer> handler=new ResultSetHandler<Customer>() {
-
- @Override
- public Customer handle(ResultSet rs) throws SQLException {
- if(rs.next()) {
- int id=rs.getInt("id");
- String name=rs.getString("name");
- String email=rs.getString("email");
- Date birth=rs.getDate("birth");
- return new Customer(id,name,email,birth);
- }else {
- return null;
- }
- }
-
- };
- Customer customer = runner.query(conn, sql, handler, 20);
- System.out.println(customer);
-
- } catch (SQLException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }finally {
- jdbcutils.closeResource(conn, null);
- }
- }
说是自定义方法,其实无非是按照前几篇的方法直接套进去即可,并没有出奇的地方。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。