我有一个使用 Spring Boot 来处理后端逻辑的 Web 应用程序。我正在尝试集成 mongodb 来跟踪有关此网络应用程序用户的一些信息。我在 mongodb Atlas 上创建了一个数据库,并通过 Mongo Shell 连接正常。当我尝试连接 Spring 时,问题就出现了。让我向您展示所有细节
在 Atlas 内部,我将此 IP 地址(0.0.0.0/0(包括您当前的 IP 地址))添加到安全 > 网络地址中。理论上,这应该允许我从任何 IP 地址连接到数据库。
然后我创建了一个名为“test”的集合。
如果我单击我的集群,然后单击连接按钮,它会询问我要使用哪种方式进行连接。我选择“连接您的应用程序”,然后必须选择驱动程序和版本。我分别选择“Java”和“3.6或更高版本”(我不确定它是否是正确的版本,替代方案是3.4或3.3)。最后它向我显示了连接字符串:
mongodb+srv://admin:<password>@umadit-obxpb.mongodb.net/test?retryWrites=true&w=majority
Run Code Online (Sandbox Code Playgroud)
要使用 Spring 连接到 Atlas,我正在使用此依赖项
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb</artifactId>
</dependency>
Run Code Online (Sandbox Code Playgroud)
在 application.properties 文件中,我有这两行来配置 mongo。
spring.data.mongodb.host=mongodb+srv://admin:<password>@umadit-obxpb.mongodb.net/test?retryWrites=true&w=majority
spring.data.mongodb.port=27017
Run Code Online (Sandbox Code Playgroud)
出于明显的原因,我没有输入密码。
唯一的问题是,当我启动 Spring Boot 时,我继续收到此错误消息:
2020-02-25 16:31:25.605 INFO 41162 --- [=majority:27017] org.mongodb.driver.cluster : Exception in monitor thread while connecting to server mongodb+srv://admin:<password>@umadit-obxpb.mongodb.net/test?retrywrites=true&w=majority:27017
com.mongodb.MongoSocketException: mongodb+srv://admin:<password>@umadit-obxpb.mongodb.net/test?retrywrites=true&w=majority: nodename nor servname provided, or not known
at com.mongodb.ServerAddress.getSocketAddress(ServerAddress.java:188) ~[mongo-java-driver-3.6.4.jar:na]
at com.mongodb.connection.SocketStreamHelper.initialize(SocketStreamHelper.java:59) …Run Code Online (Sandbox Code Playgroud) 我在 @Service 类中有一个方法,它在两个不同的 @Service 类中调用两个不同的方法。这两种不同的方法在数据库中保存两个实体(通过休眠),它们都可能抛出一些异常。我希望如果抛出异常,独立于哪个 @Service 方法,所有更改都会回滚。所以在数据库中创建的所有实体都被删除了。
//entities
@Entity
public class ObjectB{
@Id
private long id;
...
}
@Entity
public class ObjectC{
@Id
private long id;
...
}
//servicies
@Service
@Transactional
public class ClassA{
@Autowired
private ClassB classB;
@Autowired
private ClassC classC;
public void methodA(){
classB.insertB(new ObjectB());
classC.insertC(new ObjectC());
}
}
@Service
@Transactional
public class ClassB{
@Autowired
private RepositoryB repositoryB;
public void insertB(ObjectB b){
repositoryB.save(b);
}
}
@Service
@Transactional
public class ClassC{
@Autowired
private RepositoryC repositoryC;
public void insertC(ObjectC c){ …Run Code Online (Sandbox Code Playgroud) 以下两行代码是否在GoLang中执行相同的操作?我想要做的是将一个切片复制到另一个切片:
slice1 := make([]int, 5)
slice2 := slice1 #line1
slice2 := slice1[:] #line2
Run Code Online (Sandbox Code Playgroud)
我运行此代码来测试行为,但显然它们都以相同的方式工作:
func main() {
s1 := make([]int, 5, 5)
s1[2] = 33
fmt.Printf("s1: %v: address of slice %p\n", s1, &s1)
s2 := s1[:]
s2[1] = 5
fmt.Printf("s2: %v: address of slice %p\n", s2, &s2)
s3 := s1
s3[0] = 23
fmt.Printf("s3: %v: address of slice %p\n",s3, &s3)
fmt.Printf("s2: %v: address of slice %p\n", s2, &s2)
fmt.Printf("s1: %v: address of slice %p\n", s1, &s1)
}
Run Code Online (Sandbox Code Playgroud)
输出是:
s1: [0 …Run Code Online (Sandbox Code Playgroud)