系列导航

一、swift对象存储环境搭建

二、swift添加存储策略

三、swift大对象--动态大对象

四、swift大对象--静态态大对象

五、java操作swift对象存储(官网样例)

六、java操作swift对象存储(resultful方式实现)

七、java操作swift对象存储(动态大对象)

八、java操作swift对象存储(静态大对象)

上一节讲了如何通过swift官方的样例操作swift对象存储,官方样例中,种类还是有点少工作中不够用,但是swift集群的调用支持resultful这就给我们提供了另一种调用swift的方法。那么都支持那些操作类型呢请看下表。

一、 RESTful API 总结
     资源类型         URL                                   GET                                  PUT                                   POST                    DELETE         HEAD
     账户             /account/                               获取容器列表                    -                                        -                             -                    获取账户元数据
     容器             /account/container                获取对象列表                   创建容器                            更新容器元数据     删除容器         获取容器元数据
     对象             /account/container/object     获取对象内容和元数据      创建、更新或拷贝对象       更新对象元数据     删除对象         获取对象元数据

了解了以上知识后下面进入代码部分java使用resultful方式操作swift对象存储。

二、pom.xml依赖

<dependencies>
<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpcore -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
<version>4.3.3</version>
</dependency> <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.3.6</version>
</dependency> <!--JSONArray-->
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.3</version>
</dependency>
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2.1</version>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>net.sf.ezmorph</groupId>
<artifactId>ezmorph</artifactId>
<version>1.0.6</version>
</dependency> <dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20180130</version>
</dependency>

三、方法类ResultFulBase.java

package swift.base;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream; import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.methods.HttpDelete;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.entity.ByteArrayEntity;
import org.apache.http.entity.FileEntity;
import org.apache.http.entity.InputStreamEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils; //resultFul接口方式实现基础操作(tempauth认证方式)
public class ResultFulBase { //访问swift的url地址
public static String X_Storage_Url = ""; //访问swift的令牌
public static String X_Auth_Token = ""; //分割符
private static final String separator = System.getProperty("file.separator"); public ResultFulBase(String url, String port, String user, String passwd) {
get_AUTH(url, port, user, passwd);
} //获取X-Storage-Url 和 X-Auth-Token begin
//curl http://127.0.0.1:8080/auth/v1.0 -v -H 'X-Storage-User: admin:admin' -H 'X-Storage-Pass: admin'
public void get_AUTH(String url, String port, String user, String passwd) {
try {
HttpGet req = new HttpGet("http://" + url + ":" + port + "/auth/v1.0");
req.addHeader("X-Storage-User", user);
req.addHeader("X-Storage-Pass", passwd); DefaultHttpClient httpclient = new DefaultHttpClient();
HttpResponse rsp = httpclient.execute(req);
System.out.println("----------------------------------------");
System.out.println(rsp.getStatusLine());
Header[] headers = rsp.getAllHeaders();
for (int i = 0; i < headers.length; i++) {
System.out.println(headers[i]);
}
System.out.println("----------------------------------------"); Header h1 = rsp.getFirstHeader("X-Storage-Url");
Header h2 = rsp.getFirstHeader("X-Auth-Token");
X_Storage_Url = h1.getValue();
X_Auth_Token = h2.getValue();
System.out.println(h1.getValue() + "---------" + h2.getValue());
System.out.println("----------------------------------------");
//获取X-Storage-Url 和 X-Auth-Token end
} catch (Exception e) {
e.printStackTrace();
}
} //查看账户信息
//curl http://127.0.0.1:8080/v1/AUTH_admin -v -H 'X-Auth-Token: AUTH_tkf44c48c200e34f14850f6a8e3bc63f36'
public void get_acount_info() {
try {
HttpGet req = new HttpGet(X_Storage_Url);
req.addHeader("X-Auth-Token", X_Auth_Token);
DefaultHttpClient httpclient = new DefaultHttpClient();
HttpResponse rsp = httpclient.execute(req); System.out.println("----------------------------------------");
System.out.println(rsp.getStatusLine());
Header[] headers = rsp.getAllHeaders();
for (int i = 0; i < headers.length; i++) {
System.out.println(headers[i]);
}
System.out.println("----------------------------------------");
} catch (Exception e) {
e.printStackTrace();
}
} //创建 container(container2为创建的容器名称) 按照默认策略创建容器
//curl http://127.0.0.1:8080/v1/AUTH_admin/container2 -X PUT -H "X-Auth_Token: AUTH_tkf44c48c200e34f14850f6a8e3bc63f36"
public void create_container(String containerName) {
try {
HttpPut req = new HttpPut(X_Storage_Url + "/" + containerName);
req.addHeader("X-Auth-Token", X_Auth_Token);
DefaultHttpClient httpclient = new DefaultHttpClient();
HttpResponse rsp = httpclient.execute(req); System.out.println("----------------------------------------");
System.out.println(rsp.getStatusLine());
Header[] headers = rsp.getAllHeaders();
for (int i = 0; i < headers.length; i++) {
System.out.println(headers[i]);
}
System.out.println("----------------------------------------");
} catch (Exception e) {
e.printStackTrace();
}
} //创建 container(containerpolicy2为创建的容器名称) 按照存储策略创建容器
//curl http://127.0.0.1:8080/v1/AUTH_admin/containerpolicy2 -X PUT -H "X-Auth_Token: AUTH_tk7c21eddae31d449db36a5e8596d0cb71" -H "X-Storage-Policy: silver" //Policy是存储策略的名称
public void create_container(String containerName, String Policy) {
try {
HttpPut req = new HttpPut(X_Storage_Url + "/" + containerName);
req.addHeader("X-Auth-Token", X_Auth_Token);
req.addHeader("X-Storage-Policy", Policy);
DefaultHttpClient httpclient = new DefaultHttpClient();
HttpResponse rsp = httpclient.execute(req); System.out.println("----------------------------------------");
System.out.println(rsp.getStatusLine());
Header[] headers = rsp.getAllHeaders();
for (int i = 0; i < headers.length; i++) {
System.out.println(headers[i]);
}
System.out.println("----------------------------------------");
} catch (Exception e) {
e.printStackTrace();
}
} //获取AUTH_admin账户下的容器container1的对象列表
//curl http://127.0.0.1:8080/v1/AUTH_admin/container1 -X GET -H "X-Auth_Token: AUTH_tkf44c48c200e34f14850f6a8e3bc63f36"
public void get_container_object_list(String containerName) {
try {
HttpGet req = new HttpGet(X_Storage_Url + "/" + containerName);
req.addHeader("X-Auth-Token", X_Auth_Token);
DefaultHttpClient httpclient = new DefaultHttpClient();
HttpResponse rsp = httpclient.execute(req); System.out.println("----------------------------------------");
HttpEntity entity = rsp.getEntity();
if (entity != null) {
String result = EntityUtils.toString(entity);
String[] objectList = result.split("\n");
for (int i = 0; i < objectList.length; i++) {
System.out.println("--" + objectList[i]);
}
}
System.out.println("----------------------------------------");
} catch (Exception e) {
e.printStackTrace();
}
} //获取容器下指定条数的对象列表(有的容器下对象太多,对象都拿出来服务器压力很大)
//limit 整数n,指明返回结果只包含n个值
public void get_container_object_limit_list(String containerName, int limit) {
try {
HttpGet req = new HttpGet(X_Storage_Url + "/" + containerName + "/?limit=" + limit); req.addHeader("X-Auth-Token", X_Auth_Token);
DefaultHttpClient httpclient = new DefaultHttpClient();
HttpResponse rsp = httpclient.execute(req); System.out.println("----------------------------------------");
HttpEntity entity = rsp.getEntity();
if (entity != null) {
String result = EntityUtils.toString(entity);
String[] objectList = result.split("\n");
for (int i = 0; i < objectList.length; i++) {
System.out.println("--" + objectList[i]);
}
}
System.out.println("----------------------------------------");
} catch (Exception e) {
e.printStackTrace();
}
} //获取符合查询条件的对象列表
//marker 字符串x,返回名称比这个特定的字符串x大的container列表 >=
//end_marker 字符串x,返回名称比这个特定字符串小的container列表 <
// 注: 对于md5码 对比的是 第一个字母(经验观察,不是官网内容)
public void get_container_object_marker_list(String containerName, String marker, String end_marker) {
try {
HttpGet req = new HttpGet(X_Storage_Url + "/" + containerName + "/?marker=" + marker + "&end_marker=" + end_marker); req.addHeader("X-Auth-Token", X_Auth_Token);
DefaultHttpClient httpclient = new DefaultHttpClient();
HttpResponse rsp = httpclient.execute(req); System.out.println("----------------------------------------");
HttpEntity entity = rsp.getEntity();
if (entity != null) {
String result = EntityUtils.toString(entity);
String[] objectList = result.split("\n");
for (int i = 0; i < objectList.length; i++) {
System.out.println("--" + objectList[i]);
}
}
System.out.println("----------------------------------------");
} catch (Exception e) {
e.printStackTrace();
}
} //创建、更新或拷贝对象
//curl http://127.0.0.1:8080/v1/AUTH_admin/container1/1.txt -X PUT -T 1.txt -H "X-Auth_Token: AUTH_tkf44c48c200e34f14850f6a8e3bc63f36"
public void create_object(String containerName, String objectName, String filePath) {
try {
HttpPut req = new HttpPut(X_Storage_Url + "/" + containerName + "/" + objectName);
req.addHeader("X-Auth-Token", X_Auth_Token); File file = new File(filePath);
FileEntity entity1 = new FileEntity(file, "text/plain; charset=\"UTF-8\"");
req.addHeader("Content-Type", "image/jpeg");
req.addHeader("Content-Type", "text/plain; charset=\"UTF-8\"");
req.setEntity(entity1); DefaultHttpClient httpclient = new DefaultHttpClient();
HttpResponse rsp = httpclient.execute(req); System.out.println("----------------------------------------");
System.out.println(rsp.getStatusLine());
Header[] headers = rsp.getAllHeaders();
for (int i = 0; i < headers.length; i++) {
System.out.println(headers[i]);
}
System.out.println("----------------------------------------"); } catch (Exception e) {
e.printStackTrace();
}
} //创建对象及Meta
//curl http://127.0.0.1:8080/v1/AUTH_admin/container1/1.txt -X PUT -T 1.txt -H "X-Auth_Token: AUTH_tkf44c48c200e34f14850f6a8e3bc63f36"
public void create_object_meta(String containerName, String objectName, String filePath) {
try {
HttpPut req = new HttpPut(X_Storage_Url + "/" + containerName + "/" + objectName);
req.addHeader("X-Auth-Token", X_Auth_Token);
req.addHeader("X-Object-Meta-idNum", "123123123"); File file = new File(filePath);
FileEntity entity1 = new FileEntity(file, "text/plain; charset=\"UTF-8\"");
req.addHeader("Content-Type", "image/jpeg");
req.addHeader("Content-Type", "text/plain; charset=\"UTF-8\"");
req.setEntity(entity1); DefaultHttpClient httpclient = new DefaultHttpClient();
HttpResponse rsp = httpclient.execute(req); System.out.println("----------------------------------------");
System.out.println(rsp.getStatusLine());
Header[] headers = rsp.getAllHeaders();
for (int i = 0; i < headers.length; i++) {
System.out.println(headers[i]);
}
System.out.println("----------------------------------------"); } catch (Exception e) {
e.printStackTrace();
}
} //获取对象内容和元数据
//curl http://127.0.0.1:8080/v1/AUTH_admin/container1/2.txt -X GET -H "X-Auth_Token: AUTH_tkf44c48c200e34f14850f6a8e3bc63f36"
public void get_container_object(String containerName, String objectName, String path) {
try {
HttpGet req = new HttpGet(X_Storage_Url + "/" + containerName + "/" + objectName);
req.addHeader("X-Auth-Token", X_Auth_Token);
DefaultHttpClient httpclient = new DefaultHttpClient();
HttpResponse rsp = httpclient.execute(req);
if (HttpStatus.SC_OK == rsp.getStatusLine().getStatusCode()) {
HttpEntity entity = rsp.getEntity();
if (entity != null) {
InputStream input = entity.getContent();
write(input, path);
}
} Header[] headers = rsp.getAllHeaders();
for (int i = 0; i < headers.length; i++) {
System.out.println(headers[i]);
}
System.out.println("----------------------------------------");
} catch (Exception e) {
e.printStackTrace();
}
} //判断文件是否存在
//curl http://127.0.0.1:8080/v1/AUTH_admin/container1/2.txt -X GET -H "X-Auth_Token: AUTH_tkf44c48c200e34f14850f6a8e3bc63f36"
public boolean exist_container_object(String containerName, String objectName) {
boolean result = false;
try {
HttpGet req = new HttpGet(X_Storage_Url + "/" + containerName + "/" + objectName);
req.addHeader("X-Auth-Token", X_Auth_Token);
DefaultHttpClient httpclient = new DefaultHttpClient();
HttpResponse rsp = httpclient.execute(req);
if (HttpStatus.SC_OK == rsp.getStatusLine().getStatusCode()) {
HttpEntity entity = rsp.getEntity();
if (entity != null) {
result = true;
}
}
} catch (Exception e) {
e.printStackTrace();
}
return result;
} //删除对象
// curl http://127.0.0.1:8080/v1/AUTH_admin/container1/2.txt -X DELETE -H "X-Auth_Token: AUTH_tkf44c48c200e34f14850f6a8e3bc63f36"
public void delete_object(String containerName, String objectName) {
try {
HttpDelete req = new HttpDelete(X_Storage_Url + "/" + containerName + "/" + objectName);
req.addHeader("X-Auth-Token", X_Auth_Token);
DefaultHttpClient httpclient = new DefaultHttpClient();
HttpResponse rsp = httpclient.execute(req);
Header[] headers = rsp.getAllHeaders();
for (int i = 0; i < headers.length; i++) {
System.out.println(headers[i]);
}
System.out.println("----------------------------------------");
} catch (Exception e) {
e.printStackTrace();
}
} //写文件
private void write(InputStream is, String path) {
try {
OutputStream stream = new BufferedOutputStream(new FileOutputStream(path));
int bufferSize = 1024;
byte[] buffer = new byte[bufferSize];
int len = 0;
while ((len = is.read(buffer)) != -1) {
stream.write(buffer, 0, len);
}
stream.close();
} catch (IOException e) {
throw new RuntimeException(e.getMessage(), e);
} } //以文件地址方式向容器中放入数据,数据名称为文件的md5码
public void create_md5_object(String containerName, String filePath) {
try {
String objectName = " "; objectName = DigestUtils.md5Hex(new FileInputStream(filePath));
System.out.println(objectName); HttpPut req = new HttpPut(X_Storage_Url + "/" + containerName + "/" + objectName);
req.addHeader("X-Auth-Token", X_Auth_Token); File file = new File(filePath); FileInputStream fileInputStream = new FileInputStream(file);
InputStreamEntity reqEntity = new InputStreamEntity(fileInputStream, file.length()); req.addHeader("Content-Type", "application/octet-stream");
req.setEntity(reqEntity); DefaultHttpClient httpclient = new DefaultHttpClient();
HttpResponse rsp = httpclient.execute(req); System.out.println("----------------------------------------");
System.out.println(rsp.getStatusLine());
Header[] headers = rsp.getAllHeaders();
for (int i = 0; i < headers.length; i++) {
System.out.println(headers[i]);
}
System.out.println("----------------------------------------"); } catch (Exception e) {
e.printStackTrace();
}
} //以文件base64编码方式向容器中放入数据,数据名称为文件的md5码
public void create_base64_object(String containerName, String base64String) {
try {
String objectName = " "; objectName = DigestUtils.md5Hex(base64String);
System.out.println(objectName); HttpPut req = new HttpPut(X_Storage_Url + "/" + containerName + "/" + objectName);
req.addHeader("X-Auth-Token", X_Auth_Token); byte[] content = Base64.decodeBase64(base64String); ByteArrayEntity reqEntity = new ByteArrayEntity(content);
req.addHeader("Content-Type", "application/octet-stream");
req.setEntity(reqEntity); DefaultHttpClient httpclient = new DefaultHttpClient();
HttpResponse rsp = httpclient.execute(req); System.out.println("----------------------------------------");
System.out.println(rsp.getStatusLine());
Header[] headers = rsp.getAllHeaders();
for (int i = 0; i < headers.length; i++) {
System.out.println(headers[i]);
}
System.out.println("----------------------------------------"); } catch (Exception e) {
e.printStackTrace();
}
} //以文件base64编码方式向容器中放入数据,数据名称为文件的md5码
public void create_base64_object(String containerName, String base64String, String objectName) {
try {
HttpPut req = new HttpPut(X_Storage_Url + "/" + containerName + "/" + objectName);
req.addHeader("X-Auth-Token", X_Auth_Token); byte[] content = Base64.decodeBase64(base64String); ByteArrayEntity reqEntity = new ByteArrayEntity(content);
req.addHeader("Content-Type", "application/octet-stream");
req.setEntity(reqEntity); DefaultHttpClient httpclient = new DefaultHttpClient();
HttpResponse rsp = httpclient.execute(req); System.out.println("----------------------------------------");
System.out.println(rsp.getStatusLine());
Header[] headers = rsp.getAllHeaders();
for (int i = 0; i < headers.length; i++) {
System.out.println(headers[i]);
}
System.out.println("----------------------------------------"); } catch (Exception e) {
e.printStackTrace();
}
} //以文件base64编码方式向容器中放入数据,数据名称为文件的md5码
public void create_base64_object(String containerName, String base64String, String objectName, String metaData) {
try {
HttpPut req = new HttpPut(X_Storage_Url + "/" + containerName + "/" + objectName);
req.addHeader("X-Auth-Token", X_Auth_Token);
req.addHeader("X-Object-Meta-idNum", metaData); byte[] content = Base64.decodeBase64(base64String); ByteArrayEntity reqEntity = new ByteArrayEntity(content);
req.addHeader("Content-Type", "application/octet-stream");
req.setEntity(reqEntity); DefaultHttpClient httpclient = new DefaultHttpClient();
HttpResponse rsp = httpclient.execute(req); System.out.println("----------------------------------------");
System.out.println(rsp.getStatusLine());
Header[] headers = rsp.getAllHeaders();
for (int i = 0; i < headers.length; i++) {
System.out.println(headers[i]);
}
System.out.println("----------------------------------------"); } catch (Exception e) {
e.printStackTrace();
}
} //写入Temp-URL-Key
public void create_key(String key) {
try {
HttpPut req = new HttpPut(X_Storage_Url);
req.addHeader("X-Auth-Token", X_Auth_Token);
req.addHeader("Content-Type", "image/jpeg"); req.addHeader("X-Account-Meta-Temp-Url-Key", key);
req.addHeader("Content-Type", "text/plain; charset=\"UTF-8\""); DefaultHttpClient httpclient = new DefaultHttpClient();
HttpResponse rsp = httpclient.execute(req); System.out.println("----------------------------------------");
System.out.println(rsp.getStatusLine());
Header[] headers = rsp.getAllHeaders();
for (int i = 0; i < headers.length; i++) {
System.out.println(headers[i]);
}
System.out.println("----------------------------------------"); } catch (Exception e) {
e.printStackTrace();
}
} }

四、方法调用的主类ResultFulBaseMain.java

package swift.main;

import swift.base.ResultFulBase;

//resultFulBase.Java的调用测试
public class ResultFulBaseMain { /**
* @param args
*/
public static void main(String[] args) {
ResultFulBase resultFulBase = new ResultFulBase("192.168.0.1", "8080", "admin:admin", "admin"); //一、获取连接swift的连接和令牌
resultFulBase.get_AUTH("192.168.0.1","8080","admin:admin","admin"); //二、查看账户信息
resultFulBase.get_acount_info(); //三、按照默认存储策略创建容器
resultFulBase.create_container("containerName1"); //四、指定存储策略创建容器
resultFulBase.create_container("containerName2","silver"); //五、查看容器下对象列表
resultFulBase.get_container_object_list("containerName1"); //六、获取容器下指定条数的对象列表
resultFulBase.get_container_object_limit_list("containerName1",2); //七、获取符合查询条件的对象列表
resultFulBase.get_container_object_marker_list("containerName1","1","9"); //八、创建对象
resultFulBase.create_object("containerName2","1.txt","E://1.txt"); //九、创建对象及对象的属性Meta
resultFulBase.create_object_meta("containerName2","2.txt","E://2.txt"); //十、获取对象内容和元数据
resultFulBase.get_container_object("containerName2","2.txt","E://99.txt"); //十一、判断文件是否存在 boolean flag = resultFulBase.exist_container_object("containerName2","2.txt" );
System.out.println(flag); flag = resultFulBase.exist_container_object("containerName2","4.txt" );
System.out.println(flag); //十二、删除对象
resultFulBase.delete_object("containerName2","1.txt" ) ; //十三、以文件地址方式向容器中放入数据,数据名称为文件的md5码
resultFulBase.create_md5_object("containerName2","E://1.txt"); //十四、以文件base64编码方式向容器中放入数据,数据名称为文件的md5码
resultFulBase.create_base64_object("containerName2","txbb01d60aaa174f26b20e5-005eec4823"); //十五、写入Temp-URL-Key
resultFulBase.create_key("1233"); } }

六、java操作swift对象存储(resultful方式实现)的更多相关文章

  1. Hbase深入学习(六) Java操作HBase

    Hbase深入学习(六) ―― Java操作HBase 本文讲述如何用hbase shell命令和hbase java api对hbase服务器进行操作. 先看以下读取一行记录hbase是如何进行工作 ...

  2. openstack-r版(rocky)搭建基于centos7.4 的openstack swift对象存储服务 四

    openstack-r版(rocky)搭建基于centos7.4 的openstack swift对象存储服务 一 openstack-r版(rocky)搭建基于centos7.4 的openstac ...

  3. openstack-r版(rocky)搭建基于centos7.4 的openstack swift对象存储服务 三

    openstack-r版(rocky)搭建基于centos7.4 的openstack swift对象存储服务 一 openstack-r版(rocky)搭建基于centos7.4 的openstac ...

  4. openstack-r版(rocky)搭建基于centos7.4 的openstack swift对象存储服务 二

    openstack-r版(rocky)搭建基于centos7.4 的openstack swift对象存储服务 一 openstack-r版(rocky)搭建基于centos7.4 的openstac ...

  5. openstack-r版(rocky)搭建基于centos7.4 的openstack swift对象存储服务 一

    openstack-r版(rocky)搭建基于centos7.4 的openstack swift对象存储服务 一 openstack-r版(rocky)搭建基于centos7.4 的openstac ...

  6. swift对象存储

    swift对象存储 简介 OpenStack Object Storage(Swift)是OpenStack开源云计算项目的子项目之一,被称为对象存储,提供了强大的扩展性.冗余和持久性.对象存储,用于 ...

  7. 九、Swift对象存储服务(双节点搭建)

    九.Swift对象存储服务(双节点搭建) 要求:Controoler节点需要2块空盘 Compute节点需要再加2块空盘 本次搭建采用Controller 和 Compute双节点节点做swift组件 ...

  8. Golang 调用 aws-sdk 操作 S3对象存储

    Golang 调用 aws-sdk 操作 S3对象存储 前言 因为业务问题,要写一个S3对象存储管理代码,由于一直写Go,所以这次采用了Go,Go嘛,快,自带多线程,这种好处就不用多说了吧. 基础的功 ...

  9. swift对象存储安装

    对象存储服务概览 OpenStack对象存储是一个多租户的对象存储系统,它支持大规模扩展,可以以低成本来管理大型的非结构化数据,通过RESTful HTTP 应用程序接口. 它包含下列组件: 代理服务 ...

  10. Java操作Sqoop对象

    Windows下使用Eclipse工具操作Sqoop1.4.6对象 Sqoop是用来在关系型数据库与Hadoop之间进行数据的导入导出,Windows下使用Eclipse工具操作时,需要先搭建好Had ...

随机推荐

  1. IDEA提示Cannot resolve method 'getContextPath()'

    一.问题原因: 二.解决方案: 1.打开Project Structure 2.new一个新的Java的project library文件 3.选择tomcat路径下的lib文件夹. 三.完成 可以看 ...

  2. 【UniApp】-uni-app-OptionAPI应用生命周期和页面生命周期

    前言 好,经过上个章节的介绍完毕之后,了解了一下 uni-app-修改组件主题和样式 那么了解完了uni-app-修改组件主题和样式之后,这篇文章来给大家介绍一下 uni-app-OptionAPI应 ...

  3. Chrome扩展开发实战:快速填充表单

    大家好,我是 dom 哥.我正在写关于 Chrome 扩展开发的系列文章,感兴趣的可以 点个小星星 . 填表单是打工人经常面对的场景,作为一个前端,我经常开发一些PC端的页面,它们主要由表单和表格构成 ...

  4. ROW_NUMBER 开窗函数优化方案(Oracle && PostgreSQL 性能比对)

    帮朋友优化一条很简单的窗口函数 ROW_NUMBER() OVER() , Oracle 迁移 PostgreSQL项目. 原始SQL和执行计划 STUDENT_BAK 表我模拟的数据,3千万行数据. ...

  5. Oracle-Rman备份全解析

    RMAN备份数据库物理文件到备份集(backupset)中.在创建备份集时,仅备份已经使用的数据库(不备份空闲的数据块),而且还可以采用压缩功能. RMAN恢复时指当数据库出现介质失败时,使用RMAN ...

  6. 初探Git:理解和使用版本控制的魔法

    遥远的古代,有一位美丽的仙女叫做嫦娥.她的丈夫后羿获得了令人长生不老的鹿骨露.一天,嫦娥在好奇心的驱使下,独自偷喝了这瓶仙药. 喝下仙药的瞬间,嫦娥发现自己开始飘起,越飘越高,最后飘向了月亮.嫦娥惊慌 ...

  7. 半小时实现GPT纯血鸿蒙版

    仅需半小时,即可实现纯血鸿蒙版本的ChatGPT! 废话少说,先看效果图: 如上图所示,这个小Demo实现了AI智能问答.靠右加粗的文本是用户点击底部提交按钮后出现的:后面靠左对齐的普通文本是来自AI ...

  8. 文心一言 VS 讯飞星火 VS chatgpt (34)-- 算法导论5.3 1题

    一.Marceau 教授不同意引理 5.5 证明中使用的循环不变式.他对第1次送代之前循环不变式是否为真提出质疑.他的理由是,我们可以很容易宣称一个空数组不包含0排列.因此一个空的子数组包含一个0排列 ...

  9. Quartz.Net系列(十八):Quartz.Net中通过SQLServer实现对Job、Trigger持久化存储

    1.介绍 RAMJobStore:一但关闭应用程序,数据全部丢失 Quartz中提供了两种方式配置数据库 JobStoreTx:带有事务的 JobStoreCMT:不带事务的

  10. 容器中域名解析流程以及不同dnsPolicy对域名解析影响

    本文分享自华为云社区<容器中域名解析流程以及不同dnsPolicy对域名解析影响>,作者:可以交个朋友 . 一.coreDNS背景 部署在kubernetes集群中的容器业务通过coreD ...