- 博客(38)
- 资源 (5)
- 收藏
- 关注
原创 idea-遇到的问题
1 如图报的错误,其实是因为没有设置jdk的原因。 解决方法:右键 Project Structure-Project-Project SDK 2 有时候从git中clone下来的代码提示不是maven项目 解决方法:Maven Projects-“+”号引入项目即可。 3 启动配置maven run-Edit Configuration-“+”号-搜索maven ...
2018-04-24 17:57:29
176
原创 java8新特性-日期、时间
下面仅列举常用的日期、时间,像不常用的时区、历法什么的就没弄了。public class TimeTest extends BaseTest { @Test public void dateTest() { //日期 //各种静态方法都可以获取 //LocalDate date = LocalDate.of(2018, 4, ...
2018-04-11 14:29:48
296
原创 java8新特性-CompletableFuture
想必大家都用过Future,那么CompletableFuture在Future基础上又加了什么方法呢?public class CompletableFutureTest extends BaseTest { @Test public void futureTest() { //这是一个很简单的使用future的例子 Execu...
2018-04-11 13:44:51
243
原创 java8新特性-默认方法
这里的默认方法指的是接口中的默认方法。 那么接口可以写方法有什么好处呢? 1 当有新需求需要添加方法时,那么需要将接口的实现类的所有方法都要加上这个方法,有了默认方法就可以不动实现类,只需要在接口中增加默认方法就可以搞定。 2 不需要每个实现类都需要实现该方法,同抽象方法。 3 可实现类似多继承的模式。 java8自带的很多接口都有默认方法,来个List接口的默认方法:并行分割器de...
2018-04-10 17:45:01
134
原创 java8新特性-流
流是Java API的新成员,它允许你以声明性方式处理数据集合(通过查询语句来表达,而不是临时编写一个实现)。就现在来说,你可以把它们看成遍历数据集的高级迭代器。此外,流还可以透明地并行处理,你无需写任何多线程代码了。 通过parallelStream或者parallel(内部调用join/fork)就能实现并行操作,需要注意的是线程安全问题及合适的方式采用并行。当然并不是所有并行性能就会...
2018-04-10 11:04:57
253
原创 java8新特性-lambda表达式
java10都要来了,才才才说java8新特性?好吧,大神,再见,这不是写给你看的 -_-! 为什么要要使用lambda表达式? lambda表达式能以简洁的代码代替复杂、啰嗦的代码,也更易阅读! 最后也附上简单的性能测试,总体上数量越大,lambda性能越好,可能不同的业务逻辑及方法都不会一样,仅供参考! 没有理论,上来就撸代码!public class LambdaTest e...
2018-04-09 15:53:16
158
原创 JVM-tomcat异常报错
启动tomcat 的时候,某一时刻突然 崩掉,bin文件夹中多了hs_err_pid217456.log日志文件。# There is insufficient memory for the Java Runtime Environment to continue.# Native memory allocation (malloc) failed to allocate 32744 b...
2018-04-08 18:58:11
604
原创 spring-bean生命周期
DefaultListableBeanFactory bean工厂类 1 doGetBean 2 transformedBeanName 获取beanname(过滤&和别名替换) 3 getSingleton 从单例缓存中获取实例 这里涉及到循环依赖问题 4 getParentBeanFactory 获取父bean工厂类 这里将name还原 5 markBeanAsCreated...
2018-02-10 23:18:47
95
转载 java 并发包 -synchronized
首先先说明一点的是 synchronized并不是并发包里的,因为synchronized也用于高并发的情况,所以放到这里介绍。 synchronized 是可以方法、代码块的锁,同时只能由一个线程进行占有,并且使得变量具有内存可见性。怎么用就不多说了,大家都会用。但是synchronized的原理,就不一定都知道了。 synchronized 分为 1 偏向锁 2 轻量级锁 3
2017-12-19 13:24:28
1090
原创 java 并发包-AbstractQueuedSynchronizer
简介AbstractQueuedSynchronizer 就是我们常说的AQS-同步器。常用的有ReentrantLock、ReadWriteLock、CountDownLatch,内部实现都依赖AQS类,可以说AQS是实现同比必备良药。源码分析AQS的主要参数 state字段 表示同步的状态,需要通过传入值与state进行比较是否一致。CountDownLatch就是通过sta
2017-12-19 12:18:30
170
原创 java 并发包-Unsafe
Unsafe 不安全类,在并发包中使用的非常频繁,那么它究竟有什么作用呢? Unsafe类在提升Java运行效率,增强Java语言底层操作能力方面起了很大的作用。 先来看下它是怎么使用的,下面代码摘自AQS 通过下面的代码,看起来操作不难//初始化 直接通过静态方式获取 private static final Unsafe unsafe = Unsafe.getUnsafe(); //各
2017-12-19 12:17:39
599
原创 Java IO-BufferedReader
BufferedReader和BufferedInputStream 类似,只是前者存储的字符并且实现的是Reader,后者存储的字节并且实现的是InputStream 。//缓冲数组 private char cb[]; //分别表示 cb总个数和下一个读取位置 private int nChars, nextChar; //缓冲数组默认大小 private static in
2017-12-17 20:31:25
143
原创 Java IO-BufferedInputStream
BufferedInputStream 是一个带有缓冲区的输入流。缓冲区你可以理解为缓存,就像我们从数据库中读数据和从缓存中读数据同样的道理,目的都是为了能够加快读取速度。 本篇只关注如下图红框的部分 //默认缓冲区大小为8192个字节 即8k private static int DEFAULT_BUFFER_SIZE = 8192; //缓冲区最大大小 超出将报OutOfMemoryEr
2017-12-17 16:39:12
233
原创 Java IO
输入流和输出流 分别对应的InputStream(字节)、Reader(字符)和OutputStream(字节)、Writer(字符);站在cpu的角度去看,input就是从外面到CPU,output就是从CPU到外面。 下面针对上述四类的一个子类分布图 当然 File也是io包中一个针对磁盘文件的对象,可以对文件或者文件夹增删改查。上述基本包含了java.io 包中的大部分类了,还有我
2017-12-17 12:01:22
142
原创 Java IO: 管道
通过管道 PipedInputStream和PipedOutputStream 可以实现不同线程之间的数据传输,使用很简单,先来看下简单的例子:@Test public void pipeTest() throws IOException, InterruptedException { PipedOutputStream outputStream = new PipedO
2017-12-17 00:04:06
133
原创 java 并发工具包 BlockingQueue-PriorityBlockingQueue
简介PriorityBlockingQueue :优先级阻塞队列,即已谁优先谁先出的模式。 既然具有优先级,那么必然元素需要实现Comparable
2017-12-02 17:07:56
198
原创 java 并发工具包 BlockingQueue-LinkedBlockingQueue
简介LinkedBlockingQueue 字义为链式阻塞队列,既然是链式,那么内部肯定以链接结构存储了,相比ArrayBlockingQueue,可以是一个无界队列,但是性能比之要差。初始化 public LinkedBlockingQueue() { this(Integer.MAX_VALUE); } public LinkedBlocki
2017-12-02 12:06:31
134
原创 Java 并发工具包-BlockingQueue-DelayQueue
DelayQueue 延时队列,延时一段时间后执行的队列,根据这个特性,可以应用在 1 缓存的生成及自动过期删除 2 任务超时处理 … 其存储元素必须继承实现Delayed接口public interface Delayed extends ComparableDelayed> { long getDelay(TimeUnit unit);}可见 我们需要实现两个方法
2017-12-02 12:06:04
229
原创 java 并发工具包 BlockingQueue-ArrayBlockingQueue
简介ArrayBlockingQueue 字义理解就是 : 数组阻塞队列;看名字就很好理解,哈哈!! ArrayBlockingQueue 是有界队列,意思是队列个数不能超出某个数,超出入队阻塞,初始化就需要定义好个数,不能自动扩增或者修改。 上源码:初始化//初始化,定义临界值及是否公平两参数与 public ArrayBlockingQueue(int capacity,
2017-12-02 12:05:23
178
原创 java 并发工具包 BlockingQueue
简介BlockingQueue 是一个接口,字义上理解表示为一个阻塞队列 1 生产者入队 2 消费者出队 BlockingQueue 具有 4 组不同的方法用于插入、移除以及对队列中的元素进行检查。如果请求的操作不能得到立即执行的话,每个方法的表现也不同。这些方法如下: 抛异常 特定值 阻塞 超时 四组不同的行为方式解释: 抛异常:如果试图的操作无法立即执行,抛一个异
2017-12-02 12:04:41
209
原创 zookeeper(二) 数据发布与订阅(配置中心)
首先需要引用 zookeeper <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.4.6</version> </dependency>1 ZkServi
2017-09-05 22:33:44
508
原创 zookeeper (一)
最近在学习dubbo的时候,其中提到了zookeeper!所以也学习下zookeeper!!概念性的就不记了。zookeeper的几个应用场景 1 数据发布与订阅(配置中心) 通过zookeeper的监控watcher,当存储数据发生变化时,便会通知订阅的客户端,从而达到数据更新的目的。 2 配置信息存储 zookeeper 不是专门存储数据的,所以不适用大数据的存储,一般只存储1m一下的数
2017-09-03 17:16:07
268
原创 shiro-spring 结合的配置问题
shiro可以开启权限注解功能 <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor" /> <!-- 开启Shiro注解 --> <bean class="org.springframework.aop.framework.autoproxy
2017-08-29 13:29:17
320
原创 Mybatis -处理clob类型数据
当执行sql语句,返回的是map类型时, 比如 public List<Map<String, Object>> query(@Param("sql") String sql)得到的数据是List<Map>类型数据,此时,如果有返回的有clob字段时,数据是这样的oracle.sql.CLOB@63636de0 ,显然,这不是我想要的,我需要的是字符串数据 那么怎么来处理clob字段呢,很简单
2017-08-02 22:08:23
4498
1
原创 mybatis-sqlite
最近需要和移动端配置配合,将后台的结果数据生成sqlite数据库传给移动端(因为需要离线查看),所以配置信息的话需要同步存入sqlite。 1 创建和后台一样的表结构 2 做一个拦截器,只需要拦截StatementHandle 就可以了,仅处理增、删、改操作,对于sqlite来说 ,批量插入时 ,需要去掉 from dual(我使用的是oracle),所以插入的时候 还要去掉from dual
2017-07-27 15:25:49
1258
原创 Mybatis -typeHandlers类处理器
在配置模块中的parseConfiguration方法中//解析配置文件中的typeHandlers 节点内容,这里就是解析自定义的类处理器 typeHandlerElement(root.evalNode("typeHandlers")); //解析方法 private void typeHandlerElement(XNode parent) throws Exception {
2017-07-16 18:27:14
345
原创 Mybatis 源码解析 -插件模块-分页例子
分页查询是我们非常常用的一种查询方式,所以我们这里就以分页作为例子讲解! 对于mybatis来说,当然你可以直接写一个分页sql语句进行查询,将currentPage和pageSize作为参数传入,就可以获得分页数据了!但是呢,分页查询往往伴随的还需要获取”总条数” totalRecord,也就是说,还要对应的再写一条获取总条数的sql语句,再获取一次!比较麻烦,那么问题来了,能不能不那么麻烦,自
2017-07-15 11:27:16
253
原创 Mybatis 源码解析 -插件模块
MyBatis 允许你在已映射语句执行过程中的某一点进行拦截调用。默认情况下,MyBatis 允许使用插件来拦截的方法调用包括:// MyBatis执行器,是MyBatis 调度的核心,负责SQL语句的生成和查询缓存的维护Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClos
2017-07-10 12:46:09
261
原创 Mybatis 源码解析 -事务模块
事务对数据库的重要性,就不用多说了 我们先来看下mybatis中事务的隔离级别public enum TransactionIsolationLevel {//无 NONE(Connection.TRANSACTION_NONE), // (读已提交):可避免脏读的发生READ_COMMITTED(Connection.TRANSACTION_READ_COMMITTED), // (
2017-07-08 17:05:14
326
原创 Mybatis源码分析-二级缓存
二级缓存和一级缓存不一样的地方在于,二级缓存针对的是MapperStament,比一级缓存更细! 首先在使用一级缓存之前,mapper.xml文件中要配置标签来开启二级缓存,而且可以细化到mapper.xml中的每条sql语句,比如<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>
2017-07-07 13:12:15
347
原创 Mybatis源码分析-一级缓存
为了能提高系统性能,缓存必不可少,mybatis同样也是有缓存的! 分一级缓存和二级缓存,该篇介绍下一级缓存!! 我们回顾下配置阶段,再创建executor执行器时,有个Configuration.newExecutor方法,来看下public Executor newExecutor(Transaction transaction, ExecutorType executorType) {
2017-07-06 22:51:18
175
原创 Mybatis源码分析-数据源
先来看个图 没错,datasource(数据源)包下面的源码,看起来好像不多的样子,就那么几个类而已!! 其实从包名就可以看出 数据源分三种jndi,pooled,unpooled,来看看他们的关系,咱看图说话1 unpooled 我们来看下unpooled即不使用数据连接池,每次都重新生成连接,执行完成关闭。 private Connection doGetConnection(Pr
2017-07-04 22:13:12
311
原创 Mybatis源码分析-执行模块
执行模块打算分几篇记录,先来了解下整个执行流程接下来将逐步分析以下几个模块,一个个来吧!! 1 连接池 2 事务 3 缓存 4 插件
2017-07-03 22:09:17
207
memcached 安装包
2014-02-21
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人