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

【设计】设计一个web版的数据库管理平台后端精要

需求

springboot设计开发一个系统,在这个系统的数据库表中存放着2000个数据库实例,有MySQL、Oracle、sql server3种数据库类型,用户可以在页面上选择不同的实例,连接这些实例上的数据库,来执行业务sql

实现

@Service
public class DatabaseService {@Autowiredprivate DynamicDataSource dynamicDataSource;@Autowiredprivate JdbcTemplate jdbcTemplate;public void executeSqlOnDatabase(int instanceId, String sql) {// 根据实例ID获取数据库实例信息DatabaseInstance instance = databaseInstanceService.getInstanceById(instanceId);if (instance == null) {throw new IllegalArgumentException("Invalid database instance ID: " + instanceId);}// 构建数据源配置HikariConfig config = new HikariConfig();config.setJdbcUrl(generateJdbcUrl(instance));config.setUsername(instance.getUsername());config.setPassword(instance.getPassword());config.setDriverClassName(getDriverClassName(instance.getDatabaseType()));// 创建数据源HikariDataSource dataSource = new HikariDataSource(config);// 动态添加数据源String dataSourceKey = instance.getIp() + ":" + instance.getPort();dynamicDataSource.addTargetDataSource(dataSourceKey, dataSource);try {// 切换到新的数据源DynamicDataSourceContextHolder.setDataSourceKey(dataSourceKey);// 执行SQLjdbcTemplate.execute(sql);} catch (DataAccessException e) {// 处理异常e.printStackTrace();} finally {// 操作完成后,切换回默认数据源或清理当前数据源DynamicDataSourceContextHolder.clearDataSourceKey();dynamicDataSource.removeTargetDataSource(dataSourceKey);// 关闭数据源dataSource.close();}}private String generateJdbcUrl(DatabaseInstance instance) {String databaseType = instance.getDatabaseType();String ip = instance.getIp();int port = instance.getPort();String databaseName = instance.getDatabaseName();switch (databaseType.toLowerCase()) {case "mysql":return "jdbc:mysql://" + ip + ":" + port + "/" + databaseName;case "oracle":return "jdbc:oracle:thin:@" + ip + ":" + port + ":" + databaseName;case "sqlserver":return "jdbc:sqlserver://" + ip + ":" + port + ";databaseName=" + databaseName;default:throw new IllegalArgumentException("Unsupported database type: " + databaseType);}}private String getDriverClassName(String databaseType) {switch (databaseType.toLowerCase()) {case "mysql":return "com.mysql.cj.jdbc.Driver";case "oracle":return "oracle.jdbc.driver.OracleDriver";case "sqlserver":return "com.microsoft.sqlserver.jdbc.SQLServerDriver";default:throw new IllegalArgumentException("Unsupported database type: " + databaseType);}}
}
public class DynamicDataSourceContextHolder {private static final ThreadLocal<String> CONTEXT_HOLDER = new ThreadLocal<>();public static void setDataSourceKey(String key) {CONTEXT_HOLDER.set(key);}public static String getDataSourceKey() {return CONTEXT_HOLDER.get();}public static void clearDataSourceKey() {CONTEXT_HOLDER.remove();}
}
http://www.lryc.cn/news/311342.html

相关文章:

  • 没有硬件基础可以学单片机吗?
  • ChatGPT引领的AI面试攻略系列:cuda和tensorRT
  • 【战略前沿】人形机器人制造商Figure获得了OpenAI、Jeff Bezos、Nvidia和其他科技巨头的资助
  • 多块磁盘组磁盘离线导致VSAN存储崩溃的VSAN数据恢复案例
  • Jenkins 的安装(详细教程)
  • 使用html网页播放多个视频的几种方法
  • python 基础知识点(蓝桥杯python科目个人复习计划58)
  • 【基于React实现共享单车管理系统】—React基础知识巩固(二)
  • 云桥通+跨境电商:SDWAN企业组网优化跨境网络案例
  • 服务器有几种http强制跳转https设置方法
  • web坦克大战小游戏
  • 如何使用生成式人工智能探索视频博客的魅力?
  • gpt批量工具,gpt批量生成文章工具
  • Python知识汇总
  • WEB面试题
  • Android Studio 六大基本布局详解
  • 如何应对IT服务交付中的问题?
  • [Python] 缓存实用工具
  • php反序列化字符逃逸
  • 延迟加载(Lazy Initialization)的单例模式
  • C++三级专项 流感传染
  • 如何用Elementor创建WordPress会员网站
  • 【脑切片图像分割】MATLAB 图像处理 源码
  • 深度学习系列61:在CPU上运行大模型
  • IO接口 2月5日学习笔记
  • Android Studio开发(一) 构建项目
  • stm32flash模拟eeprom
  • 多模态MLLM都是怎么实现的(2)-DDPM
  • QT----写完的程序打包为APK在自己的手机上运行
  • Windows C++ SecurityImpersonation级别:线程临时采用另一个用户(客户端)的身份进行操作的能力