Search K
Appearance
Appearance
jps(Java Virtual Machine Process Status Tool)是JDK提供的一个可以列出正在运行的Java虚拟机的进程信息的命令行工具,它可以显示Java虚拟机进程的执行主类(Main Class,main()函数所在的类)名称、本地虚拟机唯一ID(LVMID,Local Virtual Machine Identifier)等信息。另外,jps命令只能显示它有访问权限的Java进程的信息。
options 参数选项 | 作用 |
---|---|
-q | 只输出进程 ID,省略主类的名称 |
-m | 输出虚拟机进程启动时传递给主类 main() 方法的参数 |
-l | 输出主类的名称,如果进程执行的是 JAR 包,则输出 JAR 文件的路径 |
-v | 输出虚拟机进程启动时的 JVM 参数 |
数据库同步是确保多个数据库之间数据一致性的关键过程。以下是一些常见的数据库同步方法:
主从同步:
双主同步:
分布式同步:
日志复制同步:
基于时间戳的同步:
除了上述方法外,还有一些数据库同步工具可以帮助实现数据库同步,如Flyway、Liquibase和SymmetricDS等。这些工具提供了自动化和可视化的同步功能,简化了数据库同步的过程。 在选择合适的数据库同步方法时,需要根据具体的业务需求、系统架构和数据一致性要求进行综合考虑。同时,还需要注意同步过程中的性能问题、数据冲突解决以及数据备份和恢复等方面的挑战。
UserMapper.xml
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.UserMapper">
<!-- 自定义查询,使用IN语句 -->
<select id="selectUsersByIds" resultType="com.example.model.User">
SELECT * FROM user
WHERE id IN
<foreach item="id" index="index" collection="ids" open="(" separator="," close=")">
#{id}
</foreach>
</select>
<select id="selectUsersByNames" resultType="com.example.model.User">
SELECT * FROM user
<where>
<!-- 可以通过if语句判断值是否存在 -->
<if test="names != null and names.size() > 0">
AND name IN
<foreach item="name" index="index" collection="names" open="(" separator="," close=")">
#{name}
</foreach>
</if>
</where>
</select>
</mapper>
在UserService
接口中定义方法 UserService.java
package com.example.mapper;
import com.example.model.User;
import java.util.List;
public interface UserMapper extends BaseMapper<User> {
// 自定义方法,与XML中的select元素的id对应
List<User> selectUsersByIds(List<Integer> ids);
}
如何使用:
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public List<User> findUsersByIds(List<Integer> ids) {
return userMapper.selectUsersByIds(ids);
}
}
转载地址:https://www.cnblogs.com/moonz-wu/archive/2011/01/11/1932473.html
在设计模式中对Builder模式的定义是用于构建复杂对象的一种模式,所构建的对象往往需要多步初始化或赋值才能完成。那么,在实际的开发过程中,我们哪些地方适合用到Builder模式呢?其中使用Builder模式来替代多参数构造函数是一个比较好的实践法则。
我们常常会面临编写一个这样的实现类(假设类名叫DoDoContact),这个类拥有多个构造函数,
DoDoContact(String name);
DoDoContact(String name, int age);
DoDoContact(String name, int age, String address);
DoDoContact(String name, int age, String address, int cardID);
这样一系列的构造函数主要目的就是为了提供更多的客户调用选择,以处理不同的构造请求。这种方法很常见,也很有效力,但是它的缺点也很多。类的作者不得不书写多种参数组合的构造函数,而且其中还需要设置默认参数值,这是一个需要细心而又枯燥的工作。其次,这样的构造函数灵活性也不高,而且在调用时你不得不提供一些没有意义的参数值,例如,DoDoContact("Ace", -1, "SH"),显然年龄为负数没有意义,但是你又不的不这样做,得以符合Java的规范。如果这样的代码发布后,后面的维护者就会很头痛,因为他根本不知道这个-1是什么含义。对于这样的情况,就非常适合使用Builder模式。Builder模式的要点就是通过一个代理来完成对象的构建过程。这个代理职责就是完成构建的各个步骤,同时它也是易扩展的。下面是改写自Effective Java里面的一段代码:
public class DoDoContact {
private final int age;
private final int safeID;
private final String name;
private final String address;
public int getAge() {
return age;
}
public int getSafeID() {
return safeID;
}
public String getName() {
return name;
}
public String getAddress() {
return address;
}
public static class Builder {
private int age = 0;
private int safeID = 0;
private String name = null;
private String address = null;
// 构建的步骤
public Builder(String name) {
this.name = name;
}
public Builder age(int val) {
age = val;
return this;
}
public Builder safeID(int val) {
safeID = val;
return this;
}
public Builder address(String val) {
address = val;
return this;
}
public DoDoContact build() { // 构建,返回一个新对象
return new DoDoContact(this);
}
}
private DoDoContact(Builder b) {
age = b.age;
safeID = b.safeID;
name = b.name;
address = b.address;
}
}
调用方式
DoDoContact ddc = new DoDoContact.Builder("Ace").age(10)
.address("beijing").build();
System.out.println("name=" + ddc.getName() + "age =" + ddc.getAge()
+ "address" + ddc.getAddress());
可以使用lombok进行优化,可以使用@Builder
注解实现同样的效果
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Result<T> {
private int code;
private String message;
private T data;
}
Result<String> result5 = Result.<String>builder().code(404).message("failure").build();
全量更新和增量更新各有其优缺点,具体如下:
全量更新的优点:
全量更新的缺点:
增量更新的优点:
增量更新的缺点: