当前位置: 首页 > news >正文

jquery 开发网站wap网站建设服务

jquery 开发网站,wap网站建设服务,电子商务排名,网站后台管理怎么做友情链接在Java应用中实现数据库主从复制#xff08;读写分离#xff09; 一、架构描述 #xff08;一#xff09;整体架构 主库#xff08;Master#xff09; 负责处理所有的写操作#xff08;INSERT、UPDATE、DELETE等#xff09;。它是数据的源头#xff0c;所有的数据变…在Java应用中实现数据库主从复制读写分离 一、架构描述 一整体架构 主库Master 负责处理所有的写操作INSERT、UPDATE、DELETE等。它是数据的源头所有的数据变更首先发生在主库。主库会将写操作产生的日志例如MySQL中的binlog发送给从库。 从库Slave 从库会接收主库发送过来的日志并根据这些日志来重放操作从而保持与主库的数据一致性。从库主要用于处理读操作分担主库的读负载。 Java应用 Java应用需要根据操作的类型读或写来决定连接主库还是从库。通常会使用数据库连接池来管理连接并且有专门的逻辑来判断何时连接主库何时连接从库。 二数据流向 当有写请求时例如向数据库插入一条新记录Java应用会将请求发送到主库。主库执行写操作后将操作记录到日志中并将日志发送给从库。从库接收到日志后按照日志中的操作顺序在本地执行相同的操作使自己的数据与主库保持一致。当有读请求时Java应用会将请求发送到从库可以是多个从库中的一个通过负载均衡策略从库返回查询结果。 二、关键代码实现 一使用数据库连接池以Druid为例 配置主库连接池 首先需要在项目的配置文件例如application.properties或application.yml中配置主库的连接信息。在Java代码中创建主库的DataSource。 import com.alibaba.druid.pool.DruidDataSource;public class MasterDataSourceConfig {public static DruidDataSource createMasterDataSource() {DruidDataSource dataSource new DruidDataSource();dataSource.setUrl(jdbc:mysql://master_host:3306/mydb?useSSLfalseserverTimezone UTC);dataSource.setUsername(root);dataSource.setPassword(password);dataSource.setInitialSize(5);dataSource.setMaxActive(20);// 可以根据需要设置其他参数如最小空闲连接数等return dataSource;} } 配置从库连接池 同样在配置文件中配置从库的连接信息如果有主从多个从库可以配置多个从库连接池。创建从库的DataSource。 public class SlaveDataSourceConfig {public static DruidDataSource createSlaveDataSource() {DruidDataSource dataSource new DruidDataSource();dataSource.setUrl(jdbc:mysql://slave_host:3306/mydb?useSSLfalseserverTimezone UTC);dataSource.setUsername(root);dataSource.setPassword(password);dataSource.setInitialSize(5);dataSource.setMaxActive(20);return dataSource;} } 二读写分离逻辑实现 创建一个数据访问层DAO的代理类 这个代理类将根据操作类型决定连接主库还是从库。 import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.sql.Connection; import java.sql.SQLException;public class ReadWriteSplitProxy implements InvocationHandler {private DruidDataSource masterDataSource;private DruidDataSource slaveDataSource;public ReadWriteSplitProxy(DruidDataSource masterDataSource, DruidDataSource slaveDataSource) {this.masterDataSource masterDataSource;this.slaveDataSource slaveDataSource;}Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {if (isWriteOperation(method)) {return executeOnMaster(method, args);} else {return executeOnSlave(method, args);}}private boolean isWriteOperation(Method method) {// 简单判断方法名是否以insert、update、delete开头来判断是否为写操作String methodName method.getName().toLowerCase();return methodName.startsWith(insert) || methodName.startsWith(update) || methodName.startsWith(delete);}private Object executeOnMaster(Method method, Object[] args) throws SQLException {try (Connection conn masterDataSource.getConnection()) {return method.invoke(conn, args);}}private Object executeOnSlave(Method method, Object[] args) throws SQLException {try (Connection conn slaveDataSource.getConnection()) {return method.invoke(conn, args);}}public static Object newProxyInstance(DruidDataSource masterDataSource, DruidDataSource slaveDataSource, Class? clazz) {ReadWriteSplitProxy handler new ReadWriteSplitProxy(masterDataSource, slaveDataSource);return Proxy.newProxyInstance(clazz.getClassLoader(), new Class[]{clazz}, handler);} } 使用代理类进行数据库操作 在业务逻辑层中使用代理类来代替真实的数据库连接进行操作。 import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException;public class UserDao {private UserDao proxy;public UserDao(DruidDataSource masterDataSource, DruidDataSource slaveDataSource) {this.proxy (UserDao) ReadWriteSplitProxy.newProxyInstance(masterDataSource, slaveDataSource, UserDao.class);}public void insertUser(String name, int age) throws SQLException {String sql INSERT INTO users (name, age) VALUES (?,?);try (Connection conn proxy.getConnection();PreparedStatement ps conn.prepareStatement(sql)) {ps.setString(1, name);ps.setInt(2, age);ps.executeUpdate();}}public User getUserById(int id) throws SQLException {String sql SELECT * FROM users WHERE id ?;try (Connection conn proxy.getConnection();PreparedStatement ps conn.prepareStatement(sql)) {ps.setInt(1, id);ResultSet rs ps.executeQuery();if (rs.next()) {User user new User();user.setId(rs.getInt(id));user.setName(rs.getString(name));user.setAge(rs.getInt(age));return user;}}return null;} }class User {private int id;private String name;private int age;// 省略getter和setter方法 } 三、日常开发中的合理化使用建议 一连接池配置方面 合理设置连接池大小 主库连接池的大小要根据写操作的并发量和数据库服务器的处理能力来设置。如果写操作非常频繁且数据库性能有限可以适当增大连接池的最大连接数。从库连接池的大小要考虑读操作的并发量以及从库的数量。如果有多个从库并且读操作负载较高可以适当增大每个从库连接池的大小。 连接有效性检查 配置连接池定期检查连接的有效性。例如Druid连接池可以通过设置testWhileIdle、timeBetweenEvictionRunsMillis等参数来确保获取到的连接是可用的。 二故障处理方面 主库故障 当主库发生故障时需要有相应的故障转移机制。可以将其中一个从库提升为新的主库然后更新Java应用中的主库连接配置。在故障转移过程中要确保数据的一致性可能需要暂停部分写操作等待主库恢复或者新的主库完全准备好。 从库故障 如果某个从库发生故障可以暂时将其从可用从库列表中移除。如果有多个从库可以调整读操作的负载均衡策略将原本分配给故障从库的读请求分配到其他正常的从库上。 三数据一致性方面 延迟处理 由于主从复制存在一定的延迟在一些对数据实时性要求较高的场景下要谨慎处理读操作。例如在写入主库后立即读取从库可能会得到旧的数据。可以采用重试机制或者等待一定的时间后再从从库读取。 监控复制状态 定期监控主从复制的状态包括复制延迟、是否有复制错误等。可以通过数据库自带的工具如MySQL的SHOW SLAVE STATUS命令或者在Java应用中编写监控逻辑来实现。 四、实际开发过程中需要注意的点 一事务管理 跨库事务 如果一个业务操作涉及到主库和从库的操作虽然这种情况较少但在一些复杂业务场景下可能存在要考虑跨库事务的管理。可以使用分布式事务框架如Seata来确保数据的一致性。 本地事务 在只涉及主库或者只涉及从库的操作中要正确使用本地事务。例如在主库上进行写操作时要确保事务的原子性、隔离性、一致性和持久性ACID。 二SQL兼容性 不同数据库版本差异 主从库可能使用不同版本的数据库在编写SQL语句时要考虑版本的兼容性。例如某些函数在不同版本的MySQL中的行为可能不同。 特定数据库特性 避免使用只在某个数据库版本或者特定数据库中有而其他数据库不支持的特性。如果必须使用要考虑如何在不同的数据库环境中进行适配。 三安全方面 连接安全 确保主库和从库的连接都是安全的使用SSL加密连接或者配置合适的防火墙规则来限制对数据库端口的访问。 权限管理 为主库和从库分别设置合适的用户权限。例如从库用于读操作的用户不需要有写入权限这样可以提高安全性。
http://www.w-s-a.com/news/392978/

相关文章:

  • 网站建设详细合同范本长沙注册公司流程与费用
  • 搜索引擎网站录入wordpress怎么修改导航
  • 业务接单网站重庆网站制
  • 绿色农产品网站景区网站建设策划方案
  • 服务器做ssr后还可以做网站吗品牌形象设计公司
  • 太原网站制作计划wordpress创建文章
  • 网站优化要怎么做seo网站关键词优化报价
  • 公司网站友情链接怎么做副链华为荣耀手机官网
  • 一条龙做网站旅游网页设计模板图凡科
  • 中山网站建设哪家便宜在中国做外国网站怎么收钱
  • 网站优化大计孝感注册公司
  • 设计接单app平台有哪些在线网站seo诊断
  • 兰州网站建设推广现代营销手段有哪些
  • 郴州网站seo优化网络安全哪个培训班比较好
  • 做网站需要记哪些代码企业网站建设思路
  • 重庆自助建站模板网络服务器配置与管理
  • 外贸网站怎样做小程序买量平台
  • 中山精品网站建设机构海外留学网站建设方案
  • 长春网站建设工作如何取消wordpress页脚
  • 忻府网站建设排名网络管理系统官网
  • 张家港外贸网站建设国医堂网站平台建设
  • 水冶那里有做网站的对于网站链接优化有哪些建议
  • 宝安中心地铁站是几号线化妆品网站做的好的
  • 海宁营销型网站设计企业融资是什么意思
  • 淘宝客做网站要钱吗网站开发试题库
  • 10g空间网站做视频网站网站建设找超速云
  • 一元购网站怎么做企业网站源码cms
  • 域名不变 网站改版临沂企业网站建站模板
  • 天河网站建设信科网络外包公司和公司直招哪个好
  • 网站制作哈尔滨聊天系统源码