spring boot动态修改es的连接地址

spring boot动态修改es的连接地址,第1张

在项目启动后,使用修改配置文件+restart()连接/连接池对象的方法解决。

使用读写锁,给restart()、setUrl()等代码块加写锁,给数据库 *** 作方法加读锁。这样就可以在修改数据库连接信息时,先获取写锁,保证数据库 *** 作方法不能执行。而在不修改连接时,数据库 *** 作方法之间获取的是读锁,不会影响线程彼此之间的 *** 作。

一 IOC容器概述

ioc类型:构造注入 属性注入 接口注入

类装载步骤:装载 验证  准备  解析  初始化 使用 卸载

classLoader:根加载器(bootstrap)  扩展加载器(ext)  系统加载器(app) 采用全盘负责委托机制

反射:可以从class对象获取构造函数 成员变量 方法三个主要反射类 

资源访问利器Resource:FileSystemResource  ClassPathResource ServletContextResource

BeanFactory ApplicationContext:beanFactory为ioc容器 spring框架的基础设施 面向spring,常用XmlBeanFactory ,applicationContext为应用上下文,面向开发者,主要实现类有classpathXmlApplicationContext  fileSystemXmlApplicationContext,区别:beanFactory 在第一次调用才初始化,而applicationContext是在容器启动初始化上下文即初始化bean

WebapplicationContext:两种初始化方法 orgspringframeworkwebcontextContextLoaderListener和orgspringframeworkwebcontextContextLoaderServlet

Bean生命周期:获取bean 初始化 设置属性 卸载

二 IOC中装配Bean

变量前两个字母要么全部大写,要么全部小写,eg:isBatch IDCard

依赖注入:属性注入、构造注入、工厂方法注入

Bean间关系:继承(parent),依赖(depends-on),引用(idref)

Bean的作用域:singleton prototype request session globalSession

基于注解启动spring容器:ApplicationContext ct = new AnnotationConfigApplicationContext(); ctregiste(Configclass); ctrefresh();

三 Spring高级

Bean创建过程:

    1ResourceLoader 加载配置文件,生成对应的 Resource

    2BeanDefinitionReader读取并解析resource,生成对应的 BeanDefinition ,并注册到BeanDefinitionRegister中,

    3spring扫描BeanDefinitionRegister读取BeanDeifnition,如果bean实现工厂后处理器(BeanFactoryPostProcessor),对beanDefinition进行处理

    4使用InstantiationStrategy初始化Bean,相当于new

    5使用BeanWarpper对bean进行封装,完成bean属性设置工作

    6利用容器中注册的bean后处理器(实现BeanPostProcessor接口),对bean进行后续加工

使用外部文件:使用<context:property-placeholder location=""/> 注file-encoding="utf8",使用${属性名}引用属性值

加密外部文件:1继承PropertyPlaceholderConfigurer 重写convertProperty(String propertyName,String propertyValue)方法,2通过传统配置方式引入配置文件 <bean class="" p:location=""/>

国际化信息

本地化格式工具:DateFormat  NumberFormat  MessageFormat MessageSource

四 Spring Aop

基础知识:

    jdk动态代理:1实现InvocationHandler 在invoke方法定义横切逻辑,通过反射调用目标类方法

                           2通过ProxynewProxyInstance() 为目标对象创建代理

    cglib动态代理:采用底层字节码技术,为类创建子类,在子类拦截所有调用父类方法的调用,性能优于jdk代理

                            1实现MethodInteceptor 在inteceptor方法定义横切逻辑

                            2通过字节码创建子类代理类

增强类型:前置 后置 异常 最终 环绕 引介,引介:为目标类创建新的方法或实现,类级别

五 基于@AspectJ和Schema的spring aop

注解:

通配符: 匹配任意字符 只能匹配上下文的一个元素

                匹配任意字符 匹配多个元素 

                + 表示类型匹配的所有类 包括子类

切点函数:@annotation(注解) 表示标识注解的所有方法

                    @execution( combaobaotaoWaiter+()) 表示匹配Waiter 及子类的所有方法,第一个表示返回类型

                    args() 针对方法签名的 入参接受指定的类

                    @args() 入参接受指定注解

                    within() 同execetion()

                    target(M) 目标类匹配M

    @AspectJ进阶:命名切点,切点可以作为类似变量定义、引入

                            连接点对象,JoinPoint ProceedingJoinPoint(环绕增强) 

                            绑定连接点方法入参,通过args绑定

                            绑定代理对象,通过this

                            绑定类注解对象 通过within()或 target()

                            绑定返回值,通过returning

                            绑定抛出的异常,通过throwing

aop方式有四种:@AspectJ  <aop:aspect> Advisor <aop:advisor> 下面是对比

六 Spring对Dao的支持

DBCP数据源:BasicDataSource

    initialSize 默认0 初始化连接数  

    maxActive  8  最大活动链接

    maxIdle 8 最大空闲链接

    ValidationQuery sql查询语句 mysql:select 1  oracle : select 1 from dual

    testOnBorrow true  是否从池中取出链接前检查

    testWhileIdle  false  空闲链接是否被回收

    testBetweenEvictionRunsMillis -1  空闲链接回收期运行周期

    推荐testOnBorrow false,testWhileIdle true  testBetweenEvictionRunsMillis一个合适值

C3P0数据源:ComboPooledDataSource 

    acquireIncrement 链接用完时 c3p0一次性创建的数目

    initailPoolSize 初始化创建的数目 

    minPoolSize 连接池最小连接数  反之maxPoolSize 

    maxIdleTime 0 最大空闲时间,超时被丢弃 0为永不丢弃

七 Spring事务管理

事务特性:原子性 一致性 隔离性 持久性

读未提交:会脏读 不可重复读 幻读

读已提交(READ COMMITED):会不可重复读(两次读取同一记录 结果不一样) 幻读

可重复读(REPEATALBE READ):会幻读(一个事务 第一次读取到10条记录 第二次读取11条记录)

序列化(SERIALIABLE):读加共享锁 写加排它锁

ThreadLocal   原理:ThreadLocalMap  方法set(T t)  get()  remove()  initialValue()

事务传播行为:REQUIRED 如果没有事务则新建,有事务则加入                

                REQUIRES_NEW 新建事务 如果当前有事务则将其挂起

                SUPPORTS 支持当前事务,如果没事务则以无事务运行

                NOT_SUPPROTED 以非事务方式执行 如果当前有事务则挂起

                NEVER 以非事务运行 如果当前有事务 则抛出异常

                NESTED 如果没有事务,就新建事务,如果有,嵌套当前事务

使用XML配置声明式事务 

基于注解配置声明式事务

spring的事务处理主要是依靠AOP实现的,这个没什么好说的随便搜索一下,网上很多示例。

隔离级别是针对并发事务而言的,单个事务的处理很简单不多说。并发事务的处理则比较复杂,因为往往一条数据是跨事务的,这会造成许多不可预知的后果。

一般来说,系统执行并发事务时,会把当前在执行的事务独立起来,也就是和其他事务进行隔离。好像系统中只有这一个事务,其他事务不存在一样。这也就是完全隔离,即系统中只运行单位时间内,最多只有一个事务在执行,其他事务要等到该事务执行完毕之后才能执行,这在现实中基本是不可行的,比如,你要更新你的QQ用户信息,那么就是说,在你更新的这段时间内,其他的用户是无法更新他的用户信息的。

举个深动的例子,把事务比作一条在公路上奔跑的汽车,完全隔离,就像是,在汽车从公路一头到另一头这段时间内,公路上不允许有其他的汽车,这样做当然可以完全避免车祸,也就是数据跨事务带来的隐患风险,但是带来了巨大的效率问题,那么如果同时在公路上让多辆汽车行驶会造成什么情况呢。

具体来说有一下几种:

更新丢失(Lost Update):两个事务都企图去更新一行数据,导致事务抛出异常退出,两个事务的更新都白费了。

脏数据(Dirty Read):如果第二个应用程序使用了第一个应用程序修改过的数据,而这个数据处于未提交状态,这时就会发生脏读。第一个应用程序随后可能会请求回滚被修改的数据,从而导致第二个事务使用的数据被损坏,即所谓的“变脏”。

不可重读(Unrepeatable Read):一个事务两次读同一行数据,可是这两次读到的数据不一样,就叫不可重读。如果一个事务在提交数据之前,另一个事务可以修改和删除这些数据,就会发生不可重读。

幻读(Phantom Read):一个事务执行了两次查询,发现第二次查询结果比第一次查询多出了一行,这可能是因为另一个事务在这两次查询之间插入了新行。

以上就是并行事务处理时常遇到的大致问题。针对这些问题,提出了几个不同的事务隔离级别,适应特定的环境需要。

具体是:

读 *** 作未提交(Read Uncommitted):说明一个事务在提交前,其变化对于其他事务来说是可见的。这样脏读、不可重读和幻读都是允许的。当一个事务已经写入一行数据但未提交,其他事务都不能再写入此行数据;但是,任何事务都可以读任何数据。这个隔离级别使用排写锁实现。

读 *** 作已提交(Read Committed):读取未提交的数据是不允许的,它使用临时的共读锁和排写锁实现。这种隔离级别不允许脏读,但不可重读和幻读是允许的。

可重读(Repeatable Read):说明事务保证能够再次读取相同的数据而不会失败。此隔离级别不允许脏读和不可重读,但幻读会出现。

可串行化(Serializable):提供最严格的事务隔离。这个隔离级别不允许事务并行执行,只允许串行执行。这样,脏读、不可重读或幻读都可发生。

打补丁。

springboot避免sqlserver死锁的话,一是可以把定时任务拆分出来,单独作为一个项目跑,二就是打补丁,这种方法是最常用的。

以上就是关于spring boot动态修改es的连接地址全部的内容,包括:spring boot动态修改es的连接地址、深入理解spring、spring事务隔离级别与数据库的不一致怎么办等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9390950.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存