## 数据源 ##

#Tomcat封装的DBCP;

>> 基本知识;
tomcat在默认情况下已经集成了DBCP;

>> JNDI;
|-- 基本概念;
在tomcat启动的时候会根据用户的要求创建好
数据源,并根据名字将数据源绑定;它内部维护一个
Map集合,Key是一个由路径和名字构成的字符串,Value是
绑定的数据源对象;
<-??->什么是数据源;
|-- 优势;
提高获取连接的效率;

>> 基本开发步骤;
|-- 将数据库需要的驱动jar包放到lib目录下;
|-- 将登录需要的用户名和密码的XML配置文件放到META-INF目录下;
|-- 位置;
> doc --> JNDI --> Confige context...>

|-- 启动tomcat;
|-- 特别注意;
> 对于数据源的测试不要放到main方法当中测试;

## 元数据 ##

# 基本概念;
数据库,表,列等定义的信息;
简单来说就是对于Java来说,用于描述数据库的信息;

# 基本操作;

>> 基本方法接口 --- Connection

Connection.getMetaData()获取关于数据库的整体综合信息。

DataBaseMetaData 元数据对象

getURL():返回一个String类对象,代表数据库的URL。

getUserName():返回连接当前数据库管理系统的用户名。

getDatabaseProductName():返回数据库的产品名称。(告诉habuneite方言是什么)

getDatabaseProductVersion():返回数据库的版本号。

getDriverName():返回驱动驱动程序的名称。

getDriverVersion():返回驱动程序的版本号。

isReadOnly():返回一个boolean值,指示数据库是否只允许读操作。

>> 具体Demo --- 参见MetaDateTest.java

# 实际应用;
因为可以通过获取元数据方式,获取到数据库中对应的列名;
由此可以和domain中UserBean对应的属性相对应;
由此可以简化DAO层中的CRUD操作;

## 自定义框架 ##

# ORM 对象关系映射;

>> Object; JavaBean对象;
>> Relation:关系型数据库;
>> Mapping;映射(存储应对关系);

## DBUtils ##

# 基本使用;
>> 导包;
>> 定义DAO接口及实现类;
>> 直接获取QuerRunner对象便可以直接使用;

## 实际开发中的事物控制 ##

# 案例 --- 转账;

>> 基本步骤;
|-- DAO层中建立转账方法;
|-- DAO实现类中实现具体的转账方法;
|-- 具体分析;
> 源账户数据减少;
> 目标账户数据增加;

> 更新 update;
> 问题 --- 如何获取连接;
|-- QueryRunner支持无参构造;
|-- update支持重载方法中,在执行中放入链接;
> 两个update是否需要同一个链接;

> 提交事务;
|-- 如果出现异常需要进行回滚;

|-- 测试事务是否保持;
|-- 修改Client类;// 这是一个测试类,测试main方法在当中;

|-- 问题 --- DAO层中出现了业务逻辑代码;
|-- 建立一个Service类;
> 改写DAO层;
|-- 根据账户名查询得到一个账户;
|-- 根据账户名更新账户的金额;

|-- 在Service实现类中完成业务逻辑代码;
|-- 根据账户名得到账户对象;
|-- 调用DAO中方法;

|-- 根据目标对象名,得到一个目标账户;
|-- 调用DAO中方法;

|-- 更新余额;
|-- 调用对象中的方法,源账户减少,目标账户增加;

|-- 问题:链接不确定;--- 无法确保查询和更新使用的链接是同一个;
|-- 解决方案:
> 在DAO的实现类中建立一个链接;
> 通过构造参数接收一个链接;

|-- 将数据封装到表中;

> 问题 : 如何开启事务;
|-- 该怎么开怎么开;

> 处理异常;
> 提交事务;

|-- 将setAutoCommit(true); 放到finally当中
<-??-> 这是啥?

|-- 进行测试,看事务状态是否能够保持住;
|-- 临时问题:
在回滚操作时,捕获的异常应该是Exception;

|-- 最终问题:
|-- Connection作为数据库连接应该出现在DAO中,
如果connection不存在,开启事务的代码应该不执行;
所以开启事务的代码不能放在业务层;

|-- 结论:开启事务的逻辑代码不应该放在业务层;

|-- 重新建立一个工程;
|-- 修改Service实现类;
|-- 将提交事务相关的方法都删除;

|-- 问题:事务应该放在哪一层?
|-- 解决方案;
> 参见新知识点;ThreadLocal

> 推论:
因为两次调用find方法和update方法
都在main开启的主线程当中,
所以可以考虑将它们全部封入一个
ThreadLocal线程当中,然后再将
Connection放入,好像可以解决问题...
<-??-> 我还是不知道事务应该放在哪一层;

> 去掉DAO实现类当中的con;

> 分离事务控制代码,专门用一个类来进行事务的处理;
|-- 传说中的"方面代码";专注于处理某个方面的代码;
|-- 建立一个获取Connection的方法;
|-- 比较重要的部分,如果没有链接后面的方法都无法工作;
|-- 详细分析;
> 问题 --- 已经有连接池了,为何还需要自己获取链接?
|-- 为了保证获取到的链接的一致性;

> 引入ThreadLocal ;//用于放入Connection,并保证使用的是唯一的Connection
> 从线程局部变量中取出一个connection;
> 从连接池中取出一个链接;
> 将线程池中的链接放入线程局部变量;

|-- 建立一个开启事务的方法;
|-- 获取链接;
|-- 开启事务;

|-- 建立一个提交事务的方法;
|-- 获取链接;
|-- 提交事务;

|-- 建立一个回滚的方法;
|-- 获取链接;
|-- 回滚;

|-- 更新Service类;
>> 在第一行调用事务类的开启事务功能;

|-- 对DAO的实现类进行修改;
>> 修改对应的获取事务和链接的部分;

|-- 问题 --- 虽然进行了独立封装,但控制事务的代码依然放在业务层当中;
|-- 分析解决方案;
|-- 新建一个工程;

|-- 最终版本;
>> 分析;
|-- 新建一个BeanFactory类;
|-- 提供一个方法,返回一个AccountService对象;
|-- AOP 新知识点;(面向切面/方面编程)
> 基本概念;
将事物的某个方面的功能代码抽取出来,
进行集中实现,当系统需要用到该功能的时候,
重新将方面代码加入到系统当中;
忽略了原有继承体系的纵向结构,可以在需要的时候
横向插入关键代码;

> 实现原理;
如何完成将代码实现横向织入;
|-- 动态代理;

> 适用场景;
|-- 事务控制;
|-- 日志控制;
|-- 权限集中管理;
|-- 积分功能;

|-- 实现动态代理;
|-- Proxy.newProxyInstance(loader,interface,h){

}
|-- loader --- 需要代理的类加载器;
|-- interface --- 类所实现的接口;
|-- h
> 代理类自己的实现方法,实质上是一个
匿名内部类;

|-- 进行判断,如果方法名为需要代理的方法;
|-- 需要保证原有方法能够执行;
|-- 横向加入事务开启的方法;
|-- 进行事务的常规处理;

|-- 改写Client类;
|-- 在创建对象时不再使用new,而是使用BeanFactory的方法;

## ThreadLocal ##

# 基本概念;
内部维护一个Map集合,Key是当前线程对象,Value是一个Object对象;
由于一个线程中的值只能有当前线程能够获取;

# 基本操作方式;
>> set(Object value);
|-- 解释;
之所以只需要传入Value就可以使用,
是因为key默认的是当前线程对象,所以只需要传入
对应的value就可以设置当前线程对象的值;
>> remove();
>> get();

# 使用测试;
>> 建立一个main的测试类;
|-- 因为main默认开启了一个主线程;

>> 建立一个ThreadLocal对象;
|-- 简单测试;
> 自己放入一个值,可以自己进行获取;

>> 建立一个子线程;
|-- 通过构造方法,从父类接收一个ThreadLocal对象;
|-- 测试是否无法让其他对象访问该线程;
|-- 通过子线程调用get方法去获取main线程当中存入的值,看是否能够成功输出;

TOMCAT封装DBCP的更多相关文章

  1. JDBC数据源连接池(3)---Tomcat集成DBCP

    此文续<JDBC数据源连接池(2)---C3P0>. Apache Tomcat作为一款JavaWeb服务器,内置了DBCP数据源连接池.在使用中,只要进行相应配置即可. 首先,确保Web ...

  2. 开源数据库连接池之Tomcat内置连接池

    本篇介绍几种开源数据库连接池,同时重点讲述如何使用Tomcat服务器内置的数据库连接池. 之前的博客已经重点讲述了使用数据库连接池的好处,即是将多次创建连接转变为一次创建而使用长连接模式.这样能减少数 ...

  3. Java数据库连接池比较(c3p0,dbcp,proxool和BoneCP)

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp21 Java框架数据库连接池比较(c3p0,dbcp和proxool,Bo ...

  4. Tomcat组成与工作原理

    laosijikaichele 关注  0.2 2018.06.02 10:44 字数 5175 阅读 2798评论 0喜欢 8 原文:https://juejin.im/post/58eb5fdda ...

  5. Tomcat配置连接池

    Tomcat配置DBCP连接池 配置tomcat服务器的时候,使用到jndi;通过Context配置文件实现配置池对象,通过new initialConext()对象的lookup()获取到数据池对象 ...

  6. 【Tomcat】Tomcat 原理架构(一)

    Tomcat是什么 开源的 Java Web 应用服务器,实现了 Java EE(Java Platform Enterprise Edition)的部 分技术规范,比如 Java Servlet.J ...

  7. 精尽Spring Boot源码分析 - 内嵌Tomcat容器的实现

    该系列文章是笔者在学习 Spring Boot 过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring Boot 源码分析 GitHub 地址 进行阅读 Sprin ...

  8. 深入刨析tomcat 之---第23篇 聊一下web容器的filter配置和defaultservet

    writedby 张艳涛,在一个webapp应用程序内如何配置filter? <?xml version="1.0" encoding="ISO-8859-1&qu ...

  9. Tomcat 组成与工作原理

    开源的 Java Web 应用服务器,实现了 Java EE(Java Platform Enterprise Edition)的部分技术规范,比如 Java Servlet.Java Server ...

随机推荐

  1. 892B. Wrath#愤怒的连环杀人事件(cin/cout的加速)

    题目出处:http://codeforces.com/problemset/problem/892/B 题目大意:一队人同时举刀捅死前面一些人后还活着几个 #include<iostream&g ...

  2. [HNOI2019]JOJO(KMP自动机+主席树)

    一道神仙题,考察选手对KMP的深入理解. 先考虑没有2操作的做法.设每一段为一个二元组(x,c),考虑一段前缀匹配后缀,除了第一段的字符,其他段的二元组(x,c)必须相等,所以可以将其视为特殊字符进行 ...

  3. vue项目打包部署elementUI的字体图标丢失问题

    自己搭建的Vue项目,没有使用vue-cli,引入elementUI时,使用的是webpack直接打包工具,发现字体图标丢失你 记录一下解决办法: webpack module配置:(build目录下 ...

  4. window下如何通过ssh从服务端copy数据文件

    通过cygwin在WINDOWS系统上安装SSH服务 并使用scp命令进行上传和下载文件.按照步骤参考如下 https://jingyan.baidu.com/article/08b6a591a504 ...

  5. Python数据分析与展示第0&1周学习笔记(北理工 嵩天)

    一前奏 1..Python语言开发工具选择 IDLE:自带默认常用入门级 PyCharm:简单.集成度高 Anaconda:awesome IDE较为简单,不做详细记录. 二.表示 1.numpy库入 ...

  6. SpringMVC插件安装、环境配置及快速入门_学习笔记

    SpringMVC 是现在广泛应用的框架结构,我也只是一个初学者,一遍学习一遍梳理整合,如有错误,希望大神指点,别误人. MVC :Model-View-Control 框架性质的C 层要完成的主要工 ...

  7. 一个简单的jQuery回调函数例子

    jQuery回调函数简单使用 比如说,我们想要点击某个按钮后触发事件, 先把一些指定内容给隐藏掉, 然后跳出相关信息的对话框. 如果使用普通的方法, 不用回调函数的话, 会有怎么样的效果呢? 效果是先 ...

  8. PAT甲级——1027 Colors in Mars

    1027 Colors in Mars People in Mars represent the colors in their computers in a similar way as the E ...

  9. VisualStudioAddIn2017.vsix的下载安装和使用

    本加载项是用于Visual Studio的,下载以后按照如下步骤进行安装: 完全退出Visual Studio 把下载了的文件解压缩,会产生一个VisualStudioAddIn2017.vsix文件 ...

  10. 关于mysql的符合主键的定义和解释

    DROP TABLE IF EXISTS `v9_vote_data`;CREATE TABLE `v9_vote_data` (  `userid` mediumint(8) unsigned DE ...