当前位置:   article > 正文

c3p0及druid连接池的简单示例,QueryRunner的简单使用_若依 druid c3p0

若依 druid c3p0

    为什么要使用数据库连接池?主要有以下原因:

   资源重用
     由于数据库连接得以重用,避免了频繁创建,释放连接引起的大量性能开销。在减少系统消耗的基础上,另一方面也增加了系统运行环境的平稳性。
  更快的系统反应速度
      数据库连接池在初始化过程中,往往已经创建了若干数据库连接置于连接池中备用。此时连接
的初始化工作均已完成。对于业务请求处理而言,直接利用现有可用连接,避免了数据库连接
初始化和释放过程的时间开销,从而减少了系统的响应时间
  新的资源分配手段
      对于多应用共享同一数据库的系统而言,可在应用层通过数据库连接池的配置,实现某一应用
最大可用数据库连接数的限制,避免某一应用独占所有的数据库资源
  统一的连接管理,避免数据库连接泄露
      在较为完善的数据库连接池实现中,可根据预先的占用超时设定,强制回收被占用连接,从而
避免了常规数据库连接操作中可能出现的资源泄露

 

c3p0

    C3P0 是一个开源组织提供的一个数据库连接池,速度相对较慢,稳定性还可以。hibernate官方推荐使用。想要使用该数据库连接池,首要的就是要先导入依赖的jar包,我导入的是0.9.1.2版本的。其次,我们需要创建一个配置文件,命名为c3p0-config.xm。有配置如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <c3p0-config>
  3. <named-config name="自定义名字">
  4. <!-- 提供获取连接的四个基本信息 -->
  5. <property name="driverClass">com.mysql.cj.jdbc.Driver</property>
  6. <property name="jdbcUrl">jdbc:mysql://localhost:3306/test</property>
  7. <property name="user">用户名</property>
  8. <property name="password">数据库连接密码</property>
  9. <!-- 进行数据库连接池管理的基本信息 -->
  10. <!-- 当数据库连接池中连接不够时,一次性向服务器申请的连接数 -->
  11. <property name="acquireIncrement">5</property>
  12. <!-- 初始化时的连接数量 -->
  13. <property name="initialPoolSize">10</property>
  14. <!-- 数据库连接池维护的最小连接数 -->
  15. <property name="minPoolSize">10</property>
  16. <!-- 数据库连接池中维护的最多连接数 -->
  17. <property name="maxPoolSize">100</property>
  18. <!-- 数据库连接池中维护的最多的Statement的个数 -->
  19. <property name="maxStatements">50</property>
  20. <!-- 每个连接中最多可以使用的Statement的个数 -->
  21. <property name="maxStatementsPerConnection">2</property>
  22. </named-config>
  23. </c3p0-config>

    以上展示的仅仅是部分设置,如果想要更多设置请移步相关教程网站查询使用。有了配置文件后,我们就可以着手使用了,以下是一个简单的调用:

  1. @Test
  2. public void testGetConnection2() throws Exception {
  3. ComboPooledDataSource cpds = new ComboPooledDataSource("自定义的名字");
  4. Connection conn = cpds.getConnection();
  5. System.out.println(conn);
  6. }

   运行成功便说明已经成功使用了。

Druid

    Druid(德鲁伊)是阿里巴巴开源平台上一个数据库连接池实现,它结合了C3P0DBCPProxoolDB池的优点,同时加入了 日志监控,可以很好的监控DB池连接和SQL的执行情况,可以说是针对监控而生的DB连接池,可以说是目前最好的连接池之一。

    这次我导入的jar包是1.1.10版本的,德鲁伊的配置文件方式和jdbc相似,需要创建一个druid.properties文件,添加如下数据:

  1. url=jdbc:mysql://localhost:3306/test
  2. username=数据库用户名
  3. password=数据库密码
  4. driverClassName=com.mysql.cj.jdbc.Driver
  5. initialSize=10
  6. maxActive=10

    就可以着手使用了:

  1. @Test
  2. public void druidtest() throws Exception {
  3. Properties pros = new Properties();
  4. InputStream is = ClassLoader.getSystemClassLoader().getSystemResourceAsStream("druid.properties");
  5. pros.load(is);
  6. DataSource source=DruidDataSourceFactory.createDataSource(pros);
  7. Connection conn=source.getConnection();
  8. System.out.println(conn);
  9. }

    成功运行便能正常使用了。由于druid在开发中一般使用的次数较多,我在后附上相关的配置参数.

 

QueryRunner的简单使用 

    该类简单化了SQL查询,它与ResultSetHandler组合在一起使用可以完成大部分的数据库操作,能够大大减少编码量。

它的使用方法和之前文章中结构上是非常相似的,以下是插入的代码:

  1. @Test
  2. public void testInsert(){
  3. Connection conn=null;
  4. try {
  5. QueryRunner runner=new QueryRunner();
  6. conn = jdbcutils.getConnection2();
  7. String sql="insert into customers(name,email,birth) values(?,?,?)";
  8. runner.update(conn,sql,"坤坤","kk@126.com","1997-05-05");
  9. } catch (SQLException e) {
  10. // TODO Auto-generated catch block
  11. e.printStackTrace();
  12. }finally {
  13. jdbcutils.closeResource(conn, null);
  14. }
  15. }

     我还有查询的代码:

  1. //BeanHandler:是ResultSetHandler接口的实现类,用于封装表中的一条记录
  2. @Test
  3. public void testSelect(){
  4. Connection conn=null;
  5. try {
  6. QueryRunner runner=new QueryRunner();
  7. conn = jdbcutils.getConnection2();
  8. String sql="select id,name,email,birth from customers where id =?";
  9. BeanHandler<Customer> handler=new BeanHandler<>(Customer.class);
  10. Customer cust = runner.query(conn, sql, handler, 20);
  11. System.out.println(cust);
  12. } catch (SQLException e) {
  13. // TODO Auto-generated catch block
  14. e.printStackTrace();
  15. }finally {
  16. jdbcutils.closeResource(conn, null);
  17. }
  18. }
  19. //BeanListHandler:是ResultSetHandler接口的实现类,用于封装表中的多条记录构成的集合
  20. @Test
  21. public void testSelect2(){
  22. Connection conn=null;
  23. try {
  24. QueryRunner runner=new QueryRunner();
  25. conn = jdbcutils.getConnection2();
  26. String sql="select id,name,email,birth from customers where id =?";
  27. BeanListHandler<Customer> handler=new BeanListHandler<>(Customer.class);
  28. List<Customer> list = runner.query(conn, sql, handler, 20);
  29. list.forEach(System.out::println);
  30. } catch (SQLException e) {
  31. // TODO Auto-generated catch block
  32. e.printStackTrace();
  33. }finally {
  34. jdbcutils.closeResource(conn, null);
  35. }
  36. }
  37. //MapHandler:是ResultHandler接口的实现类,将字段及相应字段的值作为map中的keyvalue
  38. @Test
  39. public void testSelect3(){
  40. Connection conn=null;
  41. try {
  42. QueryRunner runner=new QueryRunner();
  43. conn = jdbcutils.getConnection2();
  44. String sql="select id,name,email,birth from customers where id =?";
  45. MapHandler handler=new MapHandler();
  46. Map<String, Object> map = runner.query(conn, sql, handler, 20);
  47. System.out.println(map);
  48. } catch (SQLException e) {
  49. // TODO Auto-generated catch block
  50. e.printStackTrace();
  51. }finally {
  52. jdbcutils.closeResource(conn, null);
  53. }
  54. }
  55. //MapListHandler:是ResultHandler接口的实现类,将字段及相应字段的值作为map中的keyvalue,封装多个map的集合
  56. @Test
  57. public void testSelect4(){
  58. Connection conn=null;
  59. try {
  60. QueryRunner runner=new QueryRunner();
  61. conn = jdbcutils.getConnection2();
  62. String sql="select id,name,email,birth from customers where id =?";
  63. MapListHandler handler=new MapListHandler();
  64. List<Map<String, Object>> list = runner.query(conn, sql, handler, 20);
  65. list.forEach(System.out::println);
  66. } catch (SQLException e) {
  67. // TODO Auto-generated catch block
  68. e.printStackTrace();
  69. }finally {
  70. jdbcutils.closeResource(conn, null);
  71. }
  72. }

    通过以上几个代码,我们发现了什么?除了sql语句的变化外,变化的还有传入的参数handler以及接收runner方法的类,因为大部分情况QueryRunner类已经帮我们包装好了,我们需要做的仅仅只有因地制宜选用合适的方法。但是凡事总有例外,如果真的没有合适的包装方法呢?我们可以选择自定义方法:

  1. //自定义ResultHandler的实现类
  2. @Test
  3. public void testSelect6(){
  4. Connection conn=null;
  5. try {
  6. QueryRunner runner=new QueryRunner();
  7. conn = jdbcutils.getConnection2();
  8. String sql="select id,name,email,birth from customers where id = ?";
  9. ResultSetHandler<Customer> handler=new ResultSetHandler<Customer>() {
  10. @Override
  11. public Customer handle(ResultSet rs) throws SQLException {
  12. if(rs.next()) {
  13. int id=rs.getInt("id");
  14. String name=rs.getString("name");
  15. String email=rs.getString("email");
  16. Date birth=rs.getDate("birth");
  17. return new Customer(id,name,email,birth);
  18. }else {
  19. return null;
  20. }
  21. }
  22. };
  23. Customer customer = runner.query(conn, sql, handler, 20);
  24. System.out.println(customer);
  25. } catch (SQLException e) {
  26. // TODO Auto-generated catch block
  27. e.printStackTrace();
  28. }finally {
  29. jdbcutils.closeResource(conn, null);
  30. }
  31. }

    说是自定义方法,其实无非是按照前几篇的方法直接套进去即可,并没有出奇的地方。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/68224
推荐阅读
相关标签
  

闽ICP备14008679号