首页 文章 精选 留言 我的

精选列表

搜索[db],共8996篇文章
优秀的个人博客,低调大师

轨迹系统 需求分析与DB设计

标签 PostgreSQL , PostGIS , 快递 , 包裹侠 , 地理位置 , 距离排序 , KNN 背景 物流行业对地理位置信息数据的处理有非常强烈的需求,例如 1. 实时跟踪快递员、货车的位置信息。对数据库的写入性能要求较高。 2. 对于当日件,需要按发货位置,实时召回附近的快递员。 3. 实时的位置信息非常庞大,为了数据分析的需求,需要保留数据,所以需要廉价的存储。例如对象存储。同时还需要和数据库或分析型的数据库产品实现联动。 阿里云的 PostgreSQL + HybridDB for PostgreSQL + OSS 对象存储可以很好的满足这个需求,详细的方案如下。 业务描述 以物流配送场景为例,介绍阿里云的解决方案。 数据量 快递员:百万级。 快递员的轨迹定位数据间隔:5秒。 一个快递员每天工作时间 7 ~ 19点 (12个小时)。 一个

优秀的个人博客,低调大师

flea-frame-db使用之JPA接入

JPA接入 本节内容需要了解JPA封装内容,请参见笔者 上篇博文。 准备工作 为了演示JPA接入,需要先准备如下: MySQL数据库 (客户端可以使用 navicat for mysql) 新建测试数据库 fleajpatest 新建测试表 student建表语句如下: DROP TABLE IF EXISTS `student`; CREATE TABLE `student` ( `stu_id` int(10) NOT NULL AUTO_INCREMENT COMMENT '学生编号', `stu_name` varchar(255) NOT NULL COMMENT '学生姓名', `stu_age` tinyint(2) NOT NULL COMMENT '学生年龄', `stu_sex` tinyint(1) NOT NULL COMMENT '学生性别(1:男 2:女)', `stu_state` tinyint(2) NOT NULL COMMENT '学生状态(0:删除 1:在用)', PRIMARY KEY (`stu_id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; 接入讲解 1. 实体类 新建如下实体类Student,对应测试表student /** * <p> 学生表对应的实体类 </p> * * @author huazie * @version 1.0.0 * @since 1.0.0 */ @Entity @Table(name = "student") public class Student implements FleaEntity { private static final long serialVersionUID = 1267943552214677159L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY, generator = "STUDENT_SEQ") @SequenceGenerator(name = "STUDENT_SEQ") @Column(name = "stu_id", unique = true, nullable = false) private Long stuId; // 学生编号 @Column(name = "stu_name", nullable = false) private String stuName; // 学生姓名 @Column(name = "stu_age", nullable = false) private Integer stuAge; // 学生年龄 @Column(name = "stu_sex", nullable = false) private Integer stuSex; // 学生性别(1:男 2:女) @Column(name = "stu_state", nullable = false) private Integer stuState; // 学生状态(0:删除 1:在用) // ... 省略get和set方法 } 2. 持久化单元DAO层实现 上篇博文说到,增加一个持久化单元配置,便需要增加一个持久化单元DAO层实现。针对本次演示新增持久化单元 fleajpa,持久化配置文件 fleajpa-persistence.xml, Spring配置中新增数据库事务管理者配置,相关内容可参考上一篇博文。下面贴出本次演示的持久化单元DAO层实现代码: /** * <p> FleaJpa数据源DAO层父类 </p> * * @author huazie * @version 1.0.0 * @since 1.0.0 */ public class FleaJpaDAOImpl<T> extends AbstractFleaJPADAOImpl<T> { // 持久化单元,持久化配置文件中定义,spring配置中持久化接口工厂初始化参数 @PersistenceContext(unitName="fleajpa") protected EntityManager entityManager; @Override // 持久化事务管理者, spring配置文件中定义 @Transactional("fleaJpaTransactionManager") public boolean remove(long entityId) throws Exception { return super.remove(entityId); } // ...其他实现省略 @Override protected EntityManager getEntityManager() { return entityManager; } } 3. 配置介绍 详细配置信息,可以参考笔者上篇博文,这里不再赘述。涉及文件 fleajpa-persistence.xml 和 applicationContext.xml 4. 学生DAO层接口 IStudentDAO 继承了抽象Flea JPA DAO层接口,并定义了两个方法,分别获取学生信息列表(分页)和学生总数。 /** * <p> 学生DAO层接口 </p> * * @author huazie * @version 1.0.0 * @since 1.0.0 */ public interface IStudentDAO extends IAbstractFleaJPADAO<Student> { /** * <p> 学生信息列表 (分页) </p> * * @param name 学生姓名,可以模糊查询 * @param sex 性别 * @param minAge 最小年龄 * @param maxAge 最大年龄 * @param pageNum 查询页 * @param pageCount 每页总数 * @return 学生信息列表 * @throws DaoException 数据操作层异常 * @since 1.0.0 */ List<Student> getStudentList(String name, Integer sex, Integer minAge, Integer maxAge, int pageNum, int pageCount) throws DaoException; /** * <p> 学生总数 </p> * * @param name 学生姓名,可以模糊查询 * @param sex 性别 * @param minAge 最小年龄 * @param maxAge 最大年龄 * @return 学生总数 * @throws DaoException 数据操作层异常 * @since 1.0.0 */ int getStudentCount(String name, Integer sex, Integer minAge, Integer maxAge) throws DaoException; } 5. 学生DAO层实现 StudentDAOImpl 是学生信息的数据操作层实现,继承持久化单元DAO层实现类,并实现了上述学生DAO层接口自定义的两个方法。 具体如何使用 FleaJPAQuery 可以参见下面代码 : /** * <p> 学生DAO层实现类 </p> * * @author huazie * @version 1.0.0 * @since 1.0.0 */ @Repository("studentDAO") public class StudentDAOImpl extends FleaJpaDAOImpl<Student> implements IStudentDAO { @Override @SuppressWarnings(value = "unchecked") public List<Student> getStudentList(String name, Integer sex, Integer minAge, Integer maxAge, int pageNum, int pageCount) throws DaoException { FleaJPAQuery query = initQuery(name, sex, minAge, maxAge, null); List<Student> studentList; if (pageNum > 0 && pageCount > 0) { // 分页查询 studentList = query.getResultList((pageNum - 1) * pageCount, pageCount); } else { // 全量查询 studentList = query.getResultList(); } return studentList; } @Override @SuppressWarnings(value = "unchecked") public long getStudentCount(String name, Integer sex, Integer minAge, Integer maxAge) throws DaoException { FleaJPAQuery query = initQuery(name, sex, minAge, maxAge, Long.class); // 统计数目 query.countDistinct(); Object result = query.getSingleResult(); return Long.parseLong(StringUtils.valueOf(result)); } private FleaJPAQuery initQuery(String name, Integer sex, Integer minAge, Integer maxAge, Class<?> result) throws DaoException{ FleaJPAQuery query = getQuery(result); // 拼接 查询条件 // 根据姓名 模糊查询, attrName 为 实体类 成员变量名,并非表字段名 if (StringUtils.isNotEmpty(name)) { query.like("stuName", name); } // 查询性别 if (ObjectUtils.isNotEmpty(sex)) { query.equal("stuSex", sex); } // 查询年龄范围 if (ObjectUtils.isNotEmpty(minAge)) { // 大于等于 query.ge("stuAge", minAge); } if (ObjectUtils.isNotEmpty(maxAge)) { // 小于等于 query.le("stuAge", maxAge); } return query; } } 6. 学生SV层接口 IStudentSV 继承抽象Flea JPA SV层接口,并定义两个方法,分别获取学生信息列表(分页)和学生总数。 /** * <p> 学生SV层接口定义 </p> * * @author huazie * @version 1.0.0 * @since 1.0.0 */ public interface IStudentSV extends IAbstractFleaJPASV<Student> { /** * <p> 学生信息列表 (分页) </p> * * @param name 学生姓名,可以模糊查询 * @param sex 性别 * @param minAge 最小年龄 * @param maxAge 最大年龄 * @param pageNum 查询页 * @param pageCount 每页总数 * @return 学生信息列表 * @throws DaoException 数据操作层异常 * @since 1.0.0 */ List<Student> getStudentList(String name, Integer sex, Integer minAge, Integer maxAge, int pageNum, int pageCount) throws DaoException; /** * <p> 学生总数 </p> * * @param name 学生姓名,可以模糊查询 * @param sex 性别 * @param minAge 最小年龄 * @param maxAge 最大年龄 * @return 学生总数 * @throws DaoException 数据操作层异常 * @since 1.0.0 */ long getStudentCount(String name, Integer sex, Integer minAge, Integer maxAge) throws DaoException; } 7. 学生SV层实现 StudentSVImpl 继承抽象Flea JPA SV层实现类,并实现了上述学生SV层接口的两个自定义方法。具体实现参见如下代码: /** * <p> 学生SV层实现类 </p> * * @author huazie * @version 1.0.0 * @since 1.0.0 */ @Service("studentSV") public class StudentSVImpl extends AbstractFleaJPASVImpl<Student> implements IStudentSV { // 注入学生DAO层实现类 @Autowired @Qualifier("studentDAO") private IStudentDAO studentDao; @Override public List<Student> getStudentList(String name, Integer sex, Integer minAge, Integer maxAge, int pageNum, int pageCount) throws DaoException { return studentDao.getStudentList(name, sex, minAge, maxAge, pageNum, pageCount); } @Override public long getStudentCount(String name, Integer sex, Integer minAge, Integer maxAge) throws DaoException { return studentDao.getStudentCount(name, sex, minAge, maxAge); } // 可参见AbstractFleaJPASVImpl里的实现 @Override protected IAbstractFleaJPADAO<Student> getDAO() { return studentDao; } } 8. JPA接入自测 新增学生信息 private ApplicationContext applicationContext; @Before public void init() { applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); LOGGER.debug("ApplicationContext={}", applicationContext); } @Test public void testInsertStudent() { try { IStudentSV studentSV = (IStudentSV) applicationContext.getBean("studentSV"); Student student = new Student(); student.setStuName("张三"); student.setStuAge(18); student.setStuSex(1); student.setStuState(1); studentSV.save(student); student = new Student(); student.setStuName("李四"); student.setStuAge(19); student.setStuSex(1); student.setStuState(1); studentSV.save(student); student = new Student(); student.setStuName("王二麻子"); student.setStuAge(20); student.setStuSex(1); student.setStuState(1); studentSV.save(student); } catch (Exception e) { LOGGER.error("Exception : ", e); } } 执行结果: 更新学生信息 @Test public void testStudentUpdate() { try { IStudentSV studentSV = (IStudentSV) applicationContext.getBean("studentSV"); // 根据主键查询学生信息 Student student = studentSV.query(3L); LOGGER.debug("Before : {}", student); student.setStuName("王三麻子"); student.setStuAge(19); // 更新学生信息 studentSV.update(student); // 最后再根据主键查询学生信息 student = studentSV.query(3L); LOGGER.debug("After : {}", student); } catch (Exception e) { LOGGER.error("Exception : ", e); } } 运行结果: 删除学生信息 @Test public void testStudentDelete() { try { IStudentSV studentSV = (IStudentSV) applicationContext.getBean("studentSV"); // 根据主键查询学生信息 Student student = studentSV.query(3L); LOGGER.debug("Before : {}", student); // 删除学生信息(里面会先去将学生实体信息查出来,然后再删除) studentSV.remove(3L); // 最后再根据主键查询学生信息 student = studentSV.query(3L); LOGGER.debug("After : {}", student); } catch (Exception e) { LOGGER.error("Exception : ", e); } } 运行结果: 查询学生信息(按条件分页查询)表里自行再插入些数据,用于测试查询,查询结果因各自表数据而异;目前我表中数据如下: @Test public void testStudentQueryPage() { try { IStudentSV studentSV = (IStudentSV) applicationContext.getBean("studentSV"); List<Student> studentList = studentSV.getStudentList("张三", 1, 18, 20, 1, 5); LOGGER.debug("Student List = {}", studentList); } catch (Exception e) { LOGGER.error("Exception : ", e); } } 运行结果: 查询学生总数(按条件查询) @Test public void testStudentQueryCount() { try { IStudentSV studentSV = (IStudentSV) applicationContext.getBean("studentSV"); long count = studentSV.getStudentCount("张三", 1, 18, 20); LOGGER.debug("Student Count = {}", count); } catch (Exception e) { LOGGER.error("Exception : ", e); } } 运行结果: 看到这里,我们的JPA接入工作已经成功完成,本demo工程可以移步到GitHub查看 flea-jpa-test。在JPA封装介绍博文中,针对Flea JPA查询对象还存在的一个并发问题,将在后续的博文中介绍。

优秀的个人博客,低调大师

Databasir v1.0.3,在线 DB 文档生成平台

Hello,又到了发版的时候了,新版本在加功能这件事情上依旧保持了克制,重心仍放在打磨核心功能、优化用户体验上,相信一定不会让你失望。 简介 https://github.com/vran-dev/databasir 是一款在线的数据库文档管理平台,兼容市面绝大多数数据库,轻松生成优雅的在线文档,还可一键导出 Markdown、UML 等格式。 更多内容请点击前往文档页面查看 文档同步 markdown 文档展示 变更内容 Feature feature:重新设计同步任务列表 feature:支持取消同步中的任务 feature:文档页面添加【回到顶部】按钮 feature:内置 mysql、oracle、sqlserver、postgresql、mariaDB 数据库模板 feature:支持通过 JSON 导入数据库模板 feature:创建分组、项目时的【描述】字段由必填改为可选 feature:优化页面 UI 多个细节 Bug fix bug-fix:并发同步任务时概率出现版本冲突 bug-fix:markdown 文档导出时出现 NPE bug-fix:部分数据库(oracle、达梦)同步文档失败 bug-fix:同步表超过 1000+ 时出现 cursor limit Full Changelog: https://github.com/vran-dev/databasir/compare/v1.0.2...v1.0.3 项目地址 Github 地址:https://github.com/vran-dev/databasir 文档地址:https://doc.databasir.com 演示地址:https://demo.databasir.com Release 地址:https://github.com/vran-dev/databasir/releases/tag/v1.0.3

优秀的个人博客,低调大师

DB 与 Elasticsearch 混合应用之数据离线同步

作者介绍 李猛,Elastic Stack 深度用户,通过 Elastic 工程师认证,2012年接触 Elasticsearch,对 Elastic Stack 技术栈开发、架构、运维等方面有深入体验,实践过多种大中型项目;为企业提供 Elastic Stack 咨询培训以及调优实施;多年实战经验,爱捣腾各种技术产品,擅长大数据,机器学习,系统架构。 序言 首先解释下 即时、实时与离线 概念定义,最近碰到很多的认知误区,需要纠正下。 即时概念 当数据变更之后马上就可以查询变更,内部采用事务隔离机制,查询的数据必须阻塞直到数据更新完毕,如单实例关系数据库数据发生变更后,然后马上可查询到。 实时概念 在数据同步场景中,包括异构数据源和同构数据源之间,泛指在可接受的很快时间范围内同步完成,一般的认知是秒级左右,也可以毫秒或者微秒,依据业务需求与实现

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册