前言

  最近几天又抽时间给代码生成器增加了几个新功能(预计今晚发布完毕),目前已支持postgresql数据库,HikariCP连接池和swagger2(文末有生成器获取链接,喜欢的朋友可以下载使用,永久免费,推荐大家以安装idea插件的方式使用,简单快捷),顺便讲解一下postgresql和mysql的区别,HikariCP和Druid的区别以及swagger2的使用方法,不然就没东西写啦,没错,我就是来水文的!让我们一起看一下吧。

PostgreSql VS MySql

  MySQL相信大家都再熟悉不过了,号称世界上最流行的数据库服务器,体积小,速度快,开源免费,可移植性强,使用简单,这些特性让它成为了国内互联网企业的数据库一哥,但真正导致它如此流行的原因还要归结于它的历史,08年的时候MySQL由SUN公司收购并一直供大家免费使用,也正是那个时候,MySQL积累了成千上万的粉丝,企业也因此培养了大量熟练使用MySQL的程序员,虽然当时的PG已经拥有许多高级特性,但互联网大多用不到,互联网需要的特性——快速,PG不具备。历史延续下来,造成了今天的局面。可以说互联网成就了MySQL。

  10年SUN公司被ORACLE收购,MySql也由Oracle接管,直到今日,MySQL仍然是最受开发者欢迎的数据库之一。

  相比MySql,PG大家可能就要陌生一些,PG号称世界上最先进的数据库服务器,一个最流行,一个最先进,你细品。

  PG目前有超过1000位顶级互联网开发者维护,更新速度相对较快,并且完全开源免费。PG更像是一个集大成于一体的数据库,它集成了关系型数据库与非关系型数据库的优点,让你可以灵活的存储数据结构。

  另外,数据一致性和完整性等性质都是PG的高度优先事项,这也是为什么日本有很多项目使用PG而不使用MySQL的原因,这省去了很多事务控制的麻烦,比如常见的并发更新,PG可以保证其正确性,因为隐藏列保存了version字段,相当于帮助你实现了乐观锁而不必靠编码实现,MySql则必须手动加锁实现。此外,PG对于地理位置的信息存储有着自己不可替代的优势,外部表同样是一个激动人心的功能。总之,说句公道话,PG比Mysql强大很多!它正在慢慢崛起,相信在未来会与MySql保持相对平衡的状态。

  运行模式方面,PG是进程模式,MySQL是线程模式。通常情况下,进程模式在多CPU环境下可以有更高的资源利用率。进程模式共享数据需要用到共享内存,而线程模式数据本身就在进程空间内共享,不同线程对于数据的访问需要控制好线程之间的同步。线程模式对资源的消耗相对较少,所以理论上MySql支持比PG更多的连接,但pgpool这款优秀的连接池软件可以很好的解决这个问题!

  最后,有一点需要说明:不管是PostgreSQL还是MySQL,都不能声称自己比对方更优秀,对用户来说,只有合适的,没有最优秀的。

HikariCP VS Druid

  Druid连接池是阿里的一款开源数据库连接池组件,近几年KO掉了老牌的C3P0,DBCP,成为数据库连接池的新宠,由于其使用简单,安全,速度快,强大且丰富的监控特性等优点,所以被不少企业所采用。Druid连接池各方面比较均衡,对于大多数应用来说已经足够,还赠送一个监控界面,这也是极好的。

  但有一点需要注意,当我们的应用程序存在缺陷的时候,使用Druid连接池很有可能会导致连接一直不能被释放,频繁导致无法获取数据库连接的异常发生,需要我们通过以下配置来定位问题发生的位置:

<!-- 超过时间限制是否回收 -->
<property name="removeAbandoned" value="true" />
<!-- 超时时间;单位为秒。180秒=3分钟 -->
<property name="removeAbandonedTimeout" value="180" />
<!-- 关闭abanded连接时输出错误日志 -->
<property name="logAbandoned" value="true" />

  定位问题并解决之后,注释掉即可,因为会比较耗费性能,生产环境慎用!

  HikariCP作为后起之秀,号称是最快的数据库连接池,它,超快,快到连SpringBoot2都采纳其为默认连接池。代码量只有130kb,俗话说,浓缩的都是精华,看来一点不假。

  HikariCP不光块,稳定性和可靠性也经过了权威认证,口碑极好,作者优化并精简了字节码、使用FastList替代ArrayList为其带来了强悍的性能支持。

  如果追求极致性能,可以考虑使用HikariCP!

Swagger2

  Swagger2可以帮助我们生成接口文档的描述,有利于前后台工作人员之间的沟通,进而提高工作效率。

  Swagger2的使用方法极其简单,此处以Springboot项目为例,首先需要我们引入pom依赖:

<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.8.0</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.8.0</version>
</dependency>

  然后新建对应的配置类:

@Configuration
//注解开启 swagger2 功能
@EnableSwagger2
public class SwaggerConfig { @Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
//是否开启 (true 开启 false隐藏。生产环境建议隐藏)
.enable(true)
.select()
//扫描的路径包,设置basePackage会将包下的所有被@Api标记类的所有方法作为api
.apis(RequestHandlerSelectors.basePackage("testUp.controller"))
//指定路径处理PathSelectors.any()代表所有的路径
.paths(PathSelectors.any())
.build();
} private ApiInfo apiInfo() {
return new ApiInfoBuilder()
//设置文档标题(API名称)
.title("Swagger2接口文档")
//文档描述
.description("接口说明")
.license("Apache 2.0")
.licenseUrl("http://www.apache.org/licenses/LICENSE-2.0")
//服务条款URL
.termsOfServiceUrl("https://swagger.io/")
//版本号
.version("1.0")
.build();
} }

  如果使用了拦截器:

@Configuration
public class MvcConfig implements WebMvcConfigurer {
/**
* 拦截器
*/
@Override
public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new HandlerInterceptor() {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception { //你的业务逻辑。。。。。
return true; }
}).addPathPatterns("/**").excludePathPatterns("/login", "/register", "/login/doLogin", "/user/register",
"/mystatic/**", "/druid/**", "/swagger-resources/**", "/webjars/**", "/v2/**", "/swagger-ui.html/**");
} @Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("swagger-ui.html")
.addResourceLocations("classpath:/META-INF/resources/");
registry.addResourceHandler("/webjars/**")
.addResourceLocations("classpath:/META-INF/resources/webjars/");
}
}

  如果使用了Spring Security:

@Override
public void configure(WebSecurity web) throws Exception {
//allow Swagger URL to be accessed without authentication
web.ignoring().antMatchers("/v2/api-docs",//swagger api json
"/swagger-resources/configuration/ui",//用来获取支持的动作
"/swagger-resources",//用来获取api-docs的URI
"/swagger-resources/configuration/security",//安全选项
"/swagger-ui.html");
}

  接着在需要访问的controller加入以下注解,例如(这里使用了@Api和@ApiOperation注解):

@RestController
@CrossOrigin(origins = "*", allowCredentials = "true", allowedHeaders = "*")
@Api(tags = "登录接口")
@RequestMapping("/login")
public class LoginController { @ApiOperation(value = "登录")
@RequestMapping(value = "/doLogin", method = RequestMethod.POST)
public CommonResult doLogin(@RequestBody User user, HttpSession session) { if (("admin".equals(user.getUserName()) && "root".equals(user.getPassword()))) { session.setAttribute("user", user);
return new CommonResult(ResultConstant.SUCCCSS_CODE, ResultConstant.SUCCESS_MSG);
}
return new CommonResult(ResultConstant.LOGIN_FAIL_CODE, ResultConstant.FAIL_MSG); } @ApiOperation(value = "退出登录")
@RequestMapping(value = "/doLogOut",method = RequestMethod.POST)
public CommonResult doLogOut(HttpSession session) { session.removeAttribute("user");
return new CommonResult(ResultConstant.SUCCCSS_CODE, ResultConstant.SUCCESS_MSG); } }

  最后,实体类添加注解(@ApiModel和@ApiModelProperty):

@ApiModel
public class User implements Serializable { /**
* serialVersionUID
*/
private static final long serialVersionUID = 1L; @ApiModelProperty(value = "用户名", name = "userName")
private String userName; @ApiModelProperty(value = "密码", name = "password")
private String password; public String getUserName() {
return userName;
} public void setUserName(String userName) {
this.userName = userName;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
} }

  访问http://localhost:ip:port/项目路径/swagger-ui.html:

  通过此界面,还可以对接口进行测试,大大方便了我们的开发对接工作,从此告别复杂文档的维护!

自定义参数配置一览

  新版的代码生成器添加了常用参数配置界面,在这里可以选择连接池的种类(目前支持Druid和HikariCP)以及是否启用Swagger,如下:





  更多参数配置会陆续加入!

  postgresql的使用同样简单,只需要把数据库类型切换成postgresql即可:



  多表查询模块postgresql模式下生成的代码可能会出现问题,因为还没有进行测试。。。

结语

  聊完技术,让我们关注一下生活,由于受到疫情的影响,国内的经济受到了很大程度的冲击,到处都爆出裁员,找不到工作等负面信息,大家不必对此感到慌张,风雨过后必见彩虹,我们要做的就是要不断提升自己的技术水平,多看书,多学习,成为行业核心人员,这样,才能做到稳操胜券,坐怀不乱。

  希望国外能尽早控制住疫情的发展,战胜这狡猾的病毒,每天早晨醒来,看着增长的数字真的很让人揪心。

  最后,希望大家无论何时都要把身体健康放在第一位,毕竟身体是革命的本钱,健康没了,一切都变的没有意义。

  谢谢你的观看,下次再见!

附:

生成器下载链接:

http://www.zrxlh.top:8088/coreCode/


源码地址:

https://gitee.com/zrxjava/codeMan

Java代码生成器加入postgresql数据库、HikariCP连接池、swagger2支持!的更多相关文章

  1. Java操作数据库——使用连接池连接数据库

    Java操作数据库——使用连接池连接数据库 摘要:本文主要学习了如何使用JDBC连接池连接数据库. 传统方式和连接池方式 传统方式的步骤 使用传统方式在Java中使用JDBC连接数据库,完成一次数据库 ...

  2. 在 Spring Boot 中使用 HikariCP 连接池

    上次帮小王解决了如何在 Spring Boot 中使用 JDBC 连接 MySQL 后,我就一直在等,等他问我第三个问题,比如说如何在 Spring Boot 中使用 HikariCP 连接池.但我等 ...

  3. SpringBoot 使用Hikaricp连接池

    1.添加pom.xml依赖 如果是SpringBoot2.0,那么默认的连接池就是Hikaricp,不需要配置 其他的,如果继承 <parent> <groupId>org.s ...

  4. HikariCP连接池

    1.HikariCP连接池是什么? HikariCP是数据库连接池,而且是号称史上最快的,而且目前来看确实是这样的,SpringBoot2.0也已经采用HikariCP作为默认连接池配置. githu ...

  5. hibernate对连接池的支持和HQL查询

    hibernate对连接池的支持 连接池, 作用: 管理连接:提升连接的利用效率! 常用的连接池: C3P0连接池 Hibernate 自带的也有一个连接池,且对C3P0连接池也有支持! 只维护一个连 ...

  6. HikariCP连接池及其在springboot中的配置

    主要配置如下: 配置项 描述 构造器默认值 默认配置validate之后的值 validate重置 autoCommit 自动提交从池中返回的连接 true true - connectionTime ...

  7. SpringBoot性能优化之HikariCP连接池

    以前一直使用阿里Druid数据库连接池,这段时间听说有个号称速度最快.代码最简的后起之秀——HikariCP,于是动手实践一下 1.依赖如下: <?xml version="1.0&q ...

  8. Java的JDBC原生态学习以及连接池的用法

    JDBC是什么 JDBC(Java Data Base Connectivity)是Java访问数据库的桥梁,但它只是接口规范,具体实现是各数据库厂商提供的驱动程序(Driver). 应用程序.JDB ...

  9. Java 学习使用常见的开源连接池

    目录 连接池介绍 自定义连接池 JDBC Tomcat Pool DBCP(DataBase Connection Pool) 使用配置文件来设置DBCP C3P0 Druid 连接池介绍 在说连接池 ...

随机推荐

  1. 剑指offer刷题总结

    ★ 二维数组的查找 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否 ...

  2. HashMap源码与相关面试题

    一.哈希表 哈希表是一种可以快速定位得数据结构.哈希表可以做到平均查找.插入.删除时间是O(1),当然这是指不发生Hash碰撞得情况.而哈希表最大得缺陷就是哈希值得碰撞(collision). Has ...

  3. JavaScript基本数据类型及其转换规则

    ECMAScript 数据类型 ECMAScript中有五种基本数据类型:Undefined, Null, Boolean, Number, String 一种复杂数据类型:Object 数据类型检测 ...

  4. Jmeter 压力测试笔记(1)--服务器迁移失败

    近期,公司服务器因技术架构升级等原因需要迁移,在经过开发,运维DBA,测试多部门进行联合讨论后,制定出了迁移方案.迁移前也对APP应用进行了各种测试,并没有发现问题. 凌晨2点开始迁移,5点完成迁移. ...

  5. Vulnhub DC-2靶机渗透

    信息搜集 nmap扫描端口 nmap -sV 192.168.146.140 -p1-10000 开了80端口,那就直接访问一下把.(7744端口是ssh端口,之后会用到) 输入ip,发现url处变成 ...

  6. @suppressWarnings("unchecked") java 中是什么意思 (一般放dao查询方法上)

    J2SE 提供的最后一个批注是 @SuppressWarnings.该批注的作用是给编译器一条指令,告诉它对被批注的代码元素内部的某些警告保持静默. 一点背景:J2SE 5.0 为 Java 语言增加 ...

  7. java消除 list重复值及交集,并集,差集

    消除 list重复值 Java代码  public void removeDuplicate(List list) { HashSet h = new HashSet(list); list.clea ...

  8. java解惑之常常忘记的事

    java解惑之常常忘记的事 2012-10-17 18:38:57|  分类: JAVA |  标签:基础知识  软件开发  |举报|字号 订阅     针对刚接触java的菜鸟来说,java基础知识 ...

  9. 一个不错的博客-涉及el 、jstl、log4j 入门等

    http://www.cnblogs.com/Fskjb/category/198224.html

  10. TensorFlow保存、加载模型参数 | 原理描述及踩坑经验总结

    写在前面 我之前使用的LSTM计算单元是根据其前向传播的计算公式手动实现的,这两天想要和TensorFlow自带的tf.nn.rnn_cell.BasicLSTMCell()比较一下,看看哪个训练速度 ...