开发工具分享
  • 首页
  • 计算科学
  • 文化旅游
  • 项目和网站
    • OSSEZ 计算技术
    • USRealEstate 社区
    • 地区文化
    • CWIKI.US
    • BUG.OSSEZ.COM
    • RSS.OSSEZ.COM
Computer Science
Computer Science

应该下那个 ActiveMQ

最近在搞 ActiveMQ 的时候,发现有 2 个 ActiveMQ 可以下载。 应该下那个呢?     JMS 即Java Message Service,是JavaEE的消息服务接口。 JMS主要有两个版本:1.1和2.0。 2.0和1.1相比,主要是简化了收发消息的代码。 所谓消息服务,就是两个进程之间,通过消息服务器传递消息。 实际上ActiveMQ Classic原来就叫ActiveMQ,是Apache开发的基于JMS 1.1的消息服务器,目前稳定版本号是5.x,而 ActiveMQ Artemis 是 由RedHat捐赠的 HornetQ服 务器代码的基础上开发的,目前稳定版本号是 2.x。     和ActiveMQ Classic相比,Artemis版的代码与Classic完全不同,并且,它支持JMS 2.0,使用基于Netty的异步IO,大大提升了性能。 针对数据的持久层 ActiveMQ Artemis 还能够支持 JDBC。 总结 整体来说,ActiveMQ 通常指的是 ActiveMQ Classic,为了简化去掉了 Classic。 ActiveMQ Artemis 应该是作为下一个版本来候选的,支持的协议更新。 2 套 ActiveMQ 的代码是不一样的。 如果用不到什么太多的消息策略高级需求,可以就使用 ActiveMQ Classic 就好。 因为这 2 个消息服务器的代码完全不一样,导致如果你使用 Spring 的话,使用的包的代码也不一样,ActiveMQ artemis 的调用代码更加简单,界面更好看。     如项目只是需要一个消息服务器,并且没有什么技术负担,使用 Spring 的框架的话,用 ActiveMQ artemis 可能更好些。     有谁不愿意看好看的界面呢? https://www.isharkfly.com/t/activemq/14877/1

2023年09月13日 0Comments 529Browse 0Like Read more
Computer Science

Rabbitmq 能否支持 AMQP 1.0

基于 Rabbitmq 官方的说明,现在 Rabbitmq 还没有办法完全的原生支持 AMQP 1.0。 官方的文章列表在:Which protocols does RabbitMQ support? — RabbitMQ 从上面的文章来看,感觉是 AMQP 1.0 的升级太大,只能通过插件的方式来进行兼容。 至于什么时候能够支持,貌似现在还没有时间表。     Spring 的 AMQP 项目就是针对 Rabbitmq 来写的。   https://www.isharkfly.com/t/rabbitmq-amqp-1-0/14876

2023年09月13日 0Comments 526Browse 0Like Read more
Computer Science

什么是 JMS

Java消息服务(Java Message Service,简称JMS)是用于访问企业消息系统的开发商中立的API。企业消息系统可以协助应用软件通过网络进行消息交互。JMS在其中扮演的角色与JDBC很相似,正如JDBC提供了一套用于访问各种不同关系数据库的公共API,JMS也提供了独立于特定厂商的企业消息系统访问方式。 使用JMS的应用程序被称为JMS客户端,处理消息路由与传递的消息系统被称为JMS Provider,而JMS应用则是由多个JMS客户端和一个JMS Provider构成的业务系统。发送消息的JMS客户端被称为生产者(producer),而接收消息的JMS客户端则被称为消费者(consumer)。同一JMS客户端既可以是生产者也可以是消费者。 JMS的编程过程很简单,概括为:应用程序A发送一条消息到消息服务器(也就是JMS Provider)的某个目得地(Destination),然后消息服务器把消息转发给应用程序B。因为应用程序A和应用程序B没有直接的代码关连,所以两者实现了解耦。 JMS 不是现在才有的概念,早在上个世纪 90 年代就已经有了。 JMS 1.0 JMS 1.0.1 (October 5, 1998) JMS 1.0.1a (October 30, 1998) JMS 1.0.2 (December 17, 1999) JMS 1.0.2a (December 23, 1999) JMS 1.0.2b (August 27, 2001) JMS 1.1 (April 12, 2002) JMS 2.0 (May 21, 2013) JMS 2.0a (March 16, 2015) JMS 主要是在 Java 世界中使用,但目前现在消息策略已经有了很大的变化。 不同语言直接也有消息发送和消费的请求,所以目前使用比较多的消息协议是 AMQP,这个就没有办法用 JMS 进行处理。 因此,Apache Active MQ 就在消息策略上面进行了包装,让 Active MQ 也能支持现代的 AMQP。 如果你的应用服务是 Java 的服务的话,使用 Active MQ 通常能够满足你的消息处理需求。 在客户端和服务器之间,我们可以使用上面的方法,让客户端发送一个消息到消息服务器上,当另外一个服务器收到消息请求后,就会对消息进行处理然后返回。 这个过程如果使用 JMS 是可以解耦的,我们直接定义接口就可以了。 有点像 Protocol Buffers,但 Protocol Buffers 是基于 http 的,我们也需要定义 Protocol Buffers 后进行编译部署后才可以用。   https://www.isharkfly.com/t/jms/14874

2023年09月13日 0Comments 531Browse 0Like Read more
Computer Science

Java 基本类型和包装类

Java 是基于对象的,所以我们都需要以对象的想法来进行思维。 但 Java 又提供了 8 个基本类型,这 8 个基本类型基本上都和数字有关,是直接可以使用的类型。 基本类型 大小 包装器类型 boolean / Boolean char 16bit Character byte 8bit Byte short 16bit Short int 32bit Integer long 64bit Long float 32bit Float double 64bit Double void / Void String 不算基本类型,但是为了加快 String 的处理,Java 就顺手搞了一个 String Pool。 Java 基本类型 什么是基本类型? 直接可以计算的就是基本类型,基本类型不是对象。 所有的基本数据类型的大小(所占用的字节数)都已明确规定,在各种不同的平台上保持不变,这一特性有助于提高 Java 程序的可移植性。 基本类型就是已经定义好的,可以直接拿来计算和比较的那种。     包装类 既然我们有了基本类型,正如前面说的,Java 里面都是对象。 那么我们应该有必要创建一堆对象和前面说的 8 个基本类型进行对应。 这些对象就是针对基本类型创建的包装类( Wrapper Classes)。 为什么要有包装类 举个例子,我们指定 List 中需要存一堆 Integer 的对象。 如果我们定义的是基本类型,那我们怎么存到对象中呢? 我们是不是需要把基本类型转换为对象,然后再存进去,如果我们不提供包装类的话,就没有这个转换过程。 往大了说,基本数据类型没有办法使用 List 这个数据结构,这多无聊呀。 为了解决这个问题 Java 就搞了一个包装类,用来把基本数据类型转换为对象。 装箱和拆箱 既然东西有了,那么对这个转换的过程,自然就需要定义下概念了。 从基本数据类型类型转换为包装对象的过程就叫做装箱。 反过来就叫做拆箱了。 在老的 JDK ,这个过程都没有办法自动进行操作,每次要手动搞了一个类型转换。 其实这个过程每次都手动做的话,是非常繁琐的,所以在 JDK 进化后,现在全是自动化了,基本上都是自动类型转换了。 虽然有时候也会出点类型转换错误,但整体上提高了不少效率。 简单来说就是 JDK 在需要基本类型的时候,你定义却是对象,那么 JDK 自己帮你把这个拆箱过程给完成了,对你来说是透明的了。 缓存 既然有了装箱和拆箱的过程,如何提高这个效率,就是 JDK 需要考虑的东西了。 在这个过程中,缓存就被使用上了。 Integer valueOf(1); 就是用了缓存的典型例子。 JDK 的代码是这样的:     @IntrinsicCandidate public static Integer valueOf(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); } 在这里,JDK 定义了一个最小值和最大值以便于加快类型转换的处理速度。     所以,下面的代码就有点意思了。 Integer i1 = 100; Integer i2 = 100; Integer i3 = 200; Integer i4 = 200; System.out.println(i1==i2); System.out.println(i3==i4); 上面代码的结果是第一个判断为 TRUE,第二个为 False。 因为我们知道,对象使用 == 进行比较,比较的是内存地址,所以对值的比较我们通常会用 equals 来进行比较。 但是因为上面代码中的 Integer 小于 100,所以是从缓存中读的,这样会导致比较的时候返回 TRUE。 总结 在面试的时候,上面缓存中的内容是容易被喜欢扣细节的人问到的。 如果你真没有去看看 JDK 的文档,上面还真有点出问题。 但我们认为这个有点钻牛角尖的意思了,因为 Java 使用缓存的目的就是为加快程序的执行的。至于具体怎么实现,对大部分人来说这部分都是透明的。 通常实际编程的过程中,只需要了解自动拆装,并且如何定义变量,因为针对对象的定义和基本类型的定义是不一样的。 定义一个浮点对象,我们使用的代码是 Float x = 1F; ,在后面需要添加一个 F。 至于缓存部分,有时间就研究下,了解自动拆装是有缓存在里面,多是针对小范围 int 来使用的就可以了。   https://www.isharkfly.com/t/java/14873

2023年09月12日 0Comments 613Browse 0Like Read more
Computer Science

如何用 Java 找到字符串中的元音

这个题目其实不难,这是一个公司面试的时候要求的题目。 这个公司的面试有点意思,他们希望 Zoom 看我的电脑,然后让我解决问题。 题目 题目就非常简单了,他们给了我 2 个字符串。 其中一个是测试字符串,另外一个是元音字符,然后让把含有元音字符的单词输出。 给出的字符串分别为: String strTransform = "AI is driving the world crazy"; String Vowels = '"aeiou"; 思路 在面试的时候,有关字符串的处理非常常见。 通常需要考虑的的是大小写,空格,特殊字符等问题。在 Java 中,如果处理不好会容易空对象异常。 对于这个题目,可以使用子函数的方法,让逻辑更加清晰点。 可以首先在方法上面定义元音字母。     定义好子函数后,让这个子函数对输入的字符串进行判断。 为了便于数据遍历,在判断之前,可以简单的把给出的字符串放到 List 中。 这样你更好遍历,通常我们可以用 List.of 这个方法。     通常这里我们还有很多其他的方法可以用,Lists 这个方法是在 JDK 里面的,可以不依赖其他的 Package ,这样如果不让你用自己的 IDE 的时候,你更容易让在线的编译器通过。 运行结果。 运行的结果如下:     因为这个代码比较简单,而且我们只是测试下,所以我们就不放到代码库里面。 https://www.isharkfly.com/t/java/14841

2023年09月12日 0Comments 435Browse 0Like Read more
Computer Science

Java 中的比较 equals 和 ==

这个问题在 Java 面试的时候大概率会被问到。 不是因为这个问题有什么复杂的,只是因为这个地方超出人类认知,你相信吗? 比较什么 如果你上培训班或者在学校学习的话,你的老师大概率可能会告诉你对于: 基本类型:比较的是值是否相同; 引用类型:比较的是引用是否相同; 本来这里就有点复杂了,还非要搞出另外 2 个概念。 比较好记的就是 == 比较的是内存地址,equals 比较的是具体的值。   对上面的问题,所谓的基本类型,因为没有对象话,所以 JVM 没有为基本类型创建实例化后的对象,因此 == 就可以直接用了,因为 2 个相同的基本类型的值的地址是一样的。   String 为什么不行 String 在 Java 里面有点奇葩,因为 String 是在是用得太多了。 所以 Java 为 String 搞了一个 String Pool,对于程序中,你这样定义的字符 String s1 = "iSharkFly";这个数据是存储在 String Pool 里面的。 因为 String 在 Java 里面被定义为不可变。等下一次你定义一个 s2 的时候,如果是同样的值, s1 和 s2 是相同的,因为都在 String Pool 里面。 String 还有另外一个初始化方法:` String s1 = new String(“iSharkFly”); 这个方法初始化的 String 是一个对象,这个对象没有放在 String Pool 里面,这个对象在 Heap 内存中。 所以: String s1 = new String("iSharkFly"); String s2 = new String("iSharkFly"); 的内存地址是不相同的,但是值相同。 使用 == 比较,上面就没有办法比较。 查看下面的代码: String s1 = new String("iSharkFly"); String s2 = new String("iSharkFly"); log.debug("hashCode - {}", s1.hashCode()); log.debug("hashCode- {}", s2.hashCode()); log.debug("identityHashCode- {}", System.identityHashCode(s1)); log.debug("identityHashCode - {}", System.identityHashCode(s2)); 程序输出:     我们会看到地址是不相同的。 hashCode 都知道 hashCode 会返回对象的 HashCode 来识别对象,为什么上面的地址是一样的? 因为 hashCode 会在程序中被重写。 下面的是 String 的 HashCode 代码。     JDK 已经对代码进行了重写。所以 hashCode 并不能完全标识内存地址。 所以,我们只能使用 System.identityHashCode 方法来获得内存地址。 总结 equals 和 == 在 Java 面试中经常会遇到。 只需要记住的是 == 比较的是内存地址,在对值进行比较的时候并不可靠。 在实际编码过程中,这种比较也比较常见的,所以还是有必要了解下这个。   https://www.isharkfly.com/t/java-equals/14839

2023年09月11日 0Comments 431Browse 0Like Read more
Computer Science

说完 Java 的 Abstract 后再来说说接口 (interface )

如你对 Abstract 修饰的抽象类不是非常了解的话,请自行先考古下。 这篇文章需要对 Java 定义过的抽象类有一些基本的了解才可以。 抽象类和抽象方法 用 Abstract 修饰的类,叫做抽象类,那么用 Abstract 修饰的方法叫做抽象方法。 在 Java 中,喜欢用一些修饰关键字来对类或者变量或者方法来进行修饰。修饰的目的是更加明确一些类或者方法,或者变量的使用。 可以简单的理解为,使用关键字来修饰过的东西用来限制使用范围而已。 关于抽象类和抽象方法: 用 abstract 修饰过的方法所在的类一定是抽象类。 用 abstract 修饰过的类,不一定有抽象方法。 什么是接口 和 abstract 修饰过的类比起来,接口是用 interface 来修饰的,这个是在用 abstract 修饰的类上面进行进一步的限制和简化。 而接口中只能存在 public abstract 方法。 用很多人常使用的定义,接口就就是类似墙上的电源插头,上面定义了某个方法,然后让别人去实现的。 打个不是否恰当的比喻,为了从接口中获得电力,你管这个电力是火电还是核电。 正是因为这样的关系,所有接口中定义的方法必须要有实现。 一个类可以实现多个接口,但接口中定义的所有方法必须全部要实现。 接口中的变量会被隐式地指定为 public static final 变量(并且只能是 public static final变量,用 private 修饰会报编译错误),而方法会被隐式地指定为 public abstract 方法且只能是 public abstract 方法(用其他关键字,比如 private、protected、static、 final 等修饰会报编译错误)。 接口和抽象类的关系 首先可以理解为 interface 就是 abstract 的一个子集,内容和信息比 abstract 更加精简。 interface 中的方法是用来实现的,abstract 中的方法是用来继承的,这 2 个用途不一样。 因为 abstract 不能实例化,那么 interface 也肯定不能实例化了。 实际使用 举个实际使用的例子,我们现在有一个这样的需求,发送一个 HTTP 请求,获得用户的数据。 当我们希望对这个进行实现的时候,我们可以使用 apache 的 httpclient 这个包来完成 http 的调用,我们也可以使用 OKHttp 这个包来实现 http 的调用。 为了定义大家都使用的方法,我们就在这 2 个调用之前,定义了一个接口来要求我们的 2 个子类分别使用不同的包来实现完成调用返回结果。 小问题 如这里,我们只有一个实现,还有必要定义接口吗? 这个问题问得就非常好,如果你真只有一个实现的话,定义接口就纯粹属于脱了裤子放屁了。 当然你是可以定义的,只是定义的接口没有什么太大的意义,因为你就使用了这一个实现,何必再增加一个类搞得程序难读,直接使用实现类就好了。 总结 接口在 Java 中非常常用,但实际使用上,用不好会增加复杂性和没有必要的程序设计。 在日常开发中,大部分公司可能会选择用 Spring 框架。 单例 是Spring 当中bean 的默认范围(Scope)。Spring 容器会为某个bean 定义对象创建唯一的实例。 对于一般公司在初期可能更多的是关注业务实现,他们并不在意使用某种类实现,比如说上面的实现的 http 调用,可能就用了 OkHttp 实现就好了。 抽象出来各种接口,其实比较麻烦,软件开发的同事基本上就不写接口了。 这也导致了在你的软件项目中,看到接口的地方越来越少了。因为等于要多写一个类,同时还在这个类中写了不同的限制方法,如果我要加一个方法在接口中,所有的实现类都要加。 如果开始就设计不好的话,要加方法还挺繁琐。     在 IntelliJ IDEA 中,可以单击接口签名的 I 标记来看看有多少类实现了这个接口。 所以,有关接口的定义,目前更多用在很多八股文的面试题中,有些所谓的架构师会问下你接口是干什么的,很多情况下可能他们自己都已经不写接口了。   https://www.isharkfly.com/t/java-abstract-interface/14838

2023年09月11日 0Comments 441Browse 0Like Read more
Computer Science

Java 抽象类能不能实例化

短回答就是:不能   这里有 2 个概念,什么是抽象类和什么是实例化。   实例化 实例化简单来说就是为 Java 中使用的对象分配存储空间。 抽象类 从代码上来说,抽象类就是一个用 abstract 关键字来修饰的类。 这个类除了不能被实例化以外,其他都能做。 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。 抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。 // Java program to demonstrate abstract class // cannot have instance public abstract class ClassOne { public void printSomething() { System.out.println("Hello in abstract class"); } } class CreateClassOne { public static void main(String[] args) { // instance of abstract // class "ClassOne" ClassOne obj = new ClassOne(); } } 上面的代码运行时候将会出现错误: prog.java:17: error: ClassOne is abstract; cannot be instantiated ClassOne obj = new ClassOne(); ^ 1 error 因为你尝试实例化这个抽象类。 为什么不能实例化抽象类 很多人在这里都有点懵,为什么我就不能实例化抽象类。 正如我们上面说的,实例化就是为类分配需要的内容空间,以便于类去进行计算。 因为抽象类没有足够的信息, JVM 没有办法知道抽象类到底给他们分配什么。比如说没有具体的成员变量和成员方法。 你说,我们可以这样呀: HashMap hashMap = new HashMap(); AbstractMap abstractMap = new TreeMap(); 这样是对 abstractMap 进行实例化吗?这显然不是。 这是你用抽象类的名字定义了一个 Map,但是这个 Map 是用 TreeMap 实例化的。 最后你内存里面得到的是一个 TreeMap 而不是 abstractMap。   https://www.isharkfly.com/t/java/14751

2023年09月10日 0Comments 576Browse 0Like Read more
Computer Science

解决一个程序问题需要多少步——确定我们没有在摸鱼

3 天前,运行的社区系统报告,很多老的历史照片都无法作为附件加载 —— 小鲨鱼,快来解决问题。 很多人都问题,为什么程序员每天不是在调 Bug 就是在调 Bug 的路上。 其实呀,计算机是一个逻辑性非常强的东西,每一步都应该是原因的,所以我们要通过逻辑性找到不同的原因。   这个和把大象关进笼子里有几步差不多。 调试的方法其实就是针对问题去找到原因,为什么会出现这个问题。 对 Web 系统来说,无非就是程序和数据,首先需要确定数据丢了没有,如果数据丢了,怎么调试都没有用,因此先恢复数据,保障系统运行永远是第一位的。 Step 1 有没有快速的解决方案 为什么会出现这个问题,不是好好的吗?原来是因为更换了域名,同时更换了云存储的存储路径。 现在问题就是主题中的内容都没有丢,但是当主题重新生成 HTML 后,只要主题中有附件的部分,全部都没有正确生成 HTML。 快点检查存储在云端的附件有没有被删掉。找到一个老的主题已经生成的 HTML,然后检查丢失的图片对比的服务器地址。 云存储的附件都还在,没有被丢掉,如果直接把绝对 URL 拷贝过来,问题就解决了。 赶紧的,有备份吗? 有备份,赶快恢复一次。 Step 2 数据恢复 恢复备份后无法解决问题。 备份恢复了,问题依旧。怎么办? 有多少主题被影响到? 往前面找 3 个月,1 个月,2 个星期的随机帖子,貌似各种情况都有,但是大量丢的都在 几个星期之前的,几乎都无法显示。 那应该是在生成 HTML 的短 Hash 代码转码回去的时候出现问题了。 这个数量已经非常大了,没有办法通过手工恢复的方式完成了。 这里有个判断,如果只影响到几个主题,通常我们都可以手工恢复的,如果影响的主题超过几十个,这个时候是没有办法手工恢复,只能找到原因让程序去做了。 Step 3 调试存储桶路径 因为我们知道存储桶路径换了,是不是因为存储桶的名字问题呢? 把服务器上存储桶的名字重新改回来,问题依旧。 现在这个和存储桶的路径应该没有太大的关系。 Step 4 调试 Hash 算法 是不是因为在 Base 62 Hash 算法的时候因为 SHA1 的不同而导致了算法没有被正常解码? 读了下程序,貌似问题也不在这里。 这个 Base62 算法,程序中没有加摘要扰乱计算。 Step 5 查询数据库的数据 现在我们得从数据库查看了,因为没有办法确定到底是程序还是数据的问题。 貌似在备份前 3 天的数据是好的,我们应该要把数据库的数据恢复下看看。 服务器现在在运行的,好在新加的主题没有问题,那就让服务器运行着吧。 我们把服务器上的数据 Dump 下来,导入到我们本地的 PGSQL 数据库中吧。 这个导入过程可能要一天也可能是几个小时,因为导入数据比较容易出错。 Step 6 如何进入服务器 Docker 容器内查询 数据本地拿到了,Hash 前的和 Hash 后的数据都在呀,那问题在哪呢? 到 Docker 容器内去查询下现有的服务器数据吧。 这个时候,你就可能需要时间去了解下如何进入 Docker,如何在 Docker 连接数据库后运行 SQL。 因为这个库是在容器内的,你是没有办法通过其他数据库工具直接连接到数据库上运行 SQL 的,通常生成服务器也不允许你这么做。 查询的结果,发现是本地有的记录,服务器上没有。 大概率知道数据库映射出了问题。 Step 7 把本地的备份数据恢复 1 条 把本地备份的 1 条数据恢复到服务器上,然后刷下效果,看是不是就是因为数据丢了? 太棒了,恢复的这条数据被显示出来了,主题正常了。 原来就是丢数据了,备份不应该是备份全部的吗?看来应该是恢复哪里或者某个表出问题了。 Step 8 获得具体有多少数据被影响 因为我们知道那个表现在有问题了, Select Count(*) 呗。 发现一共了 4000 多条记录被影响。 赶紧把本地的这些记录组织成 SQL 到服务器上运行吧,都是 Insert 应该问题大。哪怕是重复数据,因为有 Key,重复数据会被忽略掉。 导入后问题解决了。 Step 9 解决问题后 2 天同样的问题又出现了 先查 Count,后来发现 Count 数据被删掉了 2000 多。 这肯定是有自动运行进程对数据进行清理了。 上网考古下,发现貌似有一个无用附件清理进程会对程序认为无用的附件进行清理。 先不管了,把这 2000 多条数据恢复再说。 Step 10 关闭清理进程 先关闭清理进程,然后看为什么这个程序会把我们实际是需要的数据给清理掉? 读代码,在清理之前,程序会判断那些数据是需要清理的,这里有一个 Join 的 SQL 查询。 这里 Join 了另外一个表。 Step 11 对比 JOIN 表数据量 马上对比另外表的数据量。 这里了明显又丢了好几千条记录。 原来在主题和附件的关系映射表中的数据丢了部分,导致整个附件表的有用数据被当做无效数据清理掉了。 Step 12 数据恢复 把 JOIN 的映射表数据进行恢复。 然后等待重构运行结果,保持清理进程开启,2 天后查看结果。 同时增加服务器备份数量,从保留 30 天的备份,到现在增加到保留 300 天。 Step 13 问题总结和记录 把整个过程总结下来,花个 10 多分钟记录下问题。 上面是针对一个问题进行调试的小过程,如果你对系统比较熟悉的话,很快就会定位到映射部分。如果对系统不熟悉的话,上面的步骤就是一个几乎完整的 Debug 流程。 在上面的流程中到处都是坑,这就是为什么有些人看起来只需要几个小时或者几分钟就解决问题了,你却用了几天的时候,甚至几天都没有进展。 相信我,不是因为你不够优秀,仅仅是因为你对已有的这套系统的设计,数据,逻辑不熟悉而已,这没什么大不了的,时间问题。   https://www.isharkfly.com/t/topic/14724

2023年09月08日 0Comments 409Browse 0Like Read more
Computer Science

群晖(Synology)NAS 后台安装 Docker 后配置 PostgreSQL

群晖(Synology)NAS 的后台在新版本对 Docker 不再称为 Docker,现在改称为 Container Manager 了。     单击进入后运行 Container Manager。 PostgreSQL 容器 针对 PostgreSQL 的容器,我们选择容器后,如果你已经安装了 PostgreSQL 的话,应该就能看到运行的容器了。     然后选择设置。 在 PostgreSQL 的容器设置中有 2 个参数比较重要。 端口 第一个是 PostgreSQL 的端口,默认是 5432,但是不知道为什么我的 NAS 提示 5432 端口被占用了。 所以我还必须使用另外端口来进行映射。 我选择的端口是 5433 来进行映射。 在局域网中,我们需要端口 5433 来链接运行在 5422 的 PostgreSQL 服务。 环境变量 另外一个重要的环境变量是 POSTGRES_PASSWORD,这个是连接 PostgreSQL 的默认密码。 如果这个变量不设置的话,PostgreSQL 容器是没有办法启动的。     当上面的 2 个参数被设置好以后,PostgreSQL 容器应该可以运行的了。 然后使用 pgAdmin 进行连接测试。   https://www.isharkfly.com/t/synology-nas-docker-postgresql/14719

2023年09月08日 0Comments 542Browse 0Like Read more
1…4142434445…237
Archives
  • June 2026
  • May 2026
  • April 2026
  • March 2026
  • February 2026
  • January 2026
  • December 2025
  • November 2025
  • October 2025
  • September 2025
  • August 2025
  • July 2025
  • June 2025
  • May 2025
  • April 2025
  • March 2025
  • February 2025
  • January 2025
  • December 2024
  • November 2024
  • October 2024
  • September 2024
  • August 2024
  • July 2024
  • June 2024
  • May 2024
  • April 2024
  • March 2024
  • February 2024
  • January 2024
  • December 2023
  • November 2023
  • October 2023
  • September 2023
  • August 2023
  • July 2023
  • June 2023
  • May 2023
  • April 2023
  • December 2022
  • November 2022
  • October 2022
  • September 2022
  • August 2022
  • May 2022
  • April 2022
  • March 2022
  • February 2022
  • January 2022
  • December 2021
  • November 2021
  • October 2021
  • September 2021
  • August 2021
  • July 2021
  • June 2021
  • May 2021
  • April 2021
  • March 2021
  • February 2021
  • January 2021
  • December 2020
  • November 2020
  • October 2020
  • September 2020
  • August 2020
  • July 2020
  • June 2020
  • May 2020
  • April 2020
  • March 2020
  • February 2020
  • January 2020
  • December 2019
  • November 2019
  • October 2019
  • September 2019
  • August 2019
  • July 2019
  • June 2019
  • May 2019
  • April 2019
  • March 2019
  • February 2019
  • January 2019
  • December 2018
  • November 2018
  • October 2018
  • September 2018
  • August 2018
  • July 2018
  • June 2018
  • May 2018
  • April 2018
  • March 2018
Categories
  • Computer Science (2,367)
    • Confluence (663)
    • Gradle (12)
  • U.S. (512)
  • 文化旅游 (146)

COPYRIGHT © 2020 CWIKIUS. ALL RIGHTS RESERVED.

THEME KRATOS MADE BY VTROIS

湘ICP备2020018253号-1