package com.jiaoyiping.berkeleydb;

import com.sleepycat.je.*;
import com.sleepycat.utilint.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import java.io.UnsupportedEncodingException; /**
* Created with IntelliJ IDEA.
* User: 焦一平
* Date: 14-7-9
* Time: 下午1:27
* To change this template use File | Settings | File Templates.
* 1.直接存key和value
* 2.存储key和value组合成的对象(未使用)
*/
public class SerialNumberGenerator {
Logger logger = LoggerFactory.getLogger(SerialNumberGenerator.class);
private static int MAX_VALUE = ;
private static int MIN_VALUE = ; /**
* 对于任何的请求,总是先取出当前的值返回,然后再将数据库里的值加一
* @param key 业务主键
* @return 当前值
*/
public String getNextValue(String key){
String currentValue = this.readCurrentValueFromDatabase(key);
String result;
if (currentValue == null || "".equals(currentValue)){
result = this.formatString(MIN_VALUE);
this.instrtIntoDataBase(key,(MIN_VALUE+)+"");
BerkeleyDBUtil.getDatabase().getEnvironment().sync(); }
else{
int intCurrentValue = Integer.parseInt(currentValue);
result = this.formatString(intCurrentValue); //存储下一个值
String nextValue = "";
if (intCurrentValue == MAX_VALUE){
nextValue = MIN_VALUE+"";
}else {
nextValue = (intCurrentValue+) +"";
}
this.instrtIntoDataBase(key,nextValue);
BerkeleyDBUtil.getDatabase().getEnvironment().sync(); } return result;
}
public String readCurrentValueFromDatabase(String key){
DatabaseEntry theKey = new DatabaseEntry(StringUtils.toUTF8(key));
DatabaseEntry theValue = new DatabaseEntry();
TransactionConfig txnConfig = new TransactionConfig();
txnConfig.setSerializableIsolationVoid(true);
Database database = BerkeleyDBUtil.getDatabase();
//Transaction txn = database.getEnvironment().beginTransaction(null,txnConfig);
OperationStatus status = database.get(null,theKey,theValue,LockMode.DEFAULT);
//对应的键不存在
if (status == OperationStatus.KEYEMPTY){
return null;
}
else if (status == OperationStatus.SUCCESS){
byte[] data = theValue.getData();
String result;
try {
result = new String(data,"UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
result = "";
}
return result;
} return null;
} public void instrtIntoDataBase(String key,String value){
DatabaseEntry theKey = new DatabaseEntry(StringUtils.toUTF8(key));
DatabaseEntry theValue = new DatabaseEntry(StringUtils.toUTF8(value));
TransactionConfig txnConfig = new TransactionConfig();
txnConfig.setSerializableIsolationVoid(true);
Database database = BerkeleyDBUtil.getDatabase();
//Transaction txn = database.getEnvironment().beginTransaction(null,txnConfig);
OperationStatus status = database.put(null,theKey,theValue);
if (status == OperationStatus.SUCCESS){
logger.info("保存成功");
}
// else if (status == OperationStatus.KEYEXIST){
// logger.info("");
// } } public String formatString(int input){
String result = "";
if(input > ){
result = input +"";
}else{
int length = (input+"").length();
if (length == ){
result = ""+input;
}
else if (length == ){
result = ""+input;
}else {
result = ""+input;
}
}
return result;
} public static void main(String[] args) {
SerialNumberGenerator generator = new SerialNumberGenerator();
String result = generator.getNextValue("jiao");
System.out.println("======"+result+"======");
}
}

java中生成流水号的一个例子(使用BerkeleyDB)的更多相关文章

  1. java中生成流水号的一个例子(使用关系型数据库)

    在实际的开发中,可能会有根据一定的规则生成流水号的需求(比如根据根据公司编码和日期生成4位流水号)我们可以把公司和日期联合起来作为一个业务编码,把这个业务编码和序列的值存储到数据库中,每次需要生成流水 ...

  2. (转)Java中使用正则表达式的一个简单例子及常用正则分享

    转自:http://www.jb51.net/article/67724.htm 这篇文章主要介绍了Java中使用正则表达式的一个简单例子及常用正则分享,本文用一个验证Email的例子讲解JAVA中如 ...

  3. 关于android开发添加菜单XML文件之后无法在R.java中生成ID的问题

    因为和同学分开做的android软件,现在想整合他做的界面部分,于是拷贝了res和src文件夹的文件,其中包括一个res.menu文件夹中的XML.但是每次将该文件导入到工程总无法自动在R.java中 ...

  4. 在java中生成二维码,并直接输出到jsp页面

    在java中生成的二维码不存到磁盘里要直接输出到页面上,这就需要把生成的二维码直接以流的形式输出到页面上,我用的是myeclipse 和 tomcat 它的原理是:在加载页面时,根据img的src(c ...

  5. JAVA中生成、解析二维码图片的方法

    JAVA中生成.解析二维码的方法并不复杂,使用google的zxing包就可以实现.下面的方法包含了生成二维码.在中间附加logo.添加文字功能,并有解析二维码的方法. 一.下载zxing的架包,并导 ...

  6. 【学习笔记】Java中生成对象的5中方法

    概述:本文介绍以下java五种创建对象的方式: 1.用new语句创建对象,这是最常用的创建对象的方式. 2.使用Class类的newInstance方法 3.运用反射手段,调用java.lang.re ...

  7. JAVA中生成指定位数随机数的方法总结

    JAVA中生成指定位数随机数的方法很多,下面列举几种比较常用的方法. 方法一.通过Math类 public static String getRandom1(int len) { int rs = ( ...

  8. Java中连接MySql数据库的例子

    Java中连接MySql数据库的例子: package com.joinmysql.demo; import java.sql.DriverManager; import java.sql.Resul ...

  9. Java中是否可以调用一个类中的main方法?

    前几天面试的时候,被问到在Java中是否可以调用一个类中的main方法?回来测试了下,答案是可以!代码如下: main1中调用main2的主方法 package org.fiu.test; impor ...

随机推荐

  1. mac上php+nginx配置

    brew的安装: ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)”php安装和配置bre ...

  2. ftp的主动模式active mode和被动模式 passive mode的配置和区别

    ftp的主动模式active mode和被动模式 passive mode的配置和区别 2017年05月08日 17:47:16 阅读数:21768 本文主要记录的是在linux上的区别,弄了一整天才 ...

  3. Arrays.sort和Collections.sort实现原理解析

    Arrays.sort和Collections.sort实现原理解析 1.使用 排序 2.原理 事实上Collections.sort方法底层就是调用的array.sort方法,而且不论是Collec ...

  4. 7 款基于 JavaScript/AJAX 的文件上传插件

    本文整理了7款基于JavaScript和AJAX的文件上传插件,这些插件基本上都能实现以下功能: 多文件上传 拖拽操作 实时上传进度 自定义上传限制 希望能为你的开发工作带来帮助. 1.  jQuer ...

  5. 数据库 Mysql内容补充二

    多表查询 mysql支持的是SQL99标准的连接查询,并不支持oracle公司的外连接查询, 但是支持oracle等值查询,不等值查询,自连接查询,子查询(只要不是外连接(+)都支持) oracle也 ...

  6. Mysql经常使用基本命令汇总及默认账户权限与改动

    一直仅仅是在浅显利用数据库存储数据.也被windows惯坏了.非常多命令使用的时候记不起来.so,换LINUX系统!不再使用GUI管理数据库!也想深入学习下Mysql.从权限管理開始.也就诞生了这篇学 ...

  7. ali数据分析面试题

    表A结构如下 Member_ID   --用户的Id,字符型 Log_time  --用户访问页面时间,日期型(只有一天的数据) URL ---访问的页面地址,字符型 要求:提取每个用户访问的第一个U ...

  8. html 输入框只允许输入数字

    要想限制文本框只能输入数字,你可以用Html5的标签就可以解决: 为input标签添加样式 type="number"即可. // 限制输入框的数字输入范围 var strPri ...

  9. mysql中参数--init-file的作用是什么呢?

    需求描述: 今天在修改测试环境mysql数据库中root用户密码的时候,用到了--init-file参数, 所以,就在这里说下该参数的作用. 概念解释: 参数:--init-file=file_nam ...

  10. 超全面的JavaWeb笔记day03<JS对象&函数>

    1.js的String对象(****) 2.js的Array对象 (****) 3.js的Date对象 (****) 获取当前的月 0-11,想要得到准确的月 +1 获取星期时候,星期日是 0 4.j ...