## 数据源 ##

#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. 量化投资_TB交易开拓者A函数和Q函数常见组合应用

    1 在交易开拓者当中,关于交易的做单方式一般分为:图表函数和A函数两类. 两类的主要区别为:如果采用图表函数的话,所有的交易内容都是以图表上面的信号为准,当前仓位运行的实际状态是没有的,但是可以显示交 ...

  2. Python的lambda学习

    lambda可以简化简单循环,如下: def fc1(x): return x + 10 print "fc1(23) = ", fc1(23) y = lambda x: x+1 ...

  3. Box and Ball

    题目描述 We have N boxes, numbered 1 through N. At first, box 1 contains one red ball, and each of the o ...

  4. 5.redis主从配置

    Redis的主从复制 1.什么是主从复制 持久化保证了即使redis服务重启也不会丢失数据,因为redis服务重启后会将硬盘上持久化的数据恢复到内存中,但是当redis服务器的硬盘损坏了可能会导致数据 ...

  5. MOOC(9)- 登录接口返回的cookie中有多个token

  6. 作业:for循环,迭代法和穷举法

                                                    for()循环 四要素:初始条件,循环条件,状态改变,循环体. 执行过程:初始条件--循环条件--循环体 ...

  7. Android 7.0终极开发者预览版全攻略!

    近日,Google的工程部副总裁Dave Burke在官方博客上正式发布开发者预览版5,此预览版是android 7.0 “牛轧糖”正式发布前最后一个预览版,同时也是在性能.功能上等多方面的表现上最接 ...

  8. 图形学创世纪——写在SIGGRAPH 40年的边上

    40年的边上" title="图形学创世纪--写在SIGGRAPH 40年的边上"> 前言: SIGGRAPH是由ACM SIGGRAPH(美国计算机协会计算机图形 ...

  9. [LC] 252. Meeting Rooms

    Given an array of meeting time intervals consisting of start and end times [[s1,e1],[s2,e2],...] (si ...

  10. 从NIPS2014大会看机器学习新趋势

    微软杰出科学家 John Platt 本文译自:Machine Learning Trends fromNIPS 2014 编者按:John Platt是微软的杰出科学家,也是微软在机器学习领域的领军 ...