发表于: 2017-12-27 23:22:47

2 737


今天完成的事情:

配置连接池

连接池的作用:减少频繁的数据库连接、关闭,降低资源消耗

http://blog.csdn.net/fysuccess/article/details/66972554

分别配置了jdbc无连接池、C3p0Tomcat Jdbc PoolDBCPDruid   五种配置

详细配置就不贴了。

经过简单的测试:

JDBC(没用连接池)       593ms576ms607ms599ms593ms

C3p0                  496ms635ms590ms618ms596ms

Tomcat Jdbc Pool      841ms743ms683ms655ms634ms

DBCP               628ms734ms598ms841ms800ms

Druid                 144ms155ms142ms154ms174ms

因为测试的数据操作 简单,只能作为参考,但无疑,druid是性能最高的。

从网上看到,用的最多的就是两种C3p0Druid

小项目随意,大项目应该选Druid

 

 

C3p0

DBCP

Tomcat Jdbc   Pool

BoneCP

Druid

线程

单线程

单线程

多线程、异步

多线程、异步

多线程、异步

开源顶目集成

Spring

Hibernate

Tomcat组件

Tomcat7 以后

Hibernate

DataNucleus

Druid

PSCache
 
连接池关键指标

支持

支持

支持

支持

支持

LRU性能关键指标

ExceptionSorter
 
容错特性

监控

JmxLog

Jmx

Jmx

Jmx

JmxLogHttp

可扩展性

较好

连接池管理

队列

LinkedBlockingD eque,FIFO 队列、 FILO堆栈

FairBlockingQueue

堆栈

数组、

CopyOnWriteArra

yList(COW)

Tomcat数据源、
 
JNDI

数据源和JNDI绑定,支持 JDBC3规范和 JDBC2标准扩展

支持JNDI配置,需要加入jconn3.jar

支持JNDI配置,tomcat 1个模块

支持JNDI配置,稍复杂

com.jolbox.bonecp.BoneCPDataSource

支持jNDI配置 com.alibaba.drui   d.pool.DruidData SourceFactory

代码复杂度

复杂

中等,超过60个类,600KB

简单,8个核心类

简单,40KB

中等

更新维护


决定使用Druid配置连接池,下面是配置:

这个切换也比较方便

<!--Spring Druid 数据源配置-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
   <!-- 基本属性 urluserpassword -->
   <property name="url" value="${jdbc.url}" />
   <property name="username" value="${jdbc.username}" />
   <property name="password" value="${jdbc.password}" />
   <!-- 配置初始化大小、最小、最大 -->
   <property name="initialSize" value="5" />
   <property name="minIdle" value="1" />
   <property name="maxActive" value="20" />
   <!-- 配置获取连接等待超时的时间 -->
   <property name="maxWait" value="60000" />
   <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
   <property name="timeBetweenEvictionRunsMillis" value="60000" />
   <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
   <property name="minEvictableIdleTimeMillis" value="300000" />
   <!-- 打开PSCache,并且指定每个连接上PSCache的大小 -->
   <property name="poolPreparedStatements" value="true" />
   <property name="maxPoolPreparedStatementPerConnectionSize" value="20" />
   <!-- 配置监控统计拦截的filters,去掉后监控界面sql无法统计 -->
   <property name="filters" value="stat" />
</bean>


把测试方法写到main()

先写一个基类,初始化spring容器,获得mapper bean

再写测试的实现

 

多写了两个sql查询语句。

    //获取
   Student getByName(String name);
   Student getById(int id);

   //分组查询
//    @Select("SELECT * FROM student LIMIT #{start},#{count}")
   List<Student> listGroup(@Param("start") int start,@Param("count") int count);


主要代码:

springmybatisdruid\src\main\java\com\bpzj\task1\test\MapperBean.java

 

package com.bpzj.task1.test;

import com.bpzj.task1.dao.StudentMapper;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;


public class MapperBean {

// 实例化容器
   ApplicationContext ctx = new ClassPathXmlApplicationContext("bean-druid.xml");

   // 获取mapper bean
   StudentMapper studentMapper = (StudentMapper) ctx.getBean("studentMapper");

   public StudentMapper getStudentMapper() {
       return studentMapper;
   }
}


springmybatisdruid\src\main\java\com\bpzj\task1\test\Task1Test.java

 

public class Task1Test {

static MapperBean mapperBean = new MapperBean();

   public static Student newStudent() {
       Student student= new Student(1,"曲艳行","3169119846",
               1,"1118-22","燕山大学",
               "2641","http://www.jnshu.com/occupation/5/daily",
               "新年好","郑州分院-王鹏举","知乎");
       return student;
   }

public static void add() {
    Student student1 = newStudent();
       student1.setId(1);
       boolean a= mapperBean.getStudentMapper().insert(student1);
       if (a) {
    System.out.println("insert success");
       } else {
    System.out.println("insert failure");
       }
}

public static void delete() {
boolean a= mapperBean.getStudentMapper().deleteById(1);
       if (a) {
    System.out.println("delete success");
       } else {
    System.out.println("delete failure");
       }
}

public static void listAll() {
    List<Student> students = mapperBean.getStudentMapper().listAll();
       for (Student student : students) {
    System.out.println(student);
       }
}

public static void listGroup(int start, int count) {
    List<Student> students = mapperBean.getStudentMapper().listGroup(start, count);
       for (Student student : students) {
           System.out.println(student);
       }
}

public static void update() {
    Student student = newStudent();
       student.setId(1);
       student.setOath("老大最帅");
       boolean a= mapperBean.getStudentMapper().updateById(student);
       if (a) {
           System.out.println("update success");
       } else {
          System.out.println("update failure");
       }
}

// 根据姓名查询
   public static void getByName() {
       Student student = mapperBean.getStudentMapper().getByName("曲艳行");
       System.out.println(student);
   }

public static Student getById(int id) {
       Student student = mapperBean.getStudentMapper().getById(id);
       // System.out.println(student);
       return student;
   }

public static void main(String[] args) {

       System.out.println("查询所有学生:");
       listAll();

       System.out.println("\n删除id=1的学生:");
       delete();
       System.out.println("选取前两个学生验证删除成功:");
       listGroup(0,2);

       System.out.println("\n新建学生,插入id=1这一列:");
       add();
       System.out.println("选取前两个学生验证插入成功:");
       listGroup(0,2);

       System.out.println("\n更新id=1的宣言");
       update();
       System.out.println("检查更新是否成功");
       int id =1;
       Student student = getById(id);
       System.out.println("Student [id=" + id + " 宣言=" + student.getOath() + "]");
   }

}


测试结果:

 

打包成jar文件,执行main方法

http://blog.csdn.net/xiao__gui/article/details/47341385

上传到服务器,执行main结果:


每次上传到github都要删些文件,写了一个python脚本:

https://github.com/bpzj/Study/tree/master/Java/Easy

明天计划的事情:

完成任务1,总结下。

遇到的问题:

1spring 容器初始化、获取mapper bean的问题

main方法中,因为不在test文件夹下,直接使用单元测试的注解,会出现空指针错误。

只要把 语句放到main函数下,就报空指针

一直调试,就是取不到mapper,最后,改用原来的方法。

想起以前写jdbcTemplate的时候,写过一个基类,从基类扩展,这个倒不用写基类,但效果差不多。时间都浪费在想通过那两个注解进行spring容器的创建、mapper bean的获取。浪费了大概56个小时。

最后想通了,先不管这些,自己实现也很简单。不能在这上面浪费时间

 

2、接口里重载方法,在mybatis中,用xml文件写sql时,在sql语句中造成id一致:

https://github.com/mybatis/mybatis-3/issues/705

解决办法(mybatis 3.4.4):使用注解,不重载(改方法名)

两种都试过了,都可以,如果必须保持方法的重载,可以用注解

 

3log4j2 生成文件乱码

字符设置,log4j2默认使用系统配置,最好修改为utf-8

<PatternLayout pattern="..." charset="UTF-8"/>

需要用大写UTF

 

4maven打包jar,同时打包依赖的jar

http://blog.csdn.net/xiao__gui/article/details/47341385

第三种方法解决。

 

收获:

最重要的的收获就是,一个问题调试不出来,可能是方向错了。

 



返回列表 返回列表
评论

    分享到