Berkeley DB 数据库的使用示例,je

code

1import java.io.File; 2import java.io.UnsupportedEncodingException; 3import java.util.ArrayList; 4 5import com.sleepycat.je.Cursor; 6import com.sleepycat.je.CursorConfig; 7import com.sleepycat.je.Database; 8import com.sleepycat.je.DatabaseConfig; 9import com.sleepycat.je.DatabaseEntry; 10import com.sleepycat.je.Environment; 11import com.sleepycat.je.EnvironmentConfig; 12import com.sleepycat.je.LockConflictException; 13import com.sleepycat.je.LockMode; 14import com.sleepycat.je.OperationStatus; 15import com.sleepycat.je.Transaction; 16import com.sleepycat.je.TransactionConfig; 17 18public class BDB { 19 // 数据库环境 20 private Environment env = null; 21 22 // 数据库 23 private final Database frontierDatabase; 24 25 // 数据库名 26 private final String dbName; 27 28 public BDB(String homeDirectory,String dbName) { 29 30 // 1、创建EnvironmentConfig 31 EnvironmentConfig envConfig = new EnvironmentConfig(); 32 envConfig.setTransactional(false); 33 envConfig.setAllowCreate(true); 34 35 // 2、使用EnvironmentConfig配置Environment 36 env = new Environment(new File(homeDirectory), envConfig); 37 38 // 3、创建DatabaseConfig 39 DatabaseConfig dbConfig = new DatabaseConfig(); 40 dbConfig.setTransactional(false); 41 dbConfig.setAllowCreate(true); 42 43 // 4、使用Environment与DatabaseConfig打开Database 44 frontierDatabase = env.openDatabase(null, dbName, dbConfig); 45 this.dbName = dbName; 46 } 47 48 /* 49 * 向数据库中写入记录,并判断是否可以有重复数据。 传入key和value 50 * 若可以有重复数据,则直接使用put()即可,若不能有重复数据,则使用putNoOverwrite()。 51 */ 52 public boolean writeToDatabase(String key, String value, boolean isOverwrite) { 53 try { 54 // 设置key/value,注意DatabaseEntry内使用的是bytes数组 55 DatabaseEntry theKey = new DatabaseEntry(key.getBytes("UTF-8")); 56 DatabaseEntry theData = new DatabaseEntry(value.getBytes("UTF-8")); 57 OperationStatus status = null; 58 Transaction txn = null; 59 try { 60 // 1、Transaction配置 61 TransactionConfig txConfig = new TransactionConfig(); 62 txConfig.setSerializableIsolation(true); 63 txn = env.beginTransaction(null, txConfig); 64 // 2、写入数据 65 if (isOverwrite) { 66 status = frontierDatabase.put(txn, theKey, theData); 67 } else { 68 status = frontierDatabase.putNoOverwrite(txn, theKey, theData); 69 } 70 txn.commit(); 71 if (status == OperationStatus.SUCCESS) { 72// System.out.println("向数据库" + dbName + "中写入:" + key + "," + value); 73 return true; 74 } else if (status == OperationStatus.KEYEXIST) { 75// System.out.println("向数据库" + dbName + "中写入:" + key + "," + value + "失败,该值已经存在"); 76 return false; 77 } else { 78// System.out.println("向数据库" + dbName + "中写入:" + key + "," + value + "失败"); 79 return false; 80 } 81 } catch (LockConflictException lockConflict) { 82 txn.abort(); 83 System.out.println("向数据库" + dbName + "中写入:" + key + "," + value + "出现lock异常"); 84 return false; 85 } 86 } catch (Exception e) { 87 // 错误处理 88 System.out.println("向数据库" + dbName + "中写入:" + key + "," + value + "出现错误"); 89 90 return false; 91 } 92 } 93 94 /* 95 * 从数据库中读出数据 传入key 返回value 96 */ 97 public String readFromDatabase(String key) { 98 try { 99 DatabaseEntry theKey = new DatabaseEntry(key.getBytes("UTF-8")); 100 DatabaseEntry theData = new DatabaseEntry(); 101 Transaction txn = null; 102 try { 103 // 1、配置 Transaction相关信息 104 TransactionConfig txConfig = new TransactionConfig(); 105 txConfig.setSerializableIsolation(true); 106 txn = env.beginTransaction(null, txConfig); 107 // 2、读取数据 108 OperationStatus status = frontierDatabase.get(txn, theKey, theData, LockMode.DEFAULT); 109 txn.commit(); 110 if (status == OperationStatus.SUCCESS) { 111 // 3、将字节转换成String 112 byte[] retData = theData.getData(); 113 String value = new String(retData, "UTF-8"); 114 System.out.println("从数据库" + dbName + "中读取:" + key + "," + value); 115 return value; 116 } else { 117 System.out.println("No record found for key '" + key + "'."); 118 return ""; 119 } 120 } catch (LockConflictException lockConflict) { 121 txn.abort(); 122 System.out.println("从数据库" + dbName + "中读取:" + key + "出现lock异常"); 123 return ""; 124 } 125 126 } catch (UnsupportedEncodingException e) { 127 e.printStackTrace(); 128 129 return ""; 130 } 131 } 132 133 /* 134 * 遍历数据库中的所有记录,返回list 135 */ 136 public ArrayList<String> getEveryItem() { 137 // TODO Auto-generated method stub 138 System.out.println("===========遍历数据库" + dbName + "中的所有数据=========="); 139 Cursor myCursor = null; 140 ArrayList<String> resultList = new ArrayList<String>(); 141 Transaction txn = null; 142 try { 143 txn = this.env.beginTransaction(null, null); 144 CursorConfig cc = new CursorConfig(); 145 cc.setReadCommitted(true); 146 if (myCursor == null) 147 myCursor = frontierDatabase.openCursor(txn, cc); 148 DatabaseEntry foundKey = new DatabaseEntry(); 149 DatabaseEntry foundData = new DatabaseEntry(); 150 // 使用cursor.getPrev方法来遍历游标获取数据 151 if (myCursor.getFirst(foundKey, foundData, LockMode.DEFAULT) == OperationStatus.SUCCESS) { 152 String theKey = new String(foundKey.getData(), "UTF-8"); 153 String theData = new String(foundData.getData(), "UTF-8"); 154 resultList.add(theKey); 155 System.out.println("Key | Data : " + theKey + " | " + theData + ""); 156 while (myCursor.getNext(foundKey, foundData, LockMode.DEFAULT) == OperationStatus.SUCCESS) { 157 theKey = new String(foundKey.getData(), "UTF-8"); 158 theData = new String(foundData.getData(), "UTF-8"); 159 resultList.add(theKey); 160 System.out.println("Key | Data : " + theKey + " | " + theData + ""); 161 } 162 } 163 myCursor.close(); 164 txn.commit(); 165 return resultList; 166 } catch (UnsupportedEncodingException e) { 167 e.printStackTrace(); 168 return null; 169 } catch (Exception e) { 170 System.out.println("getEveryItem处理出现异常"); 171 172 txn.abort(); 173 if (myCursor != null) { 174 myCursor.close(); 175 } 176 return null; 177 } 178 } 179 180 /* 181 * 根据key值删除数据库中的一条记录 182 */ 183 public boolean deleteFromDatabase(String key) { 184 boolean success = false; 185 long sleepMillis = 0; 186 for (int i = 0; i < 3; i++) { 187 if (sleepMillis != 0) { 188 try { 189 Thread.sleep(sleepMillis); 190 } catch (InterruptedException e) { 191 e.printStackTrace(); 192 } 193 sleepMillis = 0; 194 } 195 Transaction txn = null; 196 try { 197 // 1、使用cursor.getPrev方法来遍历游标获取数据 198 TransactionConfig txConfig = new TransactionConfig(); 199 txConfig.setSerializableIsolation(true); 200 txn = env.beginTransaction(null, txConfig); 201 DatabaseEntry theKey; 202 theKey = new DatabaseEntry(key.getBytes("UTF-8")); 203 204 // 2、删除数据 并提交 205 OperationStatus res = frontierDatabase.delete(txn, theKey); 206 txn.commit(); 207 if (res == OperationStatus.SUCCESS) { 208 System.out.println("从数据库" + dbName + "中删除:" + key); 209 success = true; 210 return success; 211 } else if (res == OperationStatus.KEYEMPTY) { 212 System.out.println("没有从数据库" + dbName + "中找到:" + key + "。无法删除"); 213 } else { 214 System.out.println("删除操作失败,由于" + res.toString()); 215 } 216 return false; 217 } catch (UnsupportedEncodingException e) { 218 e.printStackTrace(); 219 return false; 220 } catch (LockConflictException lockConflict) { 221 System.out.println("删除操作失败,出现lockConflict异常"); 222 sleepMillis = 1000; 223 224 continue; 225 } finally { 226 if (!success) { 227 if (txn != null) { 228 txn.abort(); 229 } 230 } 231 } 232 } 233 return false; 234 } 235 236 public void closeDB() { 237 if (frontierDatabase != null) { 238 frontierDatabase.close(); 239 } 240 if (env != null) { 241 env.close(); 242 } 243 } 244}
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

java将前端的json数组字符串转换为列表

记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )