木之陽兮 卿云烂兮

0%

Python是运行在解释器中的语言,查找资料知道,python中有一个全局锁(GIL),在使用多进程(Thread)的情况下,不能发挥多核的优势。而使用多进程(Multiprocess),则可以发挥多核的优势真正地提高效率。

对比实验

资料显示,如果多线程的进程是CPU密集型的,那多线程并不能有多少效率上的提升,相反还可能会因为线程的频繁切换,导致效率下降,推荐使用多进程;如果是IO密集型,多线程进程可以利用IO阻塞等待时的空闲时间执行其他线程,提升效率。所以我们根据实验对比不同场景的效率

操作系统 CPU 内存 硬盘
Windows 10 双核 8GB 机械硬盘
Read more »

Mongo在安装好之后,默认是不需要用户验证就可以操作数据库的。所以在安装Mongo后我们需要手动配置MongoDB服务的用户权限

操作系统 MongoDB版本
Windows 10 3.2.8

MongoDB服务的安装非常简单,只有简单的三步骤:

  • 下载并安装MongoDB
  • 将MongoDB的安装目录下的bin目录添加到系统环境变量Path下: “installPath“/bin
  • 使用管理者权限打开CMD,安装服务
    Read more »

[问题描述]最近在尝试重构一个用SWT写的图形客户端,这个过程中遇到很多问题,其中最显著的就是SWT的客户端经常发生卡死。所谓成也萧何,败也萧何。避免UI失去响应的关键就在于下面这段代码

1
2
3
4
5
while (!shell.isDisposed()) {
if (!Display.getDefault().readAndDispatch()) {
Display.getDefault().sleep();
}
}
Read more »

Spring的repository、service、controller三层之间的交互,应该使用代理模式为佳。以service和controller通信为例:

  • 定义UService接口
  • UServiceImpl类实现Service接口,并使用@Service/@Service(“name”) 注解将ServiceImpl声明为Spring的service类
  • Controller中注入UService,通过UService中的方法调用UServiceImpl中的业务逻辑

以上,使用代理模式,更进一步地实现层与层之间解耦和

  • 面向接口的编程
  • UServiceImpl中的其它接口不一定要和UService中一致,只需经过UserService将Controller的意图转发给UServiceImpl ,再通过UServiceImpl中维护的URepository对象,将UService的意图转发到Repository层。
Read more »

抛出异常:org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode.NEVER/MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or remove ‘readOnly’ marker from transaction definition.

在使用SpringMVC + hibernate开发项目时,使用hibernate进行写操作时抛出InvalidDataAccessApiUsageException的异常,在网上搜索了很多资料,多是以下解决方案,然而没有解决我的问题:

Read more »

在使用Python开发爬虫工具的时候,有时候需要把数据存储进MySQL数据库中(尽管现在大多使用NoSQL如MongoDB),这个时候使用Python写一个类似Java中的数据库访问通用类就很方便了。以下是用Python实现Mysql数据库访问通用类

导入MySQLdb模块,实现数据库操作。

1
2
3
#-*-coding:utf8-*-
import MySQLdb
from importlib import reload

另外Python中的字符集特别麻烦,所有在文件头将其设为utf8的字符集

定义数据库访问通用类

使用MySQLdb中的connect(host = host,user = user, passwd = password, db = db, port = port,charset= ‘utf8’)进行数据库连接。直接上代码:

Read more »

在Java程序开发中,反射和Annotation极大地方便了我们在编程时注入对象。Spring框架的底层实现便大量地使用了反射和主机。这里使用的是javax.persistence包中定义的一些注解,除了javax.persistence包中已经定义好的一些注解,我们还可以根据需要自定义注解。

定义Bean,注意get方法和set方法命名的规范

Read more »

苦艾初长,乃是清明。游子思归,奈何列车有时而不我待,为了在这传统时节早日到家,不得不选择翘掉周五晚上的《软件体系结构》。而临走前对老师放下“豪言”曰:已了解过‘云计算’的相关介绍,言既出,莫敢食,查阅相关资料,在此写下此文表述自己的想法。

  2006年谷歌推出了“Google 101计划”,并正式提出“云”的概念和理论。随后亚马逊、微软、惠普、雅虎、英特尔、IBM等公司都宣布了自己的“云计划”,云安全、云存储、内部云、外部云、公共云、私有云…[1]  互联网的发展日新月异,尤其是近几年的速度快到不敢相信。我已经不记得在国内‘云’(Cloud)这个词为什么突然火起来的了,就像不知道为什么在我眼里11年塞班的世界,12年怎么就突然成为了安卓的世界。也许,是因为那是忙着高考的我们无暇顾及互联网世界的变化。

  在这互联网的时代,我们每天都在和互联网产品打交道,从百度云到微云到阿里云,‘云’对于我们大多数人来说既熟悉也陌生,那么‘云’究竟所谓何物?

Read more »

JVM在执行JAVA程序时,会将不同的数据装载并存放在不同的内存区中这些数据内存区统称为”Runtime Data Area”,
其中即分为我们熟识的三个主要区域:Heap、Stack和Method Area

Heap(堆)

在Java程序运行时,只有一个Heap区域,用于存放程序所有的对象(不包括基本的数据类型),是线程共享的区域,我们常提到的GC
基本都是活动在这个区域。和C语言一样,Heap区域需要由程序员手动申请空间,但是因为java中存在GC,java中就不需要像C语言一
样,实时地考虑对不再使用的空间进行释放

Stack(栈)

栈是一种FILO(先进后出)的数据结构,在JVM中,栈区是绑定在java程序的每一个线程上的,存放局部变量、对象的引用、操作指令等,
并且为线程所私有,不允许被其它线程访问,所以线程的生命周期就是栈的声明周期。

栈中维护的单位为栈帧,每调用一个方法,都会启用一个栈帧,而方法中的局部变量、操作数都是存放在栈帧中。Java中方法调用的过程
也是对栈的操作过程。

Method Area (方法区)

方法区也称静态区,是JVM的一个逻辑内存区域,在编译、执行Java程序时,类加载器(ClassLoader)加载的类(描述)信息会存入
方法区。对于静态变量,因为是所有实例化对象全局共享的,所以指向的是同一块内存,故从设计上静态变量也应该是在类加载时装载
进方法区的类信息,因此静态变量也是存储在方法区中的。

Chapter 2. The Structure of the Java Virtual Machine

The Java Virtual Machine has a method area that is shared among all Java Virtual Machine threads. The method area is analogous to the storage area for compiled code of a conventional language or analogous to the “text” segment in an operating system process. It stores per-class structures such as the run-time constant pool, field and method data, and the code for methods and constructors, including the special methods used in class and instance initialization and interface initialization.

Read more »

1:Aspect切面的配置

(1)通过@Aspect注解定义切面,调用被定义为切点的方法时,会自动加入增强

1
2
3
4
5
6
7
8
9
10
11
@Aspect//注解将PreGreetingAspect定义为一个切面

public class PreGreetingAspect{

@Before("execution(* greetTo(..))")//@Before,@After等注解表示增强类型

public void beforeGreeting(){

System.out.println("-----before advice-----");

}
Read more »