package com.iminido.nosql;
import com.google.gson.Gson;
import com.iminido.constant.Const;
import com.iminido.instruction.core.IstRequ;
import com.iminido.log.Log;
import com.iminido.util.SU;
import static com.iminido.util.SU.parseJSON2Map;
import com.iminido.util.TL;
import com.sequoiadb.base.CollectionSpace;
import com.sequoiadb.base.DBCollection;
import com.sequoiadb.base.DBCursor;
import com.sequoiadb.base.Sequoiadb;
import com.sequoiadb.base.SequoiadbDatasource;
import com.sequoiadb.base.SequoiadbOption;
import com.sequoiadb.exception.BaseException;
import com.sequoiadb.net.ConfigOptions;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.bson.BSONObject;
import org.bson.BasicBSONObject;
import org.bson.util.JSON;
/**
*
* @author JadeLuo
*/
public class NoSQLDb {
private static SequoiadbDatasource sequoiadbDatasource;
private static final Log log = Log.init(NoSQLDb.class);
private static Semaphore semaphore = new Semaphore(1);
static {
initSequoiadbDatasource();
}
public static void initSequoiadbDatasource() {
ArrayList<String> urls = new ArrayList<>();
ConfigOptions nwOpt = new ConfigOptions(); // 定义连接选项
SequoiadbOption dsOpt = new SequoiadbOption(); // 定义连接池选项
urls.add(Const.SEQUOIADB_HOST + ":" + Const.SEQUOIADB_PORT);
// urls.add("ubuntu-dev2:11810");
// urls.add("ubuntu-dev3:11810");
nwOpt.setConnectTimeout(500); // 设置若连接失败,超时时间(ms)
nwOpt.setMaxAutoConnectRetryTime(0); // 设置若连接失败,重试次数
// 以下设置的都是 SequoiadbOption 的默认值
dsOpt.setMaxConnectionNum(500); // 设置连接池最大连接数
dsOpt.setInitConnectionNum(10); // 初始化连接池时,创建连接的数量
dsOpt.setDeltaIncCount(10); // 当池中没有可用连接时,增加连接的数量
dsOpt.setMaxIdeNum(10); // 周期清理多余的空闲连接时,应保留连接的数量
dsOpt.setTimeout(5 * 1000); // 当已使用的连接数到达设置的最大连接数时(500),请求连接的等待时间。
dsOpt.setAbandonTime(10 * 60 * 1000); // 连接存活时间,当连接空闲时间超过连接存活时间,将被连接池丢弃
dsOpt.setRecheckCyclePeriod(1 * 60 * 1000); // 清除多余空闲连接的周期
dsOpt.setRecaptureConnPeriod(10 * 60 * 1000); // 检测并取回异常地址的周期
sequoiadbDatasource = new SequoiadbDatasource(urls, Const.SEQUOIADB_USERNAME, Const.SEQUOIADB_PASSWORD, nwOpt, dsOpt); // 创建连接池
}
public static synchronized Sequoiadb getSequoiadb() {
Sequoiadb sdb = null;
try {
sdb = sequoiadbDatasource.getConnection();
} catch (BaseException ex) {
System.out.println("getIdleConnNum1 " + sequoiadbDatasource.getIdleConnNum());
System.out.println("getUsedConnNum" + sequoiadbDatasource.getUsedConnNum());
Logger.getLogger(NoSQLDb.class.getName()).log(Level.SEVERE, null, ex);
} catch (InterruptedException ex) {
System.out.println("getIdleConnNum2 " + sequoiadbDatasource.getIdleConnNum());
System.out.println("getUsedConnNum" + sequoiadbDatasource.getUsedConnNum());
Logger.getLogger(NoSQLDb.class.getName()).log(Level.SEVERE, null, ex);
}
if (sdb == null) {
while (sdb == null) {
try {
semaphore.tryAcquire(1, 2, TimeUnit.SECONDS);
} catch (InterruptedException ex) {
System.out.println("getIdleConnNum3 " + sequoiadbDatasource.getIdleConnNum());
System.out.println("getUsedConnNum" + sequoiadbDatasource.getUsedConnNum());
Logger.getLogger(NoSQLDb.class.getName()).log(Level.SEVERE, null, ex);
}
try {
sdb = sequoiadbDatasource.getConnection();
} catch (BaseException | InterruptedException ex) {
System.out.println("getIdleConnNum4 " + sequoiadbDatasource.getIdleConnNum());
System.out.println("getUsedConnNum" + sequoiadbDatasource.getUsedConnNum());
Logger.getLogger(NoSQLDb.class.getName()).log(Level.SEVERE, null, ex);
}
}
semaphore.release();
return sdb;
}
return sdb;
}
public static CollectionSpace initCollectionSpace(String csName) {
try {
Sequoiadb sdb = getSequoiadb();
CollectionSpace cs;
if (sdb.isCollectionSpaceExist(csName)) {
cs = sdb.getCollectionSpace(csName);
} else {
cs = sdb.createCollectionSpace(csName);
}
return cs;
} catch (BaseException ex) {
Logger.getLogger(NoSQLDb.class.getName()).log(Level.SEVERE, null, ex);
log.debug("D:\\working\\workspace\\LF_S_SignalProc\\src\\com\\iminido\\nosql\\NoSQLDb.java initCollectionSpace 方法获取 Sequoiadb 为空");
return null;
}
}
public static DBCollection initCollection(String collectionName) {
CollectionSpace cs = initCollectionSpace(Const.SEQUOIADB_DATABASE);
DBCollection cl;
if (cs.isCollectionExist(collectionName)) {
cl = cs.getCollection(collectionName);
} else {
cl = cs.createCollection(collectionName);
}
return cl;
}
public static void removeAll(String collectionName) {
DBCollection cl = initCollection(collectionName);
cl.delete(new BasicBSONObject());
sequoiadbDatasource.close(cl.getSequoiadb());
}
public static void remove(String collectionName) {
DBCollection cl = initCollection(collectionName);
cl.delete(new BasicBSONObject());
sequoiadbDatasource.close(cl.getSequoiadb());
}
public static boolean delete(String cl, String matcher) {
try {
DBCollection dbc = initCollection(cl);
dbc.delete(matcher);
sequoiadbDatasource.close(dbc.getSequoiadb());
return true;
} catch (Exception e) {
log.error("delete " + cl + "matcher=>" + matcher + "失败", e);
return false;
}
}
public static void delete(String cl, String matcher, String hint) {
DBCollection dbc = initCollection(cl);
dbc.delete(matcher, hint);
sequoiadbDatasource.close(dbc.getSequoiadb());
}
public static boolean insert(String collectionName, String... key_val) {
String strJson = strs2json(key_val);
log.debug("D:\\working\\workspace\\LF_S_SignalProc\\src\\com\\iminido\\nosql\\NoSQLDb.java save=>" + strJson);
if (strJson != null) {
BSONObject dbo;
try {
dbo = (BasicBSONObject) JSON.parse(strJson); //添加异常处理
} catch (Exception e) {
log.error("解析json字符串异常,传入的字符串为:" + strJson, e);
return false;
}
try {
DBCollection dbc = initCollection(collectionName);
dbc.insert(dbo);
sequoiadbDatasource.close(dbc.getSequoiadb());
return true;
} catch (Exception e) {
return false;
}
}
return false;
}
public static boolean insert(String collectionName, String strJson) {
BSONObject dbo = null;
try {
dbo = (BasicBSONObject) JSON.parse(strJson); //添加异常处理
} catch (Exception e) {
log.error("解析json字符串异常,传入的字符串为:" + strJson, e);
return false;
}
DBCollection dBCollection = initCollection(collectionName);
Object object = dBCollection.insert(dbo);
sequoiadbDatasource.close(dBCollection.getSequoiadb());
return true;
}
public static boolean insertNestJson(String collectionName, String strJson, String strJson2, String nameOfNest) {
BSONObject dbo = null;
try {
dbo = (BasicBSONObject) JSON.parse(strJson); //添加异常处理
} catch (Exception e) {
log.error("解析json字符串异常,传入的字符串为:" + strJson, e);
return false;
}
BSONObject dbo2 = null;
try {
dbo2 = (BasicBSONObject) JSON.parse(strJson2); //添加异常处理
} catch (Exception e) {
log.error("解析json字符串异常,传入的字符串为:" + strJson, e);
return false;
}
dbo.put(nameOfNest, dbo2);
DBCollection dBCollection = initCollection(collectionName);
Object object = dBCollection.insert(dbo);
sequoiadbDatasource.close(dBCollection.getSequoiadb());
return true;
}
public static boolean insert(String collectionName, IstRequ requ) {
String strJson = TL.requ2json(requ);
BSONObject dbo = null;
try {
dbo = (BasicBSONObject) JSON.parse(strJson); //添加异常处理
} catch (Exception e) {
log.error("解析json字符串异常,传入的字符串为:" + strJson, e);
return false;
}
DBCollection dBCollection = initCollection(collectionName);
dBCollection.insert(dbo);
sequoiadbDatasource.close(dBCollection.getSequoiadb());
return true ;
}
public static Object insert(String collectionName, IstRequ requ, String args) {
String strJson = TL.requ2json(requ, args);
BSONObject dbo = null;
try {
dbo = (BasicBSONObject) JSON.parse(strJson); //添加异常处理
} catch (Exception e) {
log.error("解析json字符串异常,传入的字符串为:" + strJson, e);
}
DBCollection dBCollection = initCollection(collectionName);
Object object = dBCollection.insert(dbo);
sequoiadbDatasource.close(dBCollection.getSequoiadb());
return object;
}
// public static void savej(String collectionName, IstRequ req) {
// String strJson = req.get("j");
// strJson = strJson.replaceAll("\'", "\""); //把单引号替换成双引号,不用这句也可以执行成功。加这句是为了让我记住json应用中存在单双引号问题,在jquery中,如果json是用单引号的话,就会出错,在php中json用单引号也会出错。
// insert(collectionName, strJson);
// }
public static boolean isExist(String collectionName, String matcher) {
if (null == queryOne(collectionName, matcher, matcher, matcher, null)) {
return false;
} else {
return true;
}
}
public static BSONObject queryOne(String collectionName, String matcher, String selector, String orderBy, String hint) {
DBCollection dBCollection = initCollection(collectionName);
BSONObject bSONObject = dBCollection.queryOne(str2BSONObject(matcher), str2BSONObject(selector), str2BSONObject(orderBy), str2BSONObject(hint), 0);
sequoiadbDatasource.close(dBCollection.getSequoiadb());
return bSONObject;
}
public static DBCursor findandclose(String collectionName, String... key_val) {
DBCollection dBCollection = initCollection(collectionName);
DBCursor dBCursor = dBCollection.query();
sequoiadbDatasource.close(dBCollection.getSequoiadb());
return dBCursor;
}
public static DBCursor query(String collectionName, String... key_val) {
return initCollection(collectionName).query();
}
public static DBCursor query(String collectionName) {
return initCollection(collectionName).query();
}
public static DBCursor query(String collectionName, String matcher, String selector, String orderBy, String hint, int limitNum) {
return initCollection(collectionName).query(matcher, selector, orderBy, hint);
}
public static BasicBSONObject str2BSONObject(String jsonString) {
return (BasicBSONObject) JSON.parse(jsonString);
}
public static List exec(String sql) {
DBCursor c = null;
Sequoiadb seq = null;
try {
seq = sequoiadbDatasource.getConnection();
c = seq.exec(sql);
} catch (BaseException e) {
e.printStackTrace();
} catch (InterruptedException ex) {
Logger.getLogger(NoSQLDb.class.getName()).log(Level.SEVERE, null, ex);
}
if (c != null && c.hasNext()) {
List list = new ArrayList();
while (c.hasNext()) {
list.add(c.getNext());
}
if (seq != null) {
sequoiadbDatasource.close(seq);
}
return list;
} else {
if (seq != null) {
sequoiadbDatasource.close(seq);
}
return null;
}
}
public static String exeSql(String sql) {
return list2String(exec(sql));
}
public static String exe(String sql) {
return list2String(exec(sql));
}
public static boolean execUpdate(String sql) {
try {
Sequoiadb seq = sequoiadbDatasource.getConnection();
seq.execUpdate(sql);
sequoiadbDatasource.close(seq);
return true;
} catch (BaseException e) {
e.printStackTrace();
log.warn(sql, e);
return false;
} catch (InterruptedException ex) {
Logger.getLogger(NoSQLDb.class.getName()).log(Level.SEVERE, null, ex);
return false;
}
}
//matcher test
public static List query(String cl, String matcher) {
DBCollection dbc = initCollection(cl);
DBCursor c = dbc.query(matcher, null, null, null, 0L, 100L);
List<String> list = null;//new ArrayList<>();
if (c != null && c.hasNext()) {
list = cur2list(c);
} else {
sequoiadbDatasource.close(dbc.getSequoiadb());
return list;
}
sequoiadbDatasource.close(dbc.getSequoiadb());
return list;
}
//matcher test
public static List query(String cl, String matcher,String selector) {
DBCollection dbc = initCollection(cl);
DBCursor c = dbc.query(matcher, selector, null, null, 0L, 100L);
List<String> list = null;//new ArrayList<>();
if (c != null && c.hasNext()) {
list = cur2list(c);
} else {
sequoiadbDatasource.close(dbc.getSequoiadb());
return list;
}
sequoiadbDatasource.close(dbc.getSequoiadb());
return list;
}
//returnRows test
public static DBCursor query(String cl, String matcher, long returnRows) {
return initCollection(cl).query(matcher, null, null, null, 0L, returnRows);
}
// selector {filed:1}
public static DBCursor query(String cl, String matcher, String selector, long returnRows) {
return initCollection(cl).query(matcher, selector, null, null, 0L, returnRows);
}
//orderBy {filed:1/-1}
public static DBCursor query(String cl, String matcher, String selector, String orderBy, long returnRows) {
return initCollection(cl).query(matcher, selector, orderBy, null, 0L, returnRows);
}
//hint (index) {}
public static DBCursor query(String cl, String matcher, String selector, String orderBy, String hint, long returnRows) {
DBCollection dbc = initCollection(cl);
DBCursor dbcu = dbc.query(matcher, selector, orderBy, hint, 0L, returnRows);
sequoiadbDatasource.close(dbc.getSequoiadb());
return dbcu;
}
public static List query2(String cl, String matcher, String selector, String orderBy, String hint, long returnRows,List<String> list ) {
DBCollection dbc = initCollection(cl);
DBCursor c = dbc.query(matcher, selector, orderBy, hint, 0L, returnRows);
if (c != null && c.hasNext()) {
while (c.hasNext()) {
String str1 = (String) c.getNext().get("acc");
for (int j = 0; j < list.size(); j++) {
String str2 = list.get(j);
if (str2.equals(str1)) {
list.remove(str1);
}
}
}
} else {
sequoiadbDatasource.close(dbc.getSequoiadb());
return list;//直接返回生成的推荐号
}
sequoiadbDatasource.close(dbc.getSequoiadb());
return list;
}
public static DBCursor query(String cl, String matcher, long returnRows, long skipRows) {
return initCollection(cl).query(matcher, null, null, null, skipRows, returnRows);
}
public static String query(String cl, String matcher, String selector, String orderBy, String hint, long skipRows, long returnRows) {
DBCollection dbc = initCollection(cl);
String jsonString = cur2jsonstr(dbc.query(matcher, selector, orderBy, hint, skipRows, returnRows));
sequoiadbDatasource.close(dbc.getSequoiadb());
return jsonString;
}
public static void update(String cl, String matcher, String modifier, String hint) {
DBCollection dbc = initCollection(cl);
dbc.update(matcher, modifier, hint);
sequoiadbDatasource.close(dbc.getSequoiadb());
}
public static void update$unsetAll(String cl, String matcher, String field, String hint) {
DBCollection dbc = initCollection(cl);
dbc.update(matcher, "{$unset:" + field + ":[]}", hint); // NoSQLDb.update("friend", "{}", "{$unset:{label:[]}}", "{}");
sequoiadbDatasource.close(dbc.getSequoiadb());
}
public static void update$unset(String cl, String matcher, String modifier, String hint) {
DBCollection dbc = initCollection(cl);
dbc.update(matcher, "{$unset:" + modifier + "}", hint); // NoSQLDb.update("friend", "{}", "{$unset:{label:[33,44,55]}}", "{}");
sequoiadbDatasource.close(dbc.getSequoiadb());
}
public static void update$addtoset(String cl, String matcher, String modifier, String hint) {
DBCollection dbc = initCollection(cl);
dbc.update(matcher, "{$addtoset:" + modifier + "}", hint); // NoSQLDb.upsert("friend", "{}", "{$addtoset:{label:[33,44,55]}}", "{}");
sequoiadbDatasource.close(dbc.getSequoiadb());
}
/**
* 不存在会自动插入新记录
*
* @param cl
* @param matcher
* @param modifier
* @param hint
*/
public static void upsert(String cl, String matcher, String modifier, String hint) {
DBCollection dbc = initCollection(cl);
BSONObject ma = null;
BSONObject mo = null;
BSONObject hi = null;
if (matcher != null) {
ma = (BSONObject) JSON.parse(matcher);
}
if (modifier != null) {
mo = (BSONObject) JSON.parse(modifier);
}
if (hint != null) {
hi = (BSONObject) JSON.parse(hint);
}
dbc.upsert(ma, mo, hi);
sequoiadbDatasource.close(dbc.getSequoiadb());
}
public static String strs2json(String... key_val) {
String strJson = null;
if (key_val != null) {
StringBuilder sb = new StringBuilder();
sb.append("{");
int i = 0;
while (key_val[i] != null) {
sb.append(key_val[i]).append(":'").append(key_val[++i]).append("'");
if (i < key_val.length - 1) {
sb.append(",");
i++;
} else {
key_val[i] = null;
}
}
sb.append("}");
strJson = sb.toString();
}
return strJson;
}
public static List cur2list(DBCursor c) {
if (c != null && c.hasNext()) {
List list = new ArrayList();
while (c.hasNext()) {
list.add(c.getNext());
}
return list;
}
return null;
}
public static String cur2jsonstr(DBCursor c) {
String jsonString = "";
if (c != null && c.hasNext()) {
while (c.hasNext()) {
jsonString = jsonString + (c.getNext().toString());
}
c.close();
return jsonString;
}
return "{}";
}
private static String list2String(List list) {
if (list != null) {
StringBuilder sb = new StringBuilder();
list.stream().forEach((Object s) -> {
sb.append(s).append(",");
});
return sb.toString();
} else {
return null;
}
}
public static void main(String[] args) {
// NoSQLDb.insertNestJson(Const.TEST, "{a:'a'}","{cc:'dd'}","nestJson");
String s = "{ \"_id\": { \"$oid\": \"544634608e849c2f20465015\" }, \"a\": \"a\", \"nestJson\": { \"cc\": \"dd\" } }";
s = s.replace("\\", "");
SU.parseJSON2Map(s);
}
}