网络相册开发(2)——Spring,SPA,Hibernate框架

搭建java代码框架

开发(2)——Spring,SPA,Hibernate框架-spring hibernate框架">

引入辅助类和基类

PKgen为 PK 生成器

Java代码

package net.sw.util;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 *
 * 用来生成唯一的PK
 * 该 PK 生成器生成 19 位的唯一 long 值,精确到万分之一秒,
 * 最后一位为尾数,用来在集群环境下保证PK的唯一性。
 *
 * 该PK生成虽然依赖于时间,但是在运行过程中改变时间不会影响PK,
 * 但是如果将系统时间后调,然后重新启动,有可能造成PK重复。
 *
 * 该 PK 生成器不依赖于数据库,相比依赖数据表的PK生成器,速度快,而且值可读
 *
 * @author <a href="mailto:yang_y@sysnet.com.cn">Young Yang</a>
 */

public class PKgen {

	/**
	 *  PK生成锁,用来限定同一时刻只有一个线程进入PK生成计算
	 */
	private final Lock LOCK = new ReentrantLock();
	/**
	 * 初始化时的毫秒数,因为该时间会随系统时间的改变而改变,
	 *  所以计算方法为该时间加上通过 nanoTime 计算出来的时间差
	 */
	private final static Long startMilli = System.currentTimeMillis();
	/**
	 * 初始化时的纳秒数,用来计量时间差,nanoTime不会随着系统时间的修改而改变
	 */
	private final static long startNano = System.nanoTime();
	/**
	 *  记录上一次生成 的 PK,如果新生成的PK和上次相等,则需要再次生成
	 */
	private volatile long lastPK = -1;
	//private final static SimpleDateFormat dateFormat = new SimpleDateFormat(
	//		"yyyyMMddHHmmssSSS");
	private final static SimpleDateFormat dateFormat = new SimpleDateFormat(
	"yyMMddHHmmssSSS");
	/**
	 * 返回的long PK的尾数,尾数可以用来在集群环境中判断该PK由哪一个节点产生
	 * 尾数通过配置设定
	 */
	private int suffix = 0;
	private static final Map<Integer, PKgen> instanceMap = new HashMap<Integer, PKgen>();
	// 必须提供正确的参数,以保证 suffix 在机群环境的唯一性
	private PKgen(int suffix) {
		this.suffix = suffix;
	}
	public synchronized static PKgen getInstance() {
		return getInstance(0);
	}
	/**
	 * 单机环境下,应该保证用相同的 suffix
	 * 在集群环境中,不同的机器必须提供不同的 suffix 来保证生成的ID的唯一性
	 * @param suffix
	 *            唯一标识好
	 */
	public synchronized static PKgen getInstance(int suffix) {
		PKgen pkgen;
		if (!instanceMap.containsKey(suffix)) {
			pkgen = new PKgen(suffix);
			instanceMap.put(suffix, pkgen);
		}
		else {
			pkgen = instanceMap.get(suffix);
		}
		return pkgen;
	}
	/**
	 * 返回下一个 long 型 PK, format: 2006111423361344491 <br>
	 * yyyyMMddHHmmssSSS + Macro Seconds + suffix
	 * @return long PK
	 */
	public long nextPK() {
		LOCK.lock();
		try {
			long newPK;
			do {
				long pastNano = System.nanoTime() - startNano; // 纳秒时间差
				long milliTime = pastNano / 1000000; // 取得毫秒差
				long macroTime = (pastNano / 100000) % 10; // 取得微秒第一位,
				// 计算出来的long PK,精度到万分之一秒(百微妙),加上尾数,一共19位,这是 Long.MAX_VALUE的最大位数了
				newPK = Long.parseLong(dateFormat.format(new Date(startMilli
						+ milliTime))
						+ macroTime + suffix);
			}
			while (lastPK == newPK); // 如果生成的相同,则再次计算
			lastPK = newPK; // 设置 lastPK
			return newPK;
		}
		finally {
			LOCK.unlock();
		}
	}
	public static void main(String[] args) throws Exception {
		PKgen pkg = PKgen.getInstance(0);
		int i = 0;
		long now = System.currentTimeMillis();
		while (i++ < 10) {
			System.out.println(pkg.nextPK());
		}
		System.out.println("Time: " + (System.currentTimeMillis() - now));
	}
}

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索reentrantlock
, private
, static
, final、volatile
, long
, ofbiz java pk
, 时间
, 生成
, simpledateformat
java相册
spring hibernate框架、spring hibernate、spring hibernate整合、springmvc hibernate、springboot hibernate,以便于您获取更多的相关知识。

时间: 2016-02-04

网络相册开发(2)——Spring,SPA,Hibernate框架的相关文章

spring mvc + hibernate框架怎么搭建

问题描述 spring mvc + hibernate框架怎么搭建 最近做个java方面的项目,需要搭建spring mvc+hibernate框架,找了很多天,没弄好, 希望有大神不吝赐教,本人联系方式QQ 805447821 解决方案 参考:http://blog.csdn.net/shan9liang/article/details/9117233

SSH(spring+springmvc+hibernate)框架快速上手

目录框架 目录框架如图所示.java代码包名即所存放代码的分类. - controller->处理请求 - dao->数据访问层接口 - dao.impl->数据访问层接口实现(实现数据库操作) - entity->实体类(数据库中的表) - service->业务层接口 - service.impl->业务层接口实现(主要代码编写区域) - util->工具集 配置文件 - hibernate.properties->hibernate相关配置(数据库驱动

关于使用Spring和hibernate开发web程序的配置说明和简单实例的详细说明

关于使用Spring和hibernate开发web程序的配置说明和简单实例的详细说明 作者:yanekemail:yanek@126.com 一.实现目标: 通过使用spring和hibernate,实现用户的添加功能.把用户信息加入到数据库中使用Spring 的hibernate模板实现DAO操作. 最终效果: 浏览器中输入 http://localhost:8083/hibernateTestWeb/user.do 数据库就增加一条记录. 二.分层结构 系统采用如下分层结构 1.WEB层:用

Struts、Spring、Hibernate、SSH、ajax都是框架吗需要都学吗

问题描述 Struts.Spring.Hibernate.SSH.ajax都是框架吗需要都学吗 解决方案 解决方案二:struts,spring,hibernate是轻量级框架也就是sshajax是domcssjavascriptXmlHttprequest是一种技术,以上做javaweb开发都是要学习的解决方案三:是啊,Struts.Spring.Hibernate.ajax都要学解决方案四:正在学习中!!!解决方案五:正在进行中解决方案六:必须的...想做java程序员,这些技术很关键!当然

为什么做java的web开发我们会使用struts2,springMVC和spring这样的框架?

为什么做java的web开发我们会使用struts2,springMVC和spring这样的框架?  今年我一直在思考web开发里的前后端分离的问题,到了现在也颇有点心得了,随着这个问题的深入,再加以现在公司很多web项目的控制层的技术框架由struts2迁移到springMVC,我突然有了一个新的疑问无法得到正确的解释,为什么我们现在做java的web开发,会选择struts2或者springMVC这样的框架,而不是使用servlet加jsp这样的技术呢?特别是现在我们web的前端页面都是使用

java-测试Spring整合hibernate/Struts2框架时,配置文件报奇怪的错误,求解

问题描述 测试Spring整合hibernate/Struts2框架时,配置文件报奇怪的错误,求解 为什么会报无法识别property? 解决方案 怎么都是这种问题,property要包含在bean标签内 解决方案二: Struts2+hibernate+spring整合时错误Struts2+hibernate+spring整合时错误 解决方案三: http://iteye.blog.163.com/blog/static/186308096201210265334689/ 解决方案四: pro

【HIBERNATE框架开发之一】搭建HIBERNATE环境并成功运行第一个项目HELLOHIBERNATE并解决3个常出现的运行问题;

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/hibernate/783.html OK,从这篇开始Himi将与大家一起进入Hibernate框架的学习啦,新手新手的说,希望大家多多指教: 对于Hibernate概述一下: "  Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库. H

spring+hibernate框架做项目的安全漏洞

问题描述 spring+hibernate框架做项目的安全漏洞 本人初学者,之前用spring+hibernate框架做了个数据查询的功能,连接的是MySQL的数据库,现在要通过公司外网连接公司的数据库去给其他人进行查询.我想问下各位大神,这种方式写的项目有没有什么安全方面的漏洞啊. 解决方案 安全的话.xss 啊,sql 注入啊等等.

spring-请问在Spring+Hibernate框架下连接两个数据库

问题描述 请问在Spring+Hibernate框架下连接两个数据库 两个数据库都是MySql的,一个在我本机,一个在我同事那,在ApplicationContext.xml里配两个DataSource,还需要配置哪些? 然后我在dao使用时怎么分别查询不同数据库的数据? 抱歉啊,新用户,没那个C币. 解决方案 http://blog.sina.com.cn/s/blog_454a9dc001012d6a.html 解决方案二: spring+hibernate下连接两个以上的数据库