ASH查看器:重新启动

如果您需要处理的数据不是大容量的大数据,但是已经超出了计算机内存的容量,并且具有足够的Excel功能,该怎么办? 对于自行车爱好者来说,答案是显而易见的-您需要编写自己的东西(是的,我们不是在寻找简单的方法)。

但是,如果您过去编写的代码很糟糕并且没有给您开发项目的机会,该怎么办? 抛开旧的发展,让位于新的,永恒的和光明的(是的,是的,这里也是,没有选择)。



CF Matrix的话:“一台平板电脑就足够了,Neo。” 导演:沃卓斯基兄弟姐妹。 1999.美国

十多年前,我为ASH Viewer编写了代码(有关我的路径的更多信息),将其首先发布在sourceforge.net上 ,然后发布在github上,以便人们连接并可以添加功能,更正错误。 该项目是使用Gradle构建的,已解决了一些与图形显示有关的问题:几乎完整的参考改进清单。

但是,我意识到十年前编写的代码并不完美。 从表面上看,一切看起来都不错,功能得到了开发,人们积极使用并表示感谢。 但是程序内部包含了第一次编码经验的所有错误,当然,这极大地阻碍了项目的发展。

对于准备认真开始从事该应用程序工作的每个人(例如dcvetkov ),我都说代码需要进行完整的更改。 在尝试实现任何功能或修复错误时,我对此深信不疑。 我会告诉您,编辑旧代码是一种可怕的折磨,尤其是我的:)。 我希望将来机器人会学会自己重写所有内容,但是就目前而言,考虑到已经在创建程序和编写代码方面的经验,因此做出了一个从零开始的坚决决定。

自从第一个版本发布以来,ASH Viewer一直在这一领域活跃。 基于JfreeChart进行了三个相当大的数据分析项目。 除了这些项目,我还尝试了不同的方法,范例和库。 结果,我决定一切都应该用纯Java编写,而不要使用专门为从头开始创建图形界面而设计的库。 但是,仍然可以使用第三方库来解决一些高度专业化的任务-这将使您能够保持必要的灵活性,并且不需要花费大量时间来修复错误和亲自开发所需的功能。

一切如何开始


我一直很担心,但是在公共领域是否有示例可以提供在Java Swing中正确编写中等复杂度的应用程序的基础? 当然,他们把我送到图书馆本身或教科书中的一些简单例子。 在某些方面,它们是正确的。

但是我一直在搜索应用程序代码,这些代码可以用作Java Swing中“如何正确执行”的示例。 我想在我眼前有一个工作系统,以便可以“感觉”到。

他开始研究Java Swing应用程序的源代码(无法计数)。 在某些地方,它们是简单的待办事项,在某些地方(当时对我而言太复杂),在某些方面质量不佳,有时两者兼而有之。 我在Habré上阅读文章,并编写了代码。 但是仍然缺少一些东西。 也许那时我已经获得了解决此问题的大量知识。

有一天,我发现了备受尊敬的Anton Keks antonkeksAngry IP扫描程序 ,看着它并立即意识到-在这里! Java Swing,简单的功能,简洁的代码,模块化-易于阅读! 通常,在编写以前的项目之一时,然后在重写ASH Viewer时,都使用了其中使用的方法。

有助于提高代码质量并简化工作的软件和库


想法 :我已经使用此IDE进行Java编程已有大约五年了。 我确认了大多数人的意见-这是一个非常有用的程序,也是编写代码的非常方便的工具。 当我从Eclipse www.eclipse.org/ide转到它(并且第一个版本是在此IDE上编写的)时,经过短暂的培训后,我意识到IDEA可以指导您并告诉您何时尝试切换到黑暗的一面:)。 在代码中突出显示重复项可以使您保持良好状态,并避免进行愚蠢的复制粘贴。 Ave JetBrains!

Java 8 :lambda表达式可以编写更短的代码,这是一个新的Time API,它使您可以取消使用第三方的Joda Time库。

匕首2 :我从未使用过的依赖注入框架。 但是我以某种方式监视了Anton antonkeks如何使用该库,并开始根据模板进行操作。 将程序分为模块,在可能的情况下,使用依赖注入。 在不可能做到这一点的地方,他预先使用了外壳对象的创建,然后设置了必要的属性,或者根本就没有使用DI。

Maven构建系统。 这是事实上的标准构建系统,因此我决定通过pom.xml干净地添加库,并使用Maven模块系统在一个项目中使用JFreeChart和Gantt代码。

Lombok :也是一个非常方便的库,以免编写或支持统一代码(getter,setter等)的“足迹”。 是的,在某些情况下,我拒绝使用它,因为有必要重新定义equals和compareTo,但是在Lombok中我没有找到如何快速进行此操作。

日记:制作完美的Java程序? 因此,如果没有现代的日志记录手段,就无处可寻。 因此,我们以Java SLF4JLogback简单日志外观为 基础

布局管理器:我主要使用Miglayout 。 学习起来非常困难(在某些地方,我以老式的方式使用Swing布局管理器),但是它很简短。 使您可以执行“细节”选项卡上的有趣效果

Swinglabs的Swingx:废弃了很久的Java Swing UI。 我正在积极使用JXTable。 表格列的任意选择和单元格内容的内置搜索有助于对活动会话的历史数据进行详细分析。

ommons-dbcp2 :对于创建数据库连接的连接池很有用。 在旧版本中,我使用了在Internet上找到的经过修改的实现。

从旧版本迁移的库


Oracle Berkeley DB Java版 v。 5.0.73:嵌入式键值存储。 用于存储活动会话的汇总历史记录数据。

JFreeChart :使用此库编写的数千个数据分析项目。 我采用了实验版本,该版本发布在github上,并将其作为模块添加。 这样做是为了方便使用代码,因为需要进行更改,以便堆积图根据需要显示该图。

E-Gantt :一个用于在Java Swing中创建甘特图形的库。 现在,即使在Internet上也找不到它的痕迹。 也作为单独的Maven模块放置在项目中。

从有趣的代码中,您可以注意什么


架构变更:

  1. 现在,设置存储在单独的内置数据库中,而不是纯文本文件中。 由于没有太多数据,因此使用高级EAV模式存储连接设置。
  2. 为了存储监视数据,我决定采用OLAP引擎外观。 首先,通过SQL_ID / SESSION_ID在选定范围内加快甘特细化的显示速度。 其次,为了获得对堆叠图和甘特图的SQL_ID / SESSION_ID快速下钻的可能性。 第三,形成对活动会话历史的未来查看(期望之上,期望之上,SQL_ID / SESSION_ID之上)。 一切都存储在一个实体中(数据,第二秒,15秒以及将来的其他扩展间隔在物理上是分开的);
  3. 干净架构的副作用是能够支持监视其他数据库的活动会话的历史记录。 当前实现的Postgres支持。 要连接其他数据库,您需要一个现成的接口来连接活动会话的历史数据(已添加到Postgres或此类实现中 ),或者需要一个自配置的活动会话历史记录的单独表中的集合,以后可以访问该表。

    如何启用对另一个数据库的支持
    1. 创建一个新类并实现IProfile接口。 与Postgres相同;
    2. 将新版本数据库的实现添加到ConnectToDbArea类的loadProfile过程和ConstantManager类的enum Function中;
    3. 连接并检查应用程序。

图形用户界面


与数据库的连接形式

从头开始完全重写,以前使用了开放的Squirrel-sql项目中的最佳实践。 现在,所有内容都保存在一个文件中。 美女!



如何连接到数据库
  1. 创建一个新的连接;
  2. 指定名称,URL(JDBC对于Oracle是标准的:jdbc:oracle:thin:@host:端口:SID,对于Postgres:jdbc:postgresql://主机:port:数据库),用户名/密码,配置文件并选择jdbc库;
  3. 对于Oracle,一切都适用于ojdbc6.jar;对于PostgresDB,则适用于postgresql-42.2.5


热门活动/详细信息界面

在这里,没有任何重大变化,类似于旧版本,只是没有查看故事。



按SQL_ID / SESSION_ID进行钻取

的SQL



ASH :特定SQL_ID的活动图,通过双击甘特图中带有SQL_ID的行来调用。
SQL文本/计划 :对于Oracle / Postgres,可以获取请求的全文。 仅对于Oracle,才为所有plan_hash_value提供查询执行计划。
统计信息 :表数据通过SQL_ID:从V $ SQL获取。 该代码具有添加更多实体的能力,您可以为其选择一个实体(请参阅实现 )。 但您需要非常小心,因为可能会出现性能问题:例如,在加载的系统上从V $ SQLAREA进行读取非常慢)。

届会

ASH :session_id的活动图,类似于SQL,双击甘特图中的会话行。
统计信息 :按SQL_ID的表数据:从V $ SESSION和V $ PROCESS获取。 该代码具有添加更多实体的能力,您可以为其选择一个实体(请参阅实现 )。

进一步的计划


  1. 安装API。 进行最终代码重构。 实现初始监视数据的动态存储 ,这将不依赖于数据库的版本和类型;
  2. 确实没有足够的测试来测试系统的关键模块,CI和其他最佳实践。

Github项目代码,项目文件
链接到Telegram t.me/ashviewer中的组,以了解最新更新;

PS谁决定连接到开发-当然写信给PM,不要过度兴奋,也不要暗恋。

仅此而已。 感谢您的关注!

Source: https://habr.com/ru/post/zh-CN441186/


All Articles