hikaricp druid比较_Java代码生成器加入postgresql数据库、HikariCP连接池、swagger2支持!...

前言

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

4463630d9d1801f696d93e1d01d3bdca.gif

PostgreSql VS MySql

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

1aa247a7909d007322b32a5b173483ac.gif
  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" /><property name="removeAbandonedTimeout" value="180" /><property name="logAbandoned" value="true" />   

   定位问题并解决之后,注释掉即可,因为会比较耗费性能,生产环境慎用!
  HikariCP作为后起之秀,号称是最快的数据库连接池,它,超快,快到连SpringBoot2都采纳其为默认连接池。代码量只有130kb,俗话说,浓缩的都是精华,看来一点不假。
  HikariCP不光块,稳定性和可靠性也经过了权威认证,口碑极好,作者优化并精简了字节码、使用FastList替代ArrayList为其带来了强悍的性能支持。
  如果追求极致性能,可以考虑使用HikariCP!

Swagger2

   Swagger2可以帮助我们生成接口文档的描述,有利于前后台工作人员之间的沟通,进而提高工作效率。
  Swagger2的使用方法极其简单,此处以Springboot项目为例,首先需要我们引入pom依赖:

<dependency>  <groupId>io.springfoxgroupId>  <artifactId>springfox-swagger2artifactId>  <version>2.8.0version>dependency><dependency>  <groupId>io.springfoxgroupId>  <artifactId>springfox-swagger-uiartifactId>  <version>2.8.0version>dependency>

   然后新建对应的配置类:

@Configuration//注解开启 swagger2 功能@EnableSwagger2public 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();    }}

   如果使用了拦截器:

@Configurationpublic 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:

@Overridepublic 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):

@ApiModelpublic 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:67d46f134bab9ccf7b86e0b1f2d137f2.png  通过此界面,还可以对接口进行测试,大大方便了我们的开发对接工作,从此告别复杂文档的维护!

自定义参数配置一览

  新版的代码生成器添加了常用参数配置界面,在这里可以选择连接池的种类(目前支持Druid和HikariCP)以及是否启用Swagger,如下:e7fa9d627cdf72afe12d1032af0f9bce.png48f7ab00776f2d501a42c30b90d3b28d.png更多参数配置会陆续加入!
  postgresql的使用同样简单,只需要把数据库类型切换成postgresql即可:d50524d82dca792fc05e638e4e6044c2.png多表查询模块postgresql模式下生成的代码可能会出现问题,因为还没有进行测试。。。

结语

   聊完技术,让我们关注一下生活,由于受到疫情的影响,国内的经济受到了很大程度的冲击,到处都爆出裁员,找不到工作等负面信息,大家不必对此感到慌张,风雨过后必见彩虹,我们要做的就是要不断提升自己的技术水平,多看书,多学习,成为行业核心人员,这样,才能做到稳操胜券,坐怀不乱。
  希望国外能尽早控制住疫情的发展,战胜这狡猾的病毒,每天早晨醒来,看着增长的数字真的很让人揪心。
  最后,希望大家无论何时都要把身体健康放在第一位,毕竟身体是革命的本钱,健康没了,一切都变的没有意义。
  谢谢你的观看,下次再见! 写个留言吧

附:
生成器下载链接:
http://www.zrxlh.top:8088/coreCode/

源码地址:

https://gitee.com/zrxjava/codeMan

往期推荐:

体积虽小,功能不少!SSM/SpringBoot代码生成器新增idea插件支持,安装到idea可直接使用!

SSM/SpringBoot代码生成器全面升级—增加全新前后端分离响应式主题,修复若干Bug

建站难?史上最全指南 — 教你使用WordPress搭建出属于自己的站点!

相关资源:JDBC连接HikariCP.zip



 

想要实时关注更多干货好文,扫描下图关注:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
假设你的项目是一个多模块的Maven项目,其中一个模块包含了`application-druid.yml`文件,而你需要在另一个模块的Java代码中获取该文件中的数据库连接信息。 可以使用Spring Boot的`YamlPropertySourceLoader`类来加载YAML文件并转换为Java对象,然后再从Java对象中获取所需的属性值。 以下是示例代码: ```java import org.springframework.boot.env.YamlPropertySourceLoader; import org.springframework.core.env.PropertySource; import org.springframework.core.io.ClassPathResource; import java.io.IOException; import java.util.Map; public class DatabaseConfig { private String url; private String username; private String password; public DatabaseConfig() throws IOException { YamlPropertySourceLoader loader = new YamlPropertySourceLoader(); ClassPathResource resource = new ClassPathResource("application-druid.yml"); PropertySource<?> propertySource = loader.load("database", resource); Map<String, Object> properties = (Map<String, Object>) propertySource.getSource(); Map<String, Object> dataSourceProperties = (Map<String, Object>) properties.get("spring.datasource"); this.url = (String) dataSourceProperties.get("url"); this.username = (String) dataSourceProperties.get("username"); this.password = (String) dataSourceProperties.get("password"); } public String getUrl() { return url; } public String getUsername() { return username; } public String getPassword() { return password; } } ``` 在上述代码中,我们首先使用`YamlPropertySourceLoader`加载`application-druid.yml`文件,然后从加载后的属性源中获取`spring.datasource`的属性值,最后将属性值分别赋值给`url`、`username`和`password`变量。 你可以在需要使用数据库连接信息的地方实例化`DatabaseConfig`类,然后通过调用其`getUrl()`、`getUsername()`和`getPassword()`方法获取相应的属性值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

唐 城

小朋友,你是不是有很多问号?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值