数据库事务浅析

ACID

一个数据库事务通常包含了一个序列的对数据库的读/写操作。它的存在包含有以下两个目的:

  1. 为数据库操作序列提供了一个从失败中恢复到正常状态的方法,同时提供了数据库即使在异常状态下仍能保持一致性的方法。
  2. 当多个应用程序在并发访问数据库时,可以在这些应用程序之间提供一个隔离方法,以防止彼此的操作互相干扰。

上面对数据库事务的定义摘自维基百科。先不用着急的去理解这个定义的具体含义,我们从事务的四个特性来逐步了解什么是事务。

数据库事务拥有以下四个特性,习惯上被称之为ACID特性。

  1. 原子性(Atomicity):事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行。

  2. 一致性(Consistency):事务应确保数据库的状态从一个一致状态转变为另一个一致状态。一致状态的含义是数据库中的数据应满足完整性约束。

  3. 隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务的执行。

  4. 持久性(Durability):已被提交的事务对数据库的修改应该永久保存在数据库中。

阅读全文 »

Java读取资源文件

写java代码时常常需要加载一些外部的资源,通常我们会使用全路径名加载一份资源,比如:C:\Users\Yukai\Desktop\abc.jpg . 但是,有些时候我们需要加载的是源代码路径下的资源或者配置文件等等,更习惯于使用相对路径,或者直接给一个文件名,就希望能够找到我们需要的配置文件。如何做到?常见的方法是使用了 class.getResource 或 classloader.getResource

class.getResource && classloader.getResource ?

这两个方法看起来很相似,他们直接有什么区别?

直接上网搜索能够得到一些答案,但都不如查看源代码来的直接:

阅读全文 »

使用maven打包

前段时间做的web项目涉及到了打包的问题,记录一下使用maven打包的过程…

项目打包为fatjar

什么是fatjar?做过java项目的都知道,一个项目从开发到部署,一般需要经过打包,把一些资源文件和类文件压缩到一块,形成一个单独的文件,叫做jar(或者war)。如果这个项目依赖了一些第三方的jar包,在最终的部署阶段,这些jar有两种存在方式:

  • 一种是单独放到一个与项目jar包并行的文件夹中(一般叫做lib),然后使用-classpath将这个文件夹下的jar加入到classpath
1
2
3
4
5
6
7
8
---
|--VersionManager.jar
|
|--lib
|
|--a.jar
|
|--b.jar

阅读全文 »

VncServer的安装与使用

因为新做的版本发布系统需要部署在内网,找了两台空闲的机器做了Centos7的系统,并搭建读写分离的环境。因为读写分离环境的搭建需要用到可视化工具,所以决定在这两台机器上搭一个vnc服务。

centos7,IP 192.168.1.57

安装

  1. 安装VNCServer
1
yum install tigervnc-server -y
  1. 设置防火墙
1
2
sudo firewall-cmd --permanent --add-service vnc-server
sudo systemctl restart firewalld.service

阅读全文 »

Linux下的守护进程

这两天在搭建VNC服务的时候,遇到一个简单的问题,却困扰了我有一会:网上的教程大部分是修改.service文件,然后启动服务,但是我发现使用vncserver这个命令也可以达到同样的目的,这两者之间有什么区别呢?查了一些资料,简单的做一个总结。

工作管理

一般情况下,我们可能会在命令行下这样启动一个程序,以新做的版本管理系统为例:

1
java -jar VersionManager.jar

阅读全文 »

读懂Java_Thread_Dump

前段时间有现场发现死锁的问题,查看发回来的jstack dump文件,发现虽然大致看懂,但是不是很透彻。从网上看了一些介绍jstack的文章,大部分复制粘贴,讲解的也不够透彻,现在有时间来自己整理一下jstack的知识,记录一下~

获取Dump

java 提供了查看当前用户启动的java进程的工具 JPS:jps

1
2
3
4
5
5008 org.eclipse.equinox.launcher_1.3.201.v20161025-1711.jar
10712 Main
888 App
15804 Jps
34300 SynchronizedTest

阅读全文 »

理解JavaScript作用域链

最近在读《JavaScript权威指南》,读到“函数作用域和声明提前”这部分内容时有点晕,上网查了一些资料,算是弄明白了,所以把自己的理解记下来~

作用域

  1. 全局作用域

在代码中任何地方都能访问到的对象拥有全局作用域,一般来说以下几种情形拥有全局作用域:

  • 最外层函数和在最外层函数外面定义的变量拥有全局作用域,例如:
1
2
3
4
5
6
7
8
9
10
11
12
var a="global";
function doSomething(){
var b="local";
function innerSay(){
alert(b);
}
innerSay();
}
alert(a); //global
alert(b); //脚本错误
doSomething(); //local
innerSay() //脚本错误

阅读全文 »

组合模式的妙用

组合模式定义

component
  • Component 是组合中的对象声明接口,在适当的情况下,实现所有类共有接口的默认行为。声明一个接口用于访问和管理Component
    子部件。

  • Leaf 在组合中表示叶子结点对象,叶子结点没有子结点。

  • Composite 定义有枝节点行为,用来存储子部件,在Component接口中实现与子部件有关操作,如增加(add)和删除

阅读全文 »