Java应用要连接数据库需要先通过jdbc与数据库之间产生connection,然后通过sql语句产生statment,再执行这个statment查询的到ResultSet返回给应用,应用解析ResultSet获得Java支持类型的结果。

这里存在以下几个问题:

产生连接本身需要,而且这个延时比起常规的查询操作来说是较高的,对于有响应时限的操作来说这是一个致命问题。

建立连接需要消耗数据库资源,数据库本身开放的连接数量是有限的,即使不断的建立与关闭连接保证总数的稳定,也会极大消耗数据库资源影响性能。而数据库资源比起应用服务器来说又是非常宝贵的,数据库的分流比应用要困难很多。

所以要避免这种情况就有了连接池。连接池有几个基本属性:初始连接数、最大连接数、最小空闲数、最大空闲数、最大等待毫秒数,分别假设为5 10 1 5 60。连接池可以想象为一个池子,先建立5个连接放入池子中。应用的一个线程需要与数据库交互时,向连接池要一个连接,然后去执行,执行完后会将连接还给连接池。当并发量很高时,连接池内的连接会被取完,此时又有线程要连接,就会检查是否达到了最大连接数,如果没达到就会继续新建连接,将连接交给线程。如果达到上限,则让线程进行等待,知道有线程把连接还回来。

当连接池内的连接数超过了最大空闲数时,当这个连接被归还连接池,它就会被强制关闭。而当连接池内的连接数小于最小空闲数时,连接池会自动去新建连接来补充到这个数量。为什么连接数量自己会变化呢?因为数据库存在一个连接的等待时间,超过这个时间始终没有活动的话,连接会被数据库关闭,连接池会周期性的去探知所有连接是否存活,以管理连接的数量。

所谓持久层,是指将数据长期存储到硬盘当中。因为在webapp开发中数据通过数据库存储到硬盘中,所以持久层可以简单的认为就是负责对数据库的增删改查。用过Java原始jdbc的查询的话都知道ResultSet要转换成Java Bean中间的重复操作还是挺多的;要把一个List转换成SQL语句也挺麻烦的,持久层框架的好处之一就是省略掉这中间的重复操作,根据写好的映射关系,直接完成数据库与Java代码之间交互。

常用的持久层框架有两个:MyBatis和Hibernate。MyBatis最大的特点是SQL语句基本就是没有任何封装的原生SQL。缺点当然是开发起来工作量较大,同时不同数据库之间的迁移性收到影响。优点是学习简单,SQL自由性大,也就有更大的优化空间。毕竟正常情况下你能够控制的东西越多,开发就会越复杂,但是性能极限会更高,当然这里的前提是开发者足够资深,毕竟一般人写的代码不如编译器优化出来的。

下面开始SSM框架下的这个M的搭建。首先,pom.xml里面引入相关的依赖,包括mybatis本身、Spring的支持插件、mysql驱动,以及连接池创建工具这里采用dbcp

mysql

mysql-connector-java

5.1.38

org.mybatis

mybatis-spring

1.3.1

org.mybatis

mybatis

3.4.5

commons-dbcp

commons-dbcp

1.4

然后配置数据源的话有两种方式,一种是直接配置数据源,还有一种是基于容器的数据源比如tomcat下的jndi连接。

直接配置的话,在applicationContext.xml,即通过ContextLoaderListener监听的配置文件里面添加如下:

这里采用外部读入参数的方式加载用户名信息,便于统一管理。resources目录下添加jdbc.properties

driver=com.mysql.jdbc.Driver

url=jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf8

username=root

password=123456

initialSize=5

maxActive=10

maxIdle=5

minIdle=1

maxWait=60

然后添加dao层Bean层与对应的xml映射文件

/p>

PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

select id,txt from test

packagecom.web.dao;importjava.util.List;importorg.mybatis.spring.annotation.MapperScan;importcom.web.bean.HelloBean;

@MapperScanpublic interfaceTestMapper {public ListgetTest();

}

packagecom.web.bean;public classHelloBean {privateString id;privateString txt;publicString getId() {returnid;

}public voidsetId(String id) {this.id =id;

}publicString getTxt() {returntxt;

}public voidsetTxt(String txt) {this.txt =txt;

}

}

全部添加完后,项目的路径如下:

然后通过注入dao层类之后执行testMapper.getTest(),表与插入的测试数据可以参见我上一篇文章。结果下:

说明数据已经直接映射到了结果的bean上面。

第二种方法,就是利用tomcat来创建连接池,然后mybatis直接只用tomcat的数据源。先配置context.xml

然后在applicationContext.xml文件上添加jndi数据源,并修改mybatis使用的数据源java:comp/env/这里是固定字段,后面的jdbc/mybatis-jndi对应context里面配置的name属性

java:comp/env/jdbc/mybatis-jndi

MyBatis的集成至此完成。

mybatis连接mysql数据库连接池_对于数据库连接池的一些思考和MyBatis的集成与使用...相关推荐

  1. myBatis连接MySQL报错误:No operations allowed after conn

    为什么80%的码农都做不了架构师?>>>    myBatis连接MySQL报错误:No operations allowed after connection closed.Con ...

  2. java 连接池_初探数据库连接池

    参考资料 数据库连接池学习笔记(一):原理介绍+常用连接池介绍 java数据库连接池实现原理 高性能数据库连接池的内幕 1. 为什么要使用连接池 数据库连接是一种关键的有限的昂贵的资源,这一点在多用户 ...

  3. jsp和mysql答辩_如何应对JSP连接MySQL数据库问题_网站数据库怎么连接到网页答辩问题...

    当您面临JSP连接MySQL数据库问题,你首先需要在MySQL数据库里创建一username表,表里面创建两个字符型的字段,字段名分别为:uid,pwd,然后插入几条测试数据. 以下用两种方式来实现J ...

  4. 数据库中文mybatis连接mysql数据库插入中文乱码

    文章结束给大家来个程序员笑话:[M] 对于mysql数据库的乱码问题,有两中情况: 1. mysql数据库编码问题(建库时设定). 2. 连接mysql数据库的url编码设置问题. 对于第一个问题,目 ...

  5. 应用连接mysql数据库失败_连接MySQL数据库失败频繁的原因

    连接mySQL数据库失败频繁,主要是什么原因造成的? 一年前,我开发了一个网站,租用的是linux下PHP+mySQL的虚拟空间,之前一直工作正常. 近半年来,却频繁出现连接数据库失败错误(一周1~2 ...

  6. c 连接mysql错误信息_使用C语言访问MySQL数据 —— 连接和错误处理

    2011-05-09 wcdj 可以通过许多不同的编程语言来访问MySQL,例如,C,C++,Java,Perl,Python,Tcl,PHP等.本文主要总结使用C语言接口如何访问MySQL数据. ( ...

  7. navicat远程连接mysql很慢_解决Navicat远程连接mysql很慢的方法

    ubuntu 下 /etc/mysql/mysql.conf.d [mysqld] skip-name-resolve  增加该字段即可 如果增加该字段,这无法使用本地ip进行登入, 登陆到MySql ...

  8. 远程连接mysql拒绝访问_远程连接 Mysql 失败的解决方法

    原标题:远程连接 Mysql 失败的解决方法 今天在虚拟机Ubuntu上折腾了一晚上mysql,然后试着用java连接,搞了很久都没成功,但是同学配好的Debian上却连接成功了,也就是说我的配置有问 ...

  9. JAVA线程池_并发队列工作笔记0002---认识线程池_在线程池中使用队列

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 上面是线程的执行周期 这个线程的生命周期,可以看到时间都浪费在了创建和销毁的这里了. 实际上执行业 ...

最新文章

  1. pandas数据预处理(字段筛选、query函数进行数据筛选、缺失值删除)、seaborn可视化分面图(facet)、seaborn使用Catplot可视化分面箱图(Faceted Boxplot)
  2. 监控Activity的启动等状态--- 源码级
  3. SAP GUI是如何启动本地安装的office word应用的
  4. Gigaset ME/pure/pro体验:就是这个德味
  5. FormView控件
  6. 如何在SQL Server中实现错误处理
  7. OA系统选型:选择好的工作流引擎
  8. 多线程(一) NSThread
  9. eNSP模拟器拓扑图:浮动路由的实际作用和分析,默认路由的配置,抓包分析
  10. C#调用存储过程,并且获得返回值和OutPut字符串
  11. tex 表格内容换行_如何让latex表格中一个单元格的文字换行
  12. Latex中PDF文档目录乱码解决方案
  13. CSS笔记(菜鸟教程)
  14. MySQL报Out of sort memory, consider increasing server sort buffer size的两种情况
  15. 【踩坑记录】导航时出现原地旋转,然后无法执行导航
  16. 2022.04.14【读书笔记】|WGCNA分析原理和数据挖掘技巧
  17. VUE实现华视身份证阅读器读取身份证信息(本文分两种情况,第一中是点击按钮读取信息,一种是自动读取信息)
  18. proble tip
  19. 基于Opencv-python人脸口罩检测(附完整代码)
  20. htcm7刷linux,htc one m7刷官方原版recovery的教程

热门文章

  1. MinkowskiEngine多GPU训练
  2. 客快物流大数据项目(十五):DockeFile常用命令
  3. Django 视图和模板1.4
  4. Docker核心技术之仓库
  5. C++ 获取当前时间的年,月,日,以及时分秒
  6. Python 的基本数据类型
  7. python 十进制转二进制,十进制转八进制,十进制转十六进制 的方法
  8. python raw_input 与 input 的区别
  9. Error: Invoke-customs are only supported starting with Android O (--min-api 26)
  10. 安卓中运行报错Error:Execution failed for task ':app:transformClassesWithDexForDebug'解决