<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[john548的专栏]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/john548</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; john548]]></copyright><item><title><![CDATA[PostgreSQL jdbc查询百万数据导致OOM]]></title><link>https://blog.youkuaiyun.com/john548/article/details/103067088</link><guid>https://blog.youkuaiyun.com/john548/article/details/103067088</guid><author>john548</author><pubDate>Thu, 14 Nov 2019 14:45:12 +0800</pubDate><description><![CDATA[1、在微服务的yml中已配置 url: jdbc:postgresql://${db_ip}:${db_port}/${db_name}?useCursorFetch=true&amp;defaultFetchSize=10000,意思是在获取到的ResultSet按游标滚动，每次取10000条记录，避免占用应用内存过大，导致OOM。实测结果仍为JDBC一次性取出全部200万记录。

2、查阅ht...]]></description><category></category></item><item><title><![CDATA[Volatile]]></title><link>https://blog.youkuaiyun.com/john548/article/details/52628574</link><guid>https://blog.youkuaiyun.com/john548/article/details/52628574</guid><author>john548</author><pubDate>Thu, 22 Sep 2016 22:10:13 +0800</pubDate><description><![CDATA[volatile修饰的成员变量在每次被线程访问时，都强迫从主内存中重读该成员变量的值。而且当成员变量发生变化时，会强迫线程将变化值回写到主内存。这样在任何时刻，两个不同的线程总是看到某个成员变量的同一个值。   
Java语言规范中指出：为了获得最佳速度，允许线程保存共享成员变量的私有拷贝，而且只当线程进入或者离开同步代码块时才与共享成员变量的原始值对比。这样当多个线程同时与某个对象交互时，就必]]></description><category></category></item><item><title><![CDATA[RESTful Web 服务四种操作POST/DELETE/PUT/GET]]></title><link>https://blog.youkuaiyun.com/john548/article/details/52312637</link><guid>https://blog.youkuaiyun.com/john548/article/details/52312637</guid><author>john548</author><pubDate>Thu, 25 Aug 2016 11:05:23 +0800</pubDate><description><![CDATA[关于REST及RESTful的概念，已有不少文章介绍，这里整理几篇我觉得不错的参考:

维基百科的定义: REST什么是REST跟RESTful? REST理论的中文详述，其中你可以了解到WCF Restful属于RPC 样式的 Web 服务，ASP.NET Web API属于RESTful Web 服务。深入浅出REST InfoQ的专文介绍，文中甚至有Roy T. Fielding当年RE]]></description><category></category></item><item><title><![CDATA[Java正则表达式入门]]></title><link>https://blog.youkuaiyun.com/john548/article/details/52278911</link><guid>https://blog.youkuaiyun.com/john548/article/details/52278911</guid><author>john548</author><pubDate>Mon, 22 Aug 2016 17:45:55 +0800</pubDate><description><![CDATA[众所周知，在程序开发中，难免会遇到需要匹配、查找、替换、判断字符串的情况发生，而这些情况有时又比较复杂，如果用纯编码方式解决，往往会浪费程序员的时间及精力。因此，学习及使用正则表达式，便成了解决这一矛盾的主要手段。
 大 家都知道，正则表达式是一种可以用于模式匹配和替换的规范，一个正则表达式就是由普通的字符（例如字符a到z）以及特殊字符（元字符）组成的文字模式，它 用以描述在查找文字主体时待匹配]]></description><category></category></item><item><title><![CDATA[Java程序执行Linux命令]]></title><link>https://blog.youkuaiyun.com/john548/article/details/52276781</link><guid>https://blog.youkuaiyun.com/john548/article/details/52276781</guid><author>john548</author><pubDate>Mon, 22 Aug 2016 14:48:37 +0800</pubDate><description><![CDATA[Java程序中要执行linux命令主要依赖2个类：Process和Runtime

首先看一下Process类：



[plain] view
 plain copy






ProcessBuilder.start() 和 Runtime.exec 方法创建一个本机进程，并返回 Process 子类的一个实例，  
该实例可用来控制进程并获得相关信息。Proc]]></description><category></category></item><item><title><![CDATA[Java transient关键字]]></title><link>https://blog.youkuaiyun.com/john548/article/details/52260317</link><guid>https://blog.youkuaiyun.com/john548/article/details/52260317</guid><author>john548</author><pubDate>Sat, 20 Aug 2016 11:28:57 +0800</pubDate><description><![CDATA[Volatile修饰的成员变量在每次被线程访问时，都强迫从主内存中重读该成员变量的值。而且，当成员变量发生变化时，强迫线程将变化值回写到主内存。这样在任何时刻，两个不同的线程总是看到某个成员变量的同一个值。   
  
Java语言规范中指出：为了获得最佳速度，允许线程保存共享成员变量的私有拷贝，而且只当线程进入或者离开同步代码块时才与共享成员变量的原始值对比。   
  
这样当多个线程]]></description><category></category></item><item><title><![CDATA[TCP协议中的三次握手和四次挥手(图解)]]></title><link>https://blog.youkuaiyun.com/john548/article/details/52251417</link><guid>https://blog.youkuaiyun.com/john548/article/details/52251417</guid><author>john548</author><pubDate>Fri, 19 Aug 2016 15:33:58 +0800</pubDate><description><![CDATA[建立TCP需要三次握手才能建立，而断开连接则需要四次握手。整个过程如下图所示：



先来看看如何建立连接的。




首先Client端发送连接请求报文，Server段接受连接后回复ACK报文，并为这次连接分配资源。Client端接收到ACK报文后也向Server段发生ACK报文，并分配资源，这样TCP连接就建立了。

那如何断开连接呢？简单的过程如下：




]]></description><category></category></item><item><title><![CDATA[TCP/IP 扫盲教程]]></title><link>https://blog.youkuaiyun.com/john548/article/details/52251388</link><guid>https://blog.youkuaiyun.com/john548/article/details/52251388</guid><author>john548</author><pubDate>Fri, 19 Aug 2016 15:32:11 +0800</pubDate><description><![CDATA[TCP/IP 是因特网的通信协议。

通信协议是对计算机必须遵守的规则的描述，只有遵守这些规则，计算机之间才能进行通信。



浏览器和服务器都在使用 TCP/IP

因特网浏览器和因特网服务器均使用 TCP/IP 来连接因特网。浏览器使用 TCP/IP 来访问因特网服务器，服务器使用 TCP/IP 向浏览器传回 HTML。



电子邮件也使用 TCP/IP


电]]></description><category></category></item><item><title><![CDATA[Java中Heap与Stack的区别]]></title><link>https://blog.youkuaiyun.com/john548/article/details/52243283</link><guid>https://blog.youkuaiyun.com/john548/article/details/52243283</guid><author>john548</author><pubDate>Thu, 18 Aug 2016 17:46:00 +0800</pubDate><description><![CDATA[1) Heap是 Stack的一个子集。

 

2) Stack存取速度仅次于寄存器，Stack里面的数据可共享，但是其中数据的大小和生存期必须在运行前确定。

 

3) Heap是运行时可动态分配的数据区，从速度看比Stack慢，Heap里面的数据不共享，大小和生存期都可以在运行时再确定。

 

4) new关键字 是运行时在Heap里面创建对象。每new一次都一定]]></description><category></category></item><item><title><![CDATA[Java代码优化编程]]></title><link>https://blog.youkuaiyun.com/john548/article/details/52243211</link><guid>https://blog.youkuaiyun.com/john548/article/details/52243211</guid><author>john548</author><pubDate>Thu, 18 Aug 2016 17:39:51 +0800</pubDate><description><![CDATA[可供程序利用的资源（内存、CPU时间、网络带宽等）是有限的，优化的目的就是让程序用尽可能少的资源完成预定的任务。优化通常包含两方面的内容：减小代码的体积，提高代码的运行效率。本文讨论的主要是如何提高代码的效率。


在Java程序中，性能问题的大部分原因并不在于Java语言，而是在于程序本身。养成好的代码编写习惯非常重要，比如正确地、巧妙地运用java.lang.String类和java.u]]></description><category></category></item><item><title><![CDATA[在 Java2中，有一套设计优良的接口和类组成了Java集合框架Collection，使程序员操作成批的数据或对象元素极为方便。这些接口和类有很多对抽象数据类型操作的API，而这是我们常用的且在数据结]]></title><link>https://blog.youkuaiyun.com/john548/article/details/52233956</link><guid>https://blog.youkuaiyun.com/john548/article/details/52233956</guid><author>john548</author><pubDate>Wed, 17 Aug 2016 19:39:58 +0800</pubDate><description><![CDATA[深入理解Java的接口和抽象类

　　对于面向对象编程来说，抽象是它的一大特征之一。在Java中，可以通过两种形式来体现OOP的抽象：接口和抽象类。这两者有太多相似的地方，又有太多不同的地方。很多人在初学的时候会以为它们可以随意互换使用，但是实际则不然。今天我们就一起来学习一下Java中的接口和抽象类。下面是本文的目录大纲：

　　一.抽象类

　　二.接口

　　三.抽象类和接口]]></description><category></category></item><item><title><![CDATA[面试题--Java常用集合类]]></title><link>https://blog.youkuaiyun.com/john548/article/details/52233102</link><guid>https://blog.youkuaiyun.com/john548/article/details/52233102</guid><author>john548</author><pubDate>Wed, 17 Aug 2016 17:45:36 +0800</pubDate><description><![CDATA[在Java中，有一套设计优良的接口和类组成了Java集合框架Collection，使程序员操作成批的数据或对象元素极为方便。例如Map（映射表）、Set（集合）、List（列表）等数据结构。Java用面向对象的设计对这些数据结构和算法进行了封装，这就极大的减化了程序员编程时的负担。程序员也可以以这个集合框架为基础，定义更高级别的数据抽象，比如Queue（队列）、Stack（栈）和线程安全的集合等，]]></description><category></category></item><item><title><![CDATA[Java - Collection]]></title><link>https://blog.youkuaiyun.com/john548/article/details/52232877</link><guid>https://blog.youkuaiyun.com/john548/article/details/52232877</guid><author>john548</author><pubDate>Wed, 17 Aug 2016 17:26:09 +0800</pubDate><description><![CDATA[Collection层次结构






Collection




[plain] view
 plain copy






子接口  
    Set,List  
集合中只能放置对象的引用,不能放置原生数据类型,  
    我们需要使用原生数据类型的封装类才能加入到集合中  



Ordered与Sorted接口



]]></description><category></category></item><item><title><![CDATA[索引]]></title><link>https://blog.youkuaiyun.com/john548/article/details/52231180</link><guid>https://blog.youkuaiyun.com/john548/article/details/52231180</guid><author>john548</author><pubDate>Wed, 17 Aug 2016 15:13:47 +0800</pubDate><description><![CDATA[1、定义

数据库索引好比是一本书前面的目录，能加快数据库的查询速度。

索引是对数据库表中一个或多个列（例如，employee
 表的姓氏 (lname) 列）的值进行排序的结构。如果想按特定职员的姓来查找他或她，则与在表中搜索所有的行相比，索引有助于更快地获取信息。

索引分为聚簇索引和非聚簇索引两种，聚簇索引
 是按照数据存放的物理位置为顺序的，而非聚簇索引就不一样了；聚簇索]]></description><category></category></item><item><title><![CDATA[SQL 连接 JOIN 例解（左连接，右连接，全连接，内连接，交叉连接，自连接）]]></title><link>https://blog.youkuaiyun.com/john548/article/details/52231142</link><guid>https://blog.youkuaiyun.com/john548/article/details/52231142</guid><author>john548</author><pubDate>Wed, 17 Aug 2016 15:10:30 +0800</pubDate><description><![CDATA[假设有如下表：


一个为投票主表，一个为投票者信息表～记录投票人IP及对应投票类型，左右连接实际说是我们联合查询的结果以哪个表为准～
1：如右接连 right join 或 right outer join：

我们以右边voter表为准，则左表(voteMaster)中的记录只有当其ID在右边(voter)中存在时才会显示出来，如上图，左边中ID为3.4.5.6因为这些ID右表中没]]></description><category></category></item><item><title><![CDATA[图解SQL的各种连接join]]></title><link>https://blog.youkuaiyun.com/john548/article/details/52231086</link><guid>https://blog.youkuaiyun.com/john548/article/details/52231086</guid><author>john548</author><pubDate>Wed, 17 Aug 2016 15:06:33 +0800</pubDate><description><![CDATA[对于SQL的Join，在学习起来可能是比较乱的。我们知道，SQL的Join语法有很多inner的，有outer的，有left的，有时候，对于Select出来的结果集是什么样子有点不是很清楚。Coding Horror上有一篇文章（实在不清楚为什么Coding Horror也被墙）通过 文氏图 Venn diagrams解释了SQL的Join。我觉得清楚易懂，转过来。

假设我们有两张表，Tab]]></description><category></category></item><item><title><![CDATA[面试题--HashMap和HashTable的区别]]></title><link>https://blog.youkuaiyun.com/john548/article/details/52229705</link><guid>https://blog.youkuaiyun.com/john548/article/details/52229705</guid><author>john548</author><pubDate>Wed, 17 Aug 2016 11:58:19 +0800</pubDate><description><![CDATA[HashMap父类 ：AbstractMap

Hashtable父类：Dictiionary

是否同步：HashMap否/Hashtable是

k，v可否null：HashMap是/Hashtable否




HashMap是Hashtable的轻量级实现（非线程安全的实现），他们都完成了Map接口。

主要区别在于HashMap允许空（null）键值（key），]]></description><category></category></item><item><title><![CDATA[Java中静态变量的适用场景]]></title><link>https://blog.youkuaiyun.com/john548/article/details/52229544</link><guid>https://blog.youkuaiyun.com/john548/article/details/52229544</guid><author>john548</author><pubDate>Wed, 17 Aug 2016 11:42:33 +0800</pubDate><description><![CDATA[Java类中的静态变量在程序运行期间，其内存空间对所有该类的对象实例而言是共享的，有些时候可以认为是全局变量。因此在某些时候为了节省系统内存开销、共享资源，可以将类中的一些变量声明为静态变量，通过下面的例子，你可以发现合理应用静态变量带来的好处：

 

Java代码  

public class WeekA{           static class Data {       ]]></description><category></category></item><item><title><![CDATA[Java中泛型的本质]]></title><link>https://blog.youkuaiyun.com/john548/article/details/52229343</link><guid>https://blog.youkuaiyun.com/john548/article/details/52229343</guid><author>john548</author><pubDate>Wed, 17 Aug 2016 11:24:55 +0800</pubDate><description><![CDATA[泛型在Java中经常用到，其本质上是指类型参数化。所谓类型参数化，是指用来声明数据的类型本身，也是可以改变的，它由实际参数来决定。
在一般情况下，实际参数决定了形式参数的值。而类型参数化，则是实际参数的类型决定了形式参数的类型。
 
举个简单的例子。方法max()要求返回两个参数中较大的那个，可以写成：


Java代码  


Integer max(Integer a, In]]></description><category></category></item><item><title><![CDATA[JAVA中堆和栈的区别]]></title><link>https://blog.youkuaiyun.com/john548/article/details/52218508</link><guid>https://blog.youkuaiyun.com/john548/article/details/52218508</guid><author>john548</author><pubDate>Tue, 16 Aug 2016 11:19:00 +0800</pubDate><description><![CDATA[在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。   

 当在一段代码块定义一个变量时，Java就在栈中为这个变量分配内存空间，当超过变量的作用域后，Java会自动释放掉为该变量所分配的内存空间，该内存空间可以立即被另作他用。   

  堆内存用来存放由new创建的对象和数组。   

  在堆中分配的内存，由Java虚拟机的自动垃圾回收器来管理。   
]]></description><category></category></item></channel></rss>