我注意到与PostgreSQL的连接非常慢.
import psycopg2
import time
start_time = time.time()
try:
db = psycopg2.connect("dbname='xx' user='xxx' host='127.0.0.1' password='xxx' port='5433'")
except Exception as e:
print(e)
exit(1)
print('connect time', time.time() - start_time)
Run Code Online (Sandbox Code Playgroud)
通常的连接时间为2.5-3.5秒.连接时间3.3095390796661377
它几乎是新安装的PostgreSQL的默认配置.我关闭了log_hostname但它没有改变任何东西.我已经运行了PostgreSQL 9.4和10,两者都有同样的问题.我正在使用这台机器进行开发,但即便如此,我注意到它,因为我的Django请求需要2.5-3.5秒,这使得即使对于开发也难以忍受.
Windows 10 Python 2/3 psycopg2 2.7.4
这里有来自PostgreSQL的max debug的相关日志
2018-03-19 21:24:43.654 +03 [10048] DEBUG: 00000: forked new backend, pid=21268 socket=5072
2018-03-19 21:24:43.654 +03 [10048] LOCATION: BackendStartup, postmaster.c:4099
2018-03-19 21:24:45.248 +03 [21268] LOG: 00000: connection received: host=127.0.0.1 port=9897
Run Code Online (Sandbox Code Playgroud)
它分叉新的后端,然后仅2秒后收到日志连接
UPD
即使我设法避免PostgreSQL的连接延迟(例如通过pgbouncer,或者如果PostgreSQL在docker中运行)请求仍然需要1.3-2秒,但从第一个发送包到最后只有0.022秒,所有其他时间idk发生了什么但是不是客户端和服务器之间的网络通信.如果在docker中运行相同的代码 - 0.025秒.从Windows - 1.3-2秒但网络交互只有0.022秒
实际上有两个问题可能是由同一件事或不同引起的,不知道.
1)由于未知原因,Postgresql没有发送数据包1.8秒
2)即使第一个问题被消除,网络交互下降到0.022秒,整个事情仍需要1.3-2秒(使用psql或psycopg2)
我正在编写一个客户端来使用RestService,我必须从响应中读取一个实体,我完全混淆了应该使用哪个方法(getEntityvs readEntity).
每当我收到WebApplicationException时,我都必须检索实体.
所以,我的代码或多或少看起来像.
catch(WebApplicationException ex) {
// Do something with ex.getResponse
}
Run Code Online (Sandbox Code Playgroud)
从我测试过的,
ex.getResponse().hasEntity() ---> true
ex.getResponse().getEntity() == null ---> true
Run Code Online (Sandbox Code Playgroud)
我不知道它是如何工作的,但如果第一个是真的,那么第二个陈述是如何成真的.
令人惊讶的是,readEntity对我来说很好,我能够从响应中读出实体.
但是,通过readEntity读取实体后,
这个电话给出了错误.
ex.getResponse().getEntity() == null --> false
Run Code Online (Sandbox Code Playgroud)
有人能帮我理解幕后真的发生了什么吗?
我必须开发一个组件,其中 API 本质上是异步的。为了开发这个异步模型,我将使用 Aws SQS 队列来发布消息,客户端将从队列中读取并将响应发送回队列。现在我必须公开 10 个 API(当前)。目前,我可以考虑为所有 API 设置一个请求和一个响应队列(我将轮询),并且 API 的有效负载可以由某些操作定义。另一种方法是为每个 API 使用单独的队列。我可以看到多个队列的优点是每个 API 可以有不同的流量,拥有多个队列可以帮助队列的客户端有效地扩展。这两种方法的其他优缺点是什么?
我目前正在制作一项服务,其中有很多公共 API。并且响应和请求对象重叠很多。所以,我在想有没有一种方法可以概括请求/响应对象的 pojo 创建。有时,响应对象与具有一两个额外字段的请求对象相同。
让我给你举个例子。
@Data
public class Request {
private A objA;
private B objB;
}
@Data
public class Response {
private A objA;
private B objB;
private C objC;
}
@Data
public class A {
private D objD;
}
@Data
public class B {
private String sB;
private E obje;
}
@Data
public class C {
private String sC;
}
Run Code Online (Sandbox Code Playgroud)
类似地,D 和 E 也是 pojo。问题是请求/响应对象中有很多相似之处(重叠字段)。
我有一个类结构,如
Class A {
int val;
}
Class B {
A a;
}
Class C {
B b;
}
Run Code Online (Sandbox Code Playgroud)
现在,所有类都来自第三方服务,我从中获得响应,我想读取int值.但我不想做类似的事情
假设c是C类型的变量.
if (c != null && c.getb != null) {
B b = c.getb()
and so on.
}
Run Code Online (Sandbox Code Playgroud)
我想避免这些空检查,因为实际上这些pojos是非常分层的并且在它们中有很多字段.
我试过用
Optional<Integer> val = Optional.ofNullable(c.getb().geta().getval());
val.elseThrow(Ex::new)
Run Code Online (Sandbox Code Playgroud)
但这不是正确的方法(如果b不存在则抛出空指针异常,因为int上是可选的).我怎么办才能解决这样一种情况,即我无法控制Pojos的声明,但又想避免牛市检查?
我有一个下游服务,我想将其 bean 映射到我的 bean。但是使用mapstruct似乎有问题。
来自下游服务的 Pojo(我无法更改其定义)
@ToString
@Getter
@Setter
@Accessors(fluent = true)
public class PojoA {
private String stringA;
private int integer;
}
Run Code Online (Sandbox Code Playgroud)
我想把它转换成 PojoB
@Setter
@Getter
@ToString
public class PojoB {
private String stringB;
private int integer;
}
Run Code Online (Sandbox Code Playgroud)
映射器接口
@Mapper
public interface PojoMapper {
PojoMapper INSTANCE = Mappers.getMapper(PojoMapper.class);
@Mapping(source = "stringA", target = "stringB")
PojoB pojoAToPojoB(PojoA pojoA);
}
Run Code Online (Sandbox Code Playgroud)
这失败了,因为它无法找到 getter 作为 fluent 从 getter 中删除前缀,我知道 mapstruct 生成映射器接口的实现并使用 bean 规范(即获取和设置前缀)
有没有办法克服它?
#include<utility>
#include<alogrithm>
#include<iostream>
using namespace std;
int main(void)
{
int n=5;
int s[]={3,5,1,5,5};
auto r=minmax_element(s,s+n);
cout<<r.second-s<<endl;
cout<<*r.second;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是使用索引打印数组中最大元素的代码.我想要索引最小的最大元素(如果是平局,则为第一个最大值)