这是昨天参加复试的时候,技术问的:
一、
您有么有一种办法来代替UUID,就是说保证全球无重复!
Ps:不用说用 时间 + 随机字符,就是这么说的,技术说那也可能有重复的!
不用说 Base64或Base58,这个也是基于UUID的
现在说的是你自己创造的"UUID"
二、
Oracle中有Sequence,那么您如何在不用Sequence的情况下,做出类似Sequence的效果呢?比方说我当前的最大Id是5,那么下一个应该就是6,但是我1秒可能有上百万的数据存入,您如何实现呢JavaOracleSequenceUUID
一、
您有么有一种办法来代替UUID,就是说保证全球无重复!
Ps:不用说用 时间 + 随机字符,就是这么说的,技术说那也可能有重复的!
不用说 Base64或Base58,这个也是基于UUID的
现在说的是你自己创造的"UUID"
二、
Oracle中有Sequence,那么您如何在不用Sequence的情况下,做出类似Sequence的效果呢?比方说我当前的最大Id是5,那么下一个应该就是6,但是我1秒可能有上百万的数据存入,您如何实现呢JavaOracleSequenceUUID
解决方案 »
- java.lang.ClassNotFoundException: webservice.WebServiceListener,求解!
- jsp页面 点击按钮插入当前日期到数据库里面?
- 我在配置struts2中的struts2.xml为什么会出现问题
- S2SH中包的组织问题
- spring的配置文件真烦琐啊
- word转化的XML文件中 的图片是用什么编码编的 要读取出来怎么弄? 大虾速入!!!!!!!!
- 急!!!!!!如何在TOMCAT中增加二个service?
- 用java做xml,推荐工具吧
- 哪里能下载com.inet.tds.TdsDataSource?(分用完了,以后补。)
- int[] arr = new int[]{10,99};与int[]arr = {10,99}的不同
- Hibernate的Hql语句问题??
- MyEclipse 2013 修改虚拟路径问题
二、可以自己写Sequence生成器。我项目中用的:import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.HashMap;
import java.util.Map;/**
*
* <b>Note</b>: Java实现的Sequence工具
*/
public class SequenceUtil {
/**
* 单例模式
*/
private static SequenceUtil instance = new SequenceUtil();
/**
* 存放序列的MAP
*/
private Map<String, KeyInfo> keyMap = new HashMap<String, KeyInfo>(20);
private static final int POOL_SIZE = 1; /**
* 防止外部实例化
*/
private SequenceUtil() {
} /**
* 单例模式,获取单例
*
* @return SequenceUtils的单例对象
*/
public static SequenceUtil getInstance() {
return instance;
} /**
* 获取下一个sequence值
*
* @param keyName
* Sequence名称
* @return 下一个Sequence键值
*/
public synchronized int getNextKeyValue(String keyName) {
KeyInfo keyInfo = null;
Integer keyObject = null;
try {
if (keyMap.containsKey(keyName)) {
keyInfo = keyMap.get(keyName);
} else {
keyInfo = new KeyInfo(keyName, POOL_SIZE);
keyMap.put(keyName, keyInfo);
}
keyObject = keyInfo.getNextKey();
} catch (SQLException e) {
e.printStackTrace();
}
return keyObject;
}
}class KeyInfo {
/**
* 当前Sequence载体的最大值
*/
private int maxKey;
/**
* 当前Sequence的最小值
*/
private int minKey;
/**
* 下一个Sequence值
*/
private int nextKey;
/**
* Sequence缓存值
*/
private int poolSize;
/**
* Sequence的名称
*/
private String keyName;
/**
* 更新存放Sequence表的语句
*/
private static final String sql_update = "UPDATE intpub_Sequence SET KEYVALUE = KEYVALUE + ? WHERE KEYNAME = ?";
/**
* 查询Sequence表中的当前值
*/
private static final String sql_query = "SELECT KEYVALUE FROM intpub_Sequence WHERE KEYNAME = ?"; public KeyInfo(String keyName, int poolSize) throws SQLException {
this.poolSize = poolSize;
this.keyName = keyName;
retrieveFromDB();
} public String getKeyName() {
return keyName;
} public int getMaxKey() {
return maxKey;
} public int getMinKey() {
return minKey;
} public int getPoolSize() {
return poolSize;
} /**
* 获取下一个Sequence值
*
* @return 下一个Sequence值
* @throws SQLException
*/
public synchronized int getNextKey() throws SQLException {
if (nextKey > maxKey) {
retrieveFromDB();
}
return nextKey++;
} /**
* 执行Sequence表初始化和更新工作
*
* @throws SQLException
*/
private void retrieveFromDB() throws SQLException { Connection conn = ConnectionPool.getInstance().getConnection();
// 查询数据库
PreparedStatement pstmt_query = conn.prepareStatement(sql_query);
pstmt_query.setString(1, keyName);
ResultSet rs = pstmt_query.executeQuery();
if (rs.next()) {
maxKey = rs.getInt(1) + poolSize;
minKey = maxKey - poolSize + 1;
nextKey = minKey;
rs.close();
pstmt_query.close();
} else {
String init_sql = "INSERT INTO intpub_Sequence(KEYNAME,KEYVALUE) VALUES('"
+ keyName + "',10000 + " + poolSize + ")";
Statement stmt = conn.createStatement();
stmt.executeUpdate(init_sql);
maxKey = 10000 + poolSize;
minKey = maxKey - poolSize + 1;
nextKey = minKey;
stmt.close();
return;
} // 更新数据库
conn.setAutoCommit(false);
PreparedStatement pstmt_up = conn.prepareStatement(sql_update);
pstmt_up.setLong(1, poolSize);
pstmt_up.setString(2, keyName);
pstmt_up.executeUpdate();
pstmt_up.close();
conn.commit(); rs.close();
pstmt_query.close();
conn.close();
}}
简单的来说相当于加个计数器,然后用同步来控制下,然后一直getNext...大概如此了,也很少同时请求100W个实例来请求getNext方法,select倒是有机会,所以用上面说的同步控制getNext值还是可以的,不过我觉得应该是项目启动后应该先读取数据库表的最大值,然后赋值给变量里,不可能每次请求都访问数据库获取下一个值...这开销不行
可是Mac真的行嘛?我不清楚我用的 Mac修改器 修改的究竟是不是物理的Mac,但是我修改成和我室友一样的Mac后,我们两个连接路由器时,谁后连接谁上不去网,因为Mac重复!
对于毫秒数,这个就更坑了:
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;public class TestTimes {
public static void main(String args[]) { SimpleDateFormat formatter = new SimpleDateFormat(
"yyyy-MM-dd HH:mm:ss:SSS"); int size = 4000000; long times[] = new long[size];
for (int i = 0; i < size; i++)
times[i] = System.currentTimeMillis(); long time = times[0];
long previousTime = times[0];
long count = 0; Set<Long> delays = new HashSet<Long>();
long delay = 0;
long mindelay = Long.MAX_VALUE;
long maxdelay = Long.MIN_VALUE;
for (int i = 0; i < size; i++) {
if (times[i] > time) {
delay = time - previousTime;
delays.add(delay);
if (delay > 0 && delay < mindelay) {
mindelay = delay;
} else if (delay > maxdelay) {
maxdelay = delay;
} System.out.print("raw=");
System.out.print(time);
System.out.print(" | formatted=");
System.out.print(formatter.format(new Date(time)));
System.out.print(" | frequency=");
System.out.print(count);
System.out.print(" | delay=");
System.out.print(delay);
System.out.println("ms"); previousTime = time;
time = times[i];
count = 0;
} else {
count++;
}
} System.out.println("");
System.out.println("Minimum delay : " + mindelay + "ms");
System.out.println("Maximum delay : " + maxdelay + "ms");
}
}这是网上直接找的测试代码,我测试了几次,结果惨不忍睹啊:
嗯,自己写Sequence挺好!我也写一个试试...
2、使用oracle自带SYS_UID()
3、Java自带的random.getUUID().toSring()
一、
您有么有一种办法来代替UUID,就是说保证全球无重复!
Ps:不用说用 时间 + 随机字符,就是这么说的,技术说那也可能有重复的!
不用说 Base64或Base58,这个也是基于