当前访客身份:游客 [ 登录 | 加入 OSCHINA ]

代码分享

当前位置:
代码分享 » Java  » 数据库编程
菜根乱谭

MongoDB的自增长主键的实现

菜根乱谭 发布于 2011年01月18日 14时, 6评/5915阅
分享到: 
收藏 +0
1
MongoDB的主键在没有自己设定的情况下,可以自动产生24位字符串的主键。现在有一个特定的需要,需要用自增长的数值作为主键,所以就模仿传统关系数据库的方式,来进行处理。

代码片段(2) [全屏查看所有代码]

1. [文件] LongPKMongoEO.java ~ 2KB     下载(45)     跳至 [1] [2] [全屏预览]

/************************* 版权声明 *********************************
 *                                                                  
 *                     版权所有:百洋软件                           
 *          Copyright (c) 2011 by www.po-soft.com                
 *                                                                  
 ************************* 变更记录 *********************************
 *
 * 创建者:yongtree   创建日期: 2011-1-17
 * 备注:
 * 
 * 修改者:       修改日期:
 * 备注:
 * 
 */

package com.posoftframework.mongodb;

import com.google.code.morphia.Datastore;
import com.google.code.morphia.annotations.Id;
import com.google.code.morphia.annotations.PrePersist;
import com.google.code.morphia.annotations.Transient;
import com.google.code.morphia.query.Query;

/**
 * 自增长数字类型主键的Mongo实体
 * 
 * @author yongtree
 * @date 2011-1-17 下午04:11:04
 * @version 1.0
 */
public abstract class LongPKMongoEO extends BaseMongoEO {

	@Id
	Long _id;

	@Transient
	protected Datastore ds;
	
	

	public void setDs(Datastore ds) {
		this.ds = ds;
	}

	@PrePersist
	void prePersist() {
		
		//自增性主键的处理
		
		if (_id == null) {
			String collName = ds.getCollection(getClass()).getName();
			Query<StoredSeqence> q = ds.find(StoredSeqence.class, "_id",
					collName);
			StoredSeqence ss = q.get();
			if(ss==null){//不存在该实体的注册,则新创建一个
				ss = new StoredSeqence(collName);
				ss.setValue(1l);
			}else{
				ss.setValue(ss.getValue()+1);
			}
			ds.save(ss);
			_id=ss.value;
		}
	}

	public Long getId() {
		return _id;
	}

}

2. [文件] StoredSeqence.java ~ 1KB     下载(35)     跳至 [1] [2] [全屏预览]

/************************* 版权声明 *********************************
 *                                                                  
 *                     版权所有:百洋软件                           
 *          Copyright (c) 2011 by www.po-soft.com                
 *                                                                  
 ************************* 变更记录 *********************************
 *
 * 创建者:yongtree   创建日期: 2011-1-17
 * 备注:
 * 
 * 修改者:       修改日期:
 * 备注:
 * 
 */

package com.posoftframework.mongodb;

import java.io.Serializable;

import com.google.code.morphia.annotations.Entity;
import com.google.code.morphia.annotations.Id;

/**
 * MongoDB自增长主键维护队列,类似于MSSQL,Oracle维护主键的方式
 * 
 * @author yongtree
 * @date 2011-1-17 下午06:58:05
 * @version 1.0
 */
@Entity(noClassnameStored=true)
public class StoredSeqence implements Serializable {

	private static final long serialVersionUID = 1L;

	@Id
	String collName;

	Long value;
	

	public StoredSeqence(){
		
	}
	
	public StoredSeqence(String collName) {
		this.collName = collName;
	}

	public Long getValue() {
		return value;
	}

	public void setValue(Long value) {
		this.value = value;
	}

	public String getCollName() {
		return collName;
	}

	public void setCollName(String collName) {
		this.collName = collName;
	}

	

	
}


开源中国-程序员在线工具:Git代码托管 API文档大全(120+) JS在线编辑演示 二维码 更多»

发表评论 回到顶部 网友评论(6)

  • 1楼:小米粥 发表于 2011-08-05 15:00 回复此评论
     大哥,你讲解一下好吗?
  • 2楼:马立盈 发表于 2011-12-04 20:29 回复此评论
    你的这个方法是不安全的,如果两个并发的访问会获得相同的id .因为你的自增操作不是原子的
  • 3楼:菜根乱谭 发表于 2011-12-05 07:11 回复此评论

    引用来自“马立盈”的评论

    你的这个方法是不安全的,如果两个并发的访问会获得相同的id .因为你的自增操作不是原子的
    的确是存在并发的情况,关系数据库有锁机制,但是mongodb没有,得自己用程序处理。
  • 4楼:bob_abc 发表于 2014-04-08 17:29 回复此评论

    引用来自“谭明智”的评论

    引用来自“马立盈”的评论

    你的这个方法是不安全的,如果两个并发的访问会获得相同的id .因为你的自增操作不是原子的
    的确是存在并发的情况,关系数据库有锁机制,但是mongodb没有,得自己用程序处理。

    自己处理事务,非关系性数据库那有那么全面

  • 5楼:muyu 发表于 2015-04-24 16:55 回复此评论
    有点绕远吧,用mongodb就不要自增主键
  • 6楼:洞悉 发表于 2015-07-17 10:10 回复此评论
    _id 就是自增的啊
开源从代码分享开始 分享代码
菜根乱谭的其它代码 全部(8)...