try

Java基础方面

这一生的挚爱 提交于 2020-01-21 17:42:58
Java基础方面: 1 、作用域 public,private,protected, 以及不写时的区别 答: 区别如下: 作用域 当前类 同一package 子孙类 其他package public √ √ √ √ protected √ √ √ × friendly √ √ × × private √ × × × 不写时默认为friendly 2 、 Anonymous Inner Class ( 匿名内部类 ) 是否可以 extends( 继承 ) 其它类,是否可以 implements( 实现 )interface( 接口 ) 答: 匿名的内部类是没有名字的内部类。不能extends(继承) 其它类,但一个内部类可以作为一个接口,由另一个内部类实现 3 、 Static Nested Class 和 Inner Class 的不同 答: Nested Class (一般是C++的说法),Inner Class (一般是JAVA的说法)。Java内部类与C++嵌套类最大的不同就在于是否有指向外部的引用上。注: 静态内部类(Inner Class)意味着1创建一个static内部类的对象,不需要一个外部类对象,2不能从一个static内部类的一个对象访问一个外部类对象 4 、 & 和 && 的区别 答: &是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and) 5 、

C# 文件操作帮助类

末鹿安然 提交于 2020-01-21 15:17:00
  /// <summary>   /// 文件操作帮助类   /// </summary>   public class FileUtilHelper { #region 检测指定目录是否存在 /// <summary> /// 检测指定目录是否存在,如果存在则返回true。 /// </summary> /// <param name="directoryPath">目录的绝对路径</param> public static bool IsExistDirectory(string directoryPath) { return Directory.Exists(directoryPath); } #endregion #region 检测指定文件是否存在 /// <summary> /// 检测指定文件是否存在,如果存在则返回true。 /// </summary> /// <param name="filePath">文件的绝对路径</param> public static bool IsExistFile(string filePath) { return File.Exists(filePath); } #endregion #region 检测指定目录是否为空 /// <summary> /// 检测指定目录是否为空 /// </summary> ///

本地缓存google.guava及分布式缓存redis 随笔

人盡茶涼 提交于 2020-01-21 12:34:36
近期项目用到了缓存,我选用的是主流的google.guava作本地缓存,redis作分布式 缓存,先说说我对本地缓存和分布式缓存的理解吧,可能不太成熟的地方,大家指出,一起 学习.本地缓存的特点是速度快,不会受到网络阻塞的干扰,但由于是放在本地内存中,所 以容量较小,不能项目间共享比IO效率高比redis,且不会持久化.所以拿来存储一些数据 很少,但又经常执行的,甚至只要启动程序就会访问的数据. 我们可以自定义初始化本地缓存的方法,指定存储量和缓存淘汰机制. /** * 初始化本地缓存 */@PostConstructpublic void init() { commonCache = CacheBuilder.newBuilder() //设置缓存的 .initialCapacity(10) //设置缓存中最大可以存储的key数量,超过就会按照LRU的策略进行清除 .maximumSize(100).expireAfterWrite(60, TimeUnit.SECONDS).build();}几种常见的内存淘汰机制:LRU,LFULFU:根据数据的历史访问频率来淘汰数据LRU:根据访问时间的前后来淘汰数据,优先保留近期访问的数据guava是极度轻量级的cache,只具备基本的增删改查和刷新数据,淘汰数据等功能,但能满足大部分需求.redis作为常用的分布式缓存

JDBC连接池&DBUtils

夙愿已清 提交于 2020-01-21 08:19:42
JDBC 连接池 DBCP: Apache推出的 Database Connection Pool 使用步骤: > 添加 jar包 commons-dbcp-1.4.jar commons-pool-1.5.6.jar l 创建 DBCP连接池工具类 n 规范接口 :javax.sql.DataSource接口 n 实现类 :BasicDataSource, 重写接口中的方法 getConnection() 使用读取配置文件的方式 (加案例 ) DBCP中有一个工厂类 BasicDataSourceFactory 工厂类中有一个静态方法 static DataSource createDataSource(Properties prop) 此方法返回的就是 DataSource接口的实现类对象 BasicDataSource 创建 Propertis 集合 +IO技术读取配置文件 把配置文件传入 BasicDataSourceFactory静态方法 createDataSource中 public class DBCPUtilsReadConfig { private static DataSource dataSourse; static{ try { InputStream is = DBCPUtilsReadConfig.class.getClassLoader()

线程间通信

♀尐吖头ヾ 提交于 2020-01-21 05:42:24
   在我们使用多个线程来同时运行多个任务时,可以通过使用锁(互斥)来同步两个或多个任务的行为,从而使得一个任务不会干涉另一个任务使用的资源。   这个问题已经解决了,下一步是学习如何使任务彼此之间可以协作,以使得多个任务可以一起工作去解决某个问题。在这类问题中不可避免会碰到某些部分必须在其他部分被解决之前解决。在解决这类问题时,关键是多个任务之间如何“握手”,即通过何种方式来通知对方。在Java中有多种方式以及工具可以帮助我们实现这种“握手”。方式比较多,总结了一下,主要如下:    中断和检查中断机制    加入线程(Join)    互斥+信号(synchronized、ReentrantLock)    利用并发工具包中的构件(CountLatchDown、Cyclicbarrier)    共享内存变量(volatile)    管道(PipedWriter、PipedReader)    通过线程池的一个方法(awaitTermination方法) 1. 中断和检查中断机制    利用中断和加入线程(join)属于Thread提供的原生机制,用来实现线程之间的通信。   关于中断,Java中的线程是通过中断状态来标识,可以通过线程的实例方法interrupt()来设置(该方法内部会调用一个native方法interrupt0()进行设置)。中断状态只是一个状态

hutool工具依赖常用方法

匆匆过客 提交于 2020-01-21 04:13:03
1.Maven依赖 1、本文所采用的SpringBoot的版本如下 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.3.RELEASE</version> <relativePath/> </parent> 2、加入Redis相关依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> package com . oal . microservice . util ; import org . springframework . beans . factory . annotation . Autowired ; import org . springframework . data . redis . core . RedisTemplate ; import org . springframework . stereotype . Component ; import org .

Memcached、Redis OR Tair

痞子三分冷 提交于 2020-01-21 03:43:38
一、前言   非关系型数据库(NoSQL = Not Only SQL)的产品非常多,常见的有Memcached、Redis、MongoDB等优秀开源项目,相关概念和资料网上也非常丰富,不再重复描述,本文主要引入Memcached和Redis与淘宝开源Tair分布式存储进行对比测试,由于各自适用场景不同,且每个产品的可配置参数繁多, 涉及缓存策略、分布算法、序列化方式、数据压缩技术、通信方式、并发、超时等诸多方面因素,都会对测试结果产生影响 ,单纯的性能对比存在非常多的局限性和不合理性,所以不能作为任何评估依据,仅供参考,加深对各自产品的理解。以下是一些基本认识:   1、尽管 Memcached 和 Redis 都标识为Distribute,但从Server端本身而言它们并不提供分布式的解决方案,需要Client端实现一定的分布算法将数据存储到各个节点,从而实现分布式存储,两者都提供了Replication功能(Master-Slave)保障可靠性。   2、Tair 则本身包含 Config Server 和 Data Server 采用一致性哈希算法分布数据存储,由ConfigSever来管理所有数据节点,理论上服务器端节点的维护对前端应用不会产生任何影响,同时数据能按指定复制到不同的DataServer保障可靠性,从Cluster角度来看属于一个整体Solution

JDBC

情到浓时终转凉″ 提交于 2020-01-20 17:16:53
和 Statement一样,PreparedStatement也是用来执行sql语句的 与创建Statement不同的是,需要根据sql语句创建PreparedStatement 除此之外,还能够通过设置参数,指定相应的值,而不是Statement那样使用字符串拼接 注: 这是JAVA里唯二的基1的地方,另一个是查询语句中的ResultSet也是基1的。 package jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; public class TestJDBC { public static void main(String[] args) { try { Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e) { e.printStackTrace(); } String sql = "insert into hero values(null,?,?,?)"; try (Connection c = DriverManager.getConnection("jdbc:mysql:

终于有人把“TCC分布式事务”实现原理讲明白了

*爱你&永不变心* 提交于 2020-01-20 03:24:49
之前网上看到很多写分布式事务的文章,不过大多都是将分布式事务各种技术方案简单介绍一下。很多朋友看了还是不知道分布式事务到底怎么回事,在项目里到底如何使用。 所以这篇文章,就用大白话+手工绘图,并结合一个电商系统的案例实践,来给大家讲清楚到底什么是 TCC 分布式事务 一、业务场景介绍 咱们先来看看业务场景,假设你现在有一个电商系统,里面有一个支付订单的场景。 那对一个订单支付之后,我们需要做下面的步骤: 更改订单的状态为“已支付” 扣减商品库存 给会员增加积分 创建销售出库单通知仓库发货 这是一系列比较真实的步骤,无论大家有没有做过电商系统,应该都能理解。 二、进一步思考 好,业务场景有了,现在我们要更进一步,实现一个 TCC 分布式事务的效果。 什么意思呢?也就是说,[1] 订单服务-修改订单状态,[2] 库存服务-扣减库存,[3] 积分服务-增加积分,[4] 仓储服务-创建销售出库单。 上述这几个步骤,要么一起成功,要么一起失败,必须是一个整体性的事务。 举个例子,现在订单的状态都修改为“已支付”了,结果库存服务扣减库存失败。那个商品的库存原来是 100 件,现在卖掉了 2 件,本来应该是 98 件了。 结果呢?由于库存服务操作数据库异常,导致库存数量还是 100。这不是在坑人么,当然不能允许这种情况发生了! 但是如果你不用 TCC 分布式事务方案的话,就用个 Spring

HBase Java API使用(一)

白昼怎懂夜的黑 提交于 2020-01-20 03:19:02
前言 1. 创建表:(由master完成) 首先需要获取master地址(master启动时会将地址告诉zookeeper)因而客户端首先会访问zookeeper获取master的地址 client和master通信,然后有master来创建表( 包括表的列簇,是否 cache ,设置存储的最大版本数,是否压缩等 )。 2. 读写删除数据 client与regionserver通信,读写、删除数据 写入和删除数据时讲数据打上不同的标志append,真正的数据删除操作在compact时发生 3. 版本信息    API基础知识 CRUD操作:   put:插入单行或者多行   get: 读取数据或者使用scan()   delete:删除数据   batch(): 批量处理操作 scan:   类似于数据库中的游标cursor HTable常用方法:   void close(): 用完一个HTable实例后需要调用一次close(),(这个方法会隐式的调用flushCache方法)   byte[] getTableName() 获取表名   Configuration getConfiguration(): 获取HTable实例中的配置   HTableDescriptor getTableDescriptor(): 获取表的结构   static boolean