前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >干掉Druid,HakariCP 为什么这么快?

干掉Druid,HakariCP 为什么这么快?

作者头像
码猿技术专栏
发布于 2024-01-29 03:50:28
发布于 2024-01-29 03:50:28
28400
代码可运行
举报
运行总次数:0
代码可运行

大家好,我是不才陈某~

Springboot 2.0将 HikariCP 作为默认数据库连接池这一事件之后,HikariCP 作为一个后起之秀出现在大众的视野中。HikariCP 是在日本的程序员开源的,hikari日语意思为“光”,HikariCP 也以速度快的特点受到越来越多人的青睐。

今天就让我们来探讨一下HikariCP为什么这么快?

连接池技术

我们平常编码过程中,经常会碰到线程池啊,数据库连接池啊等等,那么这个池到底是一门怎样的技术呢?

简单来说,连接池是一个创建和管理连接的缓冲池技术。连接池主要由三部分组成:连接池的建立、连接池中连接的使用管理、连接池的关闭。

连接池技术的核心思想是:连接复用,通过建立一个数据库连接池以及一套连接使用、分配、管理策略,使得该连接池中的连接可以得到高效、安全的复用。它不仅仅只限于管理数据库访问连接,也可以管理其他连接资源。

HakariCP

HakariCP 项目的 README 中的一段话。

Fast, simple, reliable. HikariCP is a "zero-overhead" production ready JDBC connection pool. At roughly 130Kb, the library is very light.

快速、简单、可靠。HikariCP是一个“零开销”的生产就绪JDBC连接池。这个库大约有130Kb,非常轻。

这个介绍真是简洁但“全面”。搭配上下边这张图。

img

看到这些数据,再加上Springboot 2.0 将 HikariCP 作为默认数据库连接池这件事,我已经十分好奇 HikariCP 的实现原理了。

HikariCP为什么这么快?

  • 两个HikariPool:定义了两个HikariPool对象,一个采用final类型定义,避免在获取连接时才初始化,提高性能,也避免volatile的额外开销。
  • FastList替代ArrayList:采用自定义的FastList替代了ArrayList,FastList的get方法去除了范围检查逻辑,并且remove方法是从尾部开始扫描的,而并不是从头部开始扫描的。因为Connection的打开和关闭顺序通常是相反的。
  • 更快的并发集合实现:使用自定义ConcurrentBag,性能更优。
  • 更快的获取连接:同一个线程获取数据库连接时从ThreadLocal中获取,没有并发操作。
  • 精简字节码:HikariCP利用了一个第三方的Java字节码修改类库Javassist来生成委托实现动态代理,速度更快,相比于JDK 代理生成的字节码更少。

HikariCP原理

我们通过分析源码来看 HikariCP 是如何这么快的。先来看一下 HikariCP 的简单使用。

maven依赖:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependency>
    <groupId>com.zaxxer</groupId>
    <artifactId>HikariCP</artifactId>
    <version>4.0.3</version>
</dependency>
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Test
public void testHikariCP() throws SQLException {
    // 1、创建Hikari配置
    HikariConfig hikariConfig = new HikariConfig();
    // JDBC连接串
    hikariConfig.setJdbcUrl("jdbc:mysql://127.0.0.1:3306/iam?characterEncoding=utf8");
    // 数据库用户名
    hikariConfig.setUsername("root");
    // 数据库用户密码
    hikariConfig.setPassword("123456");
    // 连接池名称
    hikariConfig.setPoolName("testHikari");
    // 连接池中最小空闲连接数量
    hikariConfig.setMinimumIdle(4);
    // 连接池中最大空闲连接数量
    hikariConfig.setMaximumPoolSize(8);
    // 连接在池中的最大空闲时间
    hikariConfig.setIdleTimeout(600000L);
    // 数据库连接超时时间
    hikariConfig.setConnectionTimeout(10000L);

    // 2、创建数据源
    HikariDataSource dataSource = new HikariDataSource(hikariConfig);

    // 3、获取连接
    Connection connection = dataSource.getConnection();

    // 4、获取Statement
    Statement statement = connection.createStatement();

    // 5、执行Sql
    ResultSet resultSet = statement.executeQuery("SELECT COUNT(*) AS countNum tt_user");

    // 6、输出执行结果
    if (resultSet.next()) {
        System.out.println("countNum结果为:" + resultSet.getInt("countNum"));
    }

    // 7、释放链接
    resultSet.close();
    statement.close();
    connection.close();
    dataSource.close();
}

HikariConfig:可以设置一些数据库基本配置信息和一些连接池的配置信息。

HikariDataSource:实现了 DataSource,DataSource是一个数据源标准或者说规范,Java所有连接池需要基于这个规范进行实现。

我们就从 HikariDataSource 开始说起。HikariDataSource有两个构造方法HikariDataSource()HikariDataSource(HikariConfig configuration)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private final HikariPool fastPathPool;
private volatile HikariPool pool;

public HikariDataSource()
{
   super();
   fastPathPool = null;
}
public HikariDataSource(HikariConfig configuration)
{
   configuration.validate();
   configuration.copyStateTo(this);

   LOGGER.info("{} - Starting...", configuration.getPoolName());
   pool = fastPathPool = new HikariPool(this);
   LOGGER.info("{} - Start completed.", configuration.getPoolName());

   this.seal();
}

HikariPool为什么要有两个(fastPathPool和pool)呢?

可以看到无参构造方法fastPathPool是null,有参构造pool = fastPathPool,采用无参构造在getConnection()时候才会初始化(下边会详细讲解),性能略低,并且pool是volatile关键字修饰,会有一些额外开销。所以建议使用有参构造。这也是HikariPool快的原因之一。

有参构造里有一行new HikariPool(this),我们来看一下怎么个事。

代码太多了,往后只贴关键代码了。。。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public HikariPool(final HikariConfig config)
{
   super(config);
   // 初始化ConcurrentBag对象
   this.connectionBag = new ConcurrentBag<>(this);
   // 创建SuspendResumeLock对象 
   this.suspendResumeLock = config.isAllowPoolSuspension() ? new SuspendResumeLock() : SuspendResumeLock.FAUX_LOCK;
   // 根据配置的最大连接数,创建链表类型阻塞队列
   LinkedBlockingQueue<Runnable> addConnectionQueue = new LinkedBlockingQueue<>(maxPoolSize);
   this.addConnectionQueueReadOnlyView = unmodifiableCollection(addConnectionQueue);
   // 初始化创建连接线程池
   this.addConnectionExecutor = createThreadPoolExecutor(addConnectionQueue, poolName + " connection adder", threadFactory, new ThreadPoolExecutor.DiscardOldestPolicy());
   // 初始化关闭连接线程池
   this.closeConnectionExecutor = createThreadPoolExecutor(maxPoolSize, poolName + " connection closer", threadFactory, new ThreadPoolExecutor.CallerRunsPolicy());
   // 创建保持连接池连接数量的任务
   this.houseKeeperTask = houseKeepingExecutorService.scheduleWithFixedDelay(new HouseKeeper(), 100L, housekeepingPeriodMs, MILLISECONDS);
   ...
}

HikariPool 是为HikariCP提供基本池行为的主要连接池类。

houseKeepingExecutorService.scheduleWithFixedDelay(new HouseKeeper(), 100L, housekeepingPeriodMs, MILLISECONDS)这行代码是 创建保持连接池连接数量的任务。该任务会关闭需要被丢弃的连接,保证最小连接数,HouseKeeper类的run()方法中有一行代码fillPool()会创建连接,我们来看一下。

创建连接

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private synchronized void fillPool()
{
    // 计算需要添加的连接数量
    final int connectionsToAdd = Math.min(config.getMaximumPoolSize() - getTotalConnections(), config.getMinimumIdle() - getIdleConnections()) - addConnectionQueue.size();
    for (int i = 0; i < connectionsToAdd; i++) {
        // 向创建连接线程池中提交创建连接的任务
        addConnectionExecutor.submit((i < connectionsToAdd - 1) ? poolEntryCreator : postFillPoolEntryCreator);
    }
    ...
}

来看一下PoolEntryCreator是如何创建连接的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Override
public Boolean call()
{
   // 连接池状态正常并且需求创建连接时
   while (poolState == POOL_NORMAL && shouldCreateAnotherConnection()) {
      // 创建PoolEntry对象
      final PoolEntry poolEntry = createPoolEntry();
      if (poolEntry != null) {
         // 将PoolEntry对象添加到ConcurrentBag对象中的sharedList中
         connectionBag.add(poolEntry);
         return Boolean.TRUE;
      }
   }
   ...
   return Boolean.FALSE;
}

PoolEntryCreator实现了Callable接口,在call()方法里可以看到创建连接的过程。来继续看一下createPoolEntry()方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 private PoolEntry createPoolEntry()
{
    // 初始化PoolEntry对象
    final PoolEntry poolEntry = newPoolEntry();
    ...
}

继续进入newPoolEntry()方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
PoolEntry newPoolEntry() throws Exception
{
   return new PoolEntry(newConnection(), this, isReadOnly, isAutoCommit);
}

PoolEntry构造时会先创建Connection对象传入构造函数中。PoolEntry是ConcurrentBag实例中用来跟踪Connection的。

获取链接

获取链接是通过getConnection()方法获取的,源码如下。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public Connection getConnection() throws SQLException
{
   if (isClosed()) {
      throw new SQLException("HikariDataSource " + this + " has been closed.");
   }
   
   if (fastPathPool != null) {
      return fastPathPool.getConnection();
   }

   HikariPool result = pool;
   if (result == null) {
      synchronized (this) {
         result = pool;
         if (result == null) {
            validate();
            LOGGER.info("{} - Starting...", getPoolName());
            try {
               pool = result = new HikariPool(this);
               this.seal();
            }
            catch (PoolInitializationException pie) {
               if (pie.getCause() instanceof SQLException) {
                  throw (SQLException) pie.getCause();
               }
               else {
                  throw pie;
               }
            }
            LOGGER.info("{} - Start completed.", getPoolName());
         }
      }
   }

会先去fastPathPool获取连接,如果fastPathPool为null,就会通过pool获取,如果pool也为null,会通过 双检 代码来初始化线程池。

这个上文提到过为什么两个HikariPool,fastPathPool是 final 修饰的,而pool是 volatile 修饰的,这就说明fastPathPool比pool性能更高,所以建议要用有参构造来创建HikariDataSource,才能享受到这点小细节的优化。

继续进入HikariPool#getConnection(final long hardTimeout),方法中有一行关键的代码PoolEntry poolEntry = connectionBag.borrow(timeout, MILLISECONDS),这行代码的作用是从ConcurrentBag中借出一个PoolEntry对象。PoolEntry可以看作是对Connection对象的封装,连接池中存储的连接其实就是一个个的PoolEntry

这个connectionBag是用来做什么的呢?

ConcurrentBag

ConcurrentBag 是HikariCP自定义的一个无锁并发集合类。我们接着来看一下 ConcurrentBag 的成员变量。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private final CopyOnWriteArrayList<T> sharedList;
private final boolean weakThreadLocals;

private final ThreadLocal<List<Object>> threadList;
private final IBagStateListener listener;
private final AtomicInteger waiters;
private volatile boolean closed;

private final SynchronousQueue<T> handoffQueue;

回到borrow()方法,看一下borrow的实现逻辑。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public T borrow(long timeout, final TimeUnit timeUnit) throws InterruptedException
{
   // 从ThreadLocal中获取当前线程绑定的对象集合,存在则获取
   final List<Object> list = threadList.get();
   for (int i = list.size() - 1; i >= 0; i--) {
      final Object entry = list.remove(i);
      @SuppressWarnings("unchecked")
      final T bagEntry = weakThreadLocals ? ((WeakReference<T>) entry).get() : (T) entry;
      if (bagEntry != null && bagEntry.compareAndSet(STATE_NOT_IN_USE, STATE_IN_USE)) {
         return bagEntry;
      }
   }

   // 等待对象加一
   final int waiting = waiters.incrementAndGet();
   try {
      // sharedList有未使用的则返回一个
      for (T bagEntry : sharedList) {
         if (bagEntry.compareAndSet(STATE_NOT_IN_USE, STATE_IN_USE)) {
            // If we may have stolen another waiter's connection, request another bag add.
            if (waiting > 1) {
               listener.addBagItem(waiting - 1);
            }
            return bagEntry;
         }
      }
      // sharedList没有,添加一个监听任务
      listener.addBagItem(waiting);

      timeout = timeUnit.toNanos(timeout);
      do {
         final long start = currentTime();
         // 阻塞队列计时获取
         final T bagEntry = handoffQueue.poll(timeout, NANOSECONDS);
         if (bagEntry == null || bagEntry.compareAndSet(STATE_NOT_IN_USE, STATE_IN_USE)) {
            return bagEntry;
         }

         timeout -= elapsedNanos(start);
      } while (timeout > 10_000);

      return null;
   }
   finally {
      // 等待线程数减一
      waiters.decrementAndGet();
   }
}
  1. 先从ThreadLocal中获取以前用过的连接。ThreadLocal是当前线程的缓存,加快本地连接获取速度。
  2. ThreadLocal中未获取到,会尝试从sharedList中获取,sharedList集合存在初始化的PoolEntry。sharedList是CopyOnWriteArrayList类型的,写时复制,特别适合这种读多写少的场景。
  3. sharedList中未获取到那就到阻塞队列中等着,看有没有归还的连接可以使用。

释放连接

用完连接后我们要释放,通过connection.close()释放连接,释放连接时HakariCP也做到了一些巧妙的细节。ProxyConnection的close()方法是HakariCP释放连接的实现逻辑。我们知道连接关闭前必须要关闭Statement,HakariCP对这里做了优化,来看一下代码实现。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private final FastList<Statement> openStatements;

private synchronized void closeStatements()
{
   final int size = openStatements.size();
   if (size > 0) {
      for (int i = 0; i < size && delegate != ClosedConnection.CLOSED_CONNECTION; i++) {
         try (Statement ignored = openStatements.get(i)) {
         }
         catch (SQLException e) {
            LOGGER.warn("{} - Connection {} marked as broken because of an exception closing open statements during Connection.close()",
                        poolEntry.getPoolName(), delegate);
            leakTask.cancel();
            poolEntry.evict("(exception closing Statements during Connection.close())");
            delegate = ClosedConnection.CLOSED_CONNECTION;
         }
      }

      openStatements.clear();
   }
}

存储Statement对象用的是 FastList,这也是 HakariCP 之所以快的原因之一。

为什么用FastList而不用ArrayList呢?

  • 去掉索引范围检查:查看源码会发现,FastList的get()方法比ArrayList少了一行代码rangeCheck(index),这行代码的作用是范围检查,少了这行代码必然会性能更优。不禁感叹真的是太细了啊,到处都是细节。
  • 尾部删除:FastList#remove()方法是从尾部开始扫描的,而并不是从头部开始扫描的。因为Connection的打开和关闭顺序通常是相反的。FastList的根据下标删除方法也去掉索引范围检查。

关闭掉Statement之后,我们再回过头来继续往下看。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
poolEntry.recycle(lastAccess);

recycle方法会将该连接归还给线程池,recycle方法套了好几层,最终执行的是ConnectionBag的recycle方法,我们直接进入看一下。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public void requite(final T bagEntry)
{
   bagEntry.setState(STATE_NOT_IN_USE);

   for (int i = 0; waiters.get() > 0; i++) {
      if (bagEntry.getState() != STATE_NOT_IN_USE || handoffQueue.offer(bagEntry)) {
         return;
      }
      else if ((i & 0xff) == 0xff) {
         parkNanos(MICROSECONDS.toNanos(10));
      }
      else {
         Thread.yield();
      }
   }

   final List<Object> threadLocalList = threadList.get();
   if (threadLocalList.size() < 50) {
      threadLocalList.add(weakThreadLocals ? new WeakReference<>(bagEntry) : bagEntry);
   }
}

首先将状态设置为未使用,然后判断当前是否存在等待连接的线程,如果存在则将连接加入到公平队列中,由队列中有等待连接的线程则会从阻塞队列中去获取使用;如果当前没有等待连接的线程,并且ThreadLocal中的连接小于50,则将连接添加到本地线程变量ThreadLocal缓存中,当前线程下次获取连接时直接可从ThreadLocal中获取到。

总结

这次源码探究,真的感觉看到了无数个小细节,无数个小优化,积少成多。平时开发过程中,一些小的细节也一定要“扣”。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-01-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码猿技术专栏 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
ProCAST有限元铸造模拟仿真软件CAE
ProCAST作为铸造模拟方案的先锋,是全球首屈一指的材料物理学数值模拟原型和制造流程供应商。PROCAST成功的关键在于使用真实材料物理特性,能够进行更真实的模拟,来代替耗时的物理样机尝试和纠错过程。
用户10047369
2022/09/16
2.4K0
ProCAST有限元铸造模拟仿真软件CAE
Comsol软件是干嘛的?Comsol多物理场仿真软件下载安装,功能介绍
在现代科学技术的发展中,模拟软件是不可或缺的一部分。理论与实践相结合,计算机仿真软件可以帮助我们更好地理解、预测、创新和优化各种物理现象和工程应用。本文将以Comsol Multiphysics® 为例,介绍其独特功能,并探讨其在实际应用中的价值。
优木软件
2023/05/06
8490
固体塑性变形——细观塑性力学
研究材料细观结构对载荷的响应、演化和失效机理,以及细观结构对材料宏观性能的影响的一门新兴学科,是材料科学与固体力学紧密结合的产物。
CAE之家
2022/05/07
6970
流固耦合:基本概念、适用软件及 Abaqus 与 Powerflow 的协同仿真
在工程和科学研究的诸多领域,流固耦合现象广泛存在且对系统性能有着关键影响。理解流固耦合的本质及其应用,对于优化设计、保障安全运行意义重大。同时,借助专业的流固耦合软件,能够更高效地对相关问题进行分析与模拟。接下来,让我们深入探究流固耦合的奥秘,并了解几款主流的流固耦合软件。
思茂信息
2025/04/23
2370
流固耦合:基本概念、适用软件及 Abaqus 与 Powerflow 的协同仿真
Sora再显大模型魔力,CAE也要老将焕新生
在数字经济浪潮汹涌而来的今天,CAE(Computer Aided Engineering,指计算机辅助工程)作为一项成熟的技术领域,正在焕发出全新的生命力。
数据猿
2024/03/04
1730
Sora再显大模型魔力,CAE也要老将焕新生
有限元分析软件Abaqus有哪些功能模块?
Abaqus 是适用于解决从简单(线性)到高度复杂工程问题(多物理场非线性)的一套具有全面仿真计算能力的有限元软件。Abaqus 前处理模块包括丰富的单元、材料模型类型,可以高精度地实现包括金属、橡胶、高分子材料、复合材料、钢筋混凝土、可压缩超弹性泡沫材料以及土壤和岩石等地质材料的工程仿真计算。在多物理场计算方面,Abaqus 不仅能求解结构(应力/位移)问题,还可以高精度求解热传导、质量扩散、热电耦合分析、声学分析、电磁分析、岩土力学分析及压电介质分析。
思茂信息
2025/05/23
810
有限元分析软件Abaqus有哪些功能模块?
有限元分析好不好入门?这些知识你要知道
在工程领域的广袤版图中,有限元分析(Finite Element Analysis, FEA)宛如一把闪耀着智慧光芒的金钥匙,能巧妙开启解决各类复杂问题的大门。但对于众多刚刚踏上探索之旅的初学者而言,有限元分析犹如一座难以攀登的险峻高山,其蕴含的复杂性以及深奥晦涩的数学原理,如同浓重的迷雾,将他们困于山脚,心生迷茫。有限元分析当真如此高不可攀、极难掌握吗?接下来,本文将层层拨开迷雾,为你揭晓这个备受关注问题的答案 。
思茂信息
2025/03/19
1000
有限元分析好不好入门?这些知识你要知道
陈十一院士旗下国产CAE软件开发商获数亿元融资,产品技术已有应用成果
鱼羊 发自 凹非寺 量子位 | 公众号 QbitAI 最新消息,由中国科学院院士陈十一创办的十沣科技,已于近日完成A轮和A+轮融资。 融资金额达到数亿人民币。 十沣科技成立于2020年12月,致力于高端工业软件(CAE)以及数字孪生技术的自主研发与产业化。 资料显示,其研发团队核心成员均为来自于国内外著名高校的博士及博士后,先后参与了众多国家级自主CAE软件及核心技术研发项目。 另外,该公司也招揽了不少国际主流商业工业仿真软件公司的研发人才,长期参与具有国际市场竞争力CAE软件及核心技术的开发。 这两轮融
量子位
2022/03/14
1.6K0
CAE软件有哪些?流体力学方面的软件有哪些?ANSYS是CAE软件吗?
强度分析方面有:ansys、abaqus、nastran、adina等算主流。 流体方面有:fluent、cfx、starcd等等。 多体动力学方面有:adams、simpack等等。 电磁:ansoft、magneforce 铸造:magma、anycasting,procast 注塑:mold flow、moldex3d
开物小编
2021/04/23
3.6K0
CAE软件有哪些?流体力学方面的软件有哪些?ANSYS是CAE软件吗?
【AIGC】数理工科研究:深入解析有限元仿真法
ANSYS 是一款功能强大的工程仿真软件,涵盖结构、流体、电磁、声学等多种物理场仿真。
CSDN-Z
2024/10/17
1.2K0
【AIGC】数理工科研究:深入解析有限元仿真法
WELSIM-全球领先的工程仿真CAE前后处理工具
工程仿真CAE软件经过近几十年的高速发展,已经成为了体系庞大、复杂度极高的产品。用户对仿真CAE软件的期望也随之水涨船高,现代仿真软件既需要计算功能丰富、结果准确,还要求图形化交互界面GUI友好,容易学习和上手。这给中小型开发团队带来了很大的挑战。很多优秀的仿真CAE项目,由于缺乏后续的开发资源,导致项目最终失败或无人问津。也有一些历史悠久的优秀求解器,由于缺乏友好的GUI和保证长久发展的自动化运维系统,而无法扩大用户基数与社区影响力。优秀的求解器无人问津,这无疑给社会资源带来了一定的浪费。
WelSim的小仿真
2023/08/23
4120
一文看懂!3D建模与CAE仿真技术的区别
在一些涉及制造、生产的企业中,我们经常会接触到3D建模与仿真技术,大家对于3D建模这个名词也许并不陌生,但相对于仿真技术而言却寥寥无几,甚至还有人将3D建模与仿真技术画上对等号。
思茂信息
2025/02/24
1230
一文看懂!3D建模与CAE仿真技术的区别
想了解材料热动力学?
自然界中发生的一切物理、化学和生物代谢反应,通常都伴随着热效应的变化,人们对热本质的认识经历了漫长曲折的探索历程。
CAE学习笔记
2022/06/13
1.1K0
什么是仿真?一文读懂有限元分析究竟能给人们带来什么
万物皆可开箱,万物皆可盲盒,万物皆可云......世间万物似乎已经被脑洞大开的网友们玩坏了。今天,我们就来聊一聊万物皆可“仿”的仿真软件——Abaqus。
思茂信息
2025/02/20
3560
什么是仿真?一文读懂有限元分析究竟能给人们带来什么
ProCAST有限元铸造工艺模拟软件
ProCAST是一款使用有限元方法(FEM)的铸造仿真软件。可以对包括考虑角度因子的热辐射在内的热传导(热对流),包括铸型填充的流体流动以及全耦合温度场计算(热力学)的应力进行模拟。此外,软件还可以进行微观组织、热处理、晶粒结构和缩孔缩松等模拟。
用户学习笔记
2022/06/28
2.8K1
Abaqus 读什么?软件简介来啦
Abaqus(发音为“ab-uh-kus”)是一款由达索系统公司(Dassault Systèmes)开发的全面仿真计算能力强大的有限元软件。作为工程仿真领域的领先产品之一,Abaqus提供了广泛的功能和工具,可用于解决从简单到高度复杂的工程问题。
思茂信息
2025/03/31
2970
Abaqus 读什么?软件简介来啦
系统仿真明知道“算不准”,但为什么还是研发设计不可缺少的重要一环
我们研究工程问题本来就是一种近似求解,而系统仿真在其中扮演的是一个风险预测的角色,本质上属于数值计算,必然存在计算误差、截断误差、机器误差等,它不像求解算术问题1+1=2这种,必须要得到一个精确值。
用户9925864
2024/07/12
2290
系统仿真明知道“算不准”,但为什么还是研发设计不可缺少的重要一环
国产AI巨头攻破CAE壁垒:DeepSeek如何让Abaqus效率飙升10倍?
传统CAE仿真的本质是通过物理建模还原现实世界的运行规律,其核心局限在于确定性输入与开放性场景的矛盾。当AI引擎与有限元分析深度耦合,形成了“物理规律+数据智能"的双引擎驱动范式。这一转型突破了三个维度的边界:
思茂信息
2025/02/18
4880
国产AI巨头攻破CAE壁垒:DeepSeek如何让Abaqus效率飙升10倍?
问问DeekSeek,为什么裂纹分析推荐用Abaqus?
自国内AI领军企业深度求索(DeepSeek)发布开源大模型DeepSeek-R1以来,这款国产AI产品持续展现强大市场穿透力。最新数据显示,该产品不仅稳居中国区App Store免费应用榜首,更在美国市场力压ChatGPT、Google Gemini、Microsoft Copilot等国际巨头产品,成为首个登顶美国iOS免费总榜的中国生成式AI应用。
思茂信息
2025/03/06
700
问问DeekSeek,为什么裂纹分析推荐用Abaqus?
Abaqus为何是有限元分析领域的佼佼者?
在工程模拟的广袤天地里,有限元分析软件宛如繁星点点,各自闪耀。而 Abaqus,无疑是其中极为璀璨的一颗,堪称有限元分析软件中的 “尖子生”。那么,它究竟凭什么能获此殊荣呢 ?
思茂信息
2025/05/27
990
Abaqus为何是有限元分析领域的佼佼者?
推荐阅读
相关推荐
ProCAST有限元铸造模拟仿真软件CAE
更多 >
LV.1
这个人很懒,什么都没有留下~
目录
  • 连接池技术
  • HakariCP
  • HikariCP为什么这么快?
  • HikariCP原理
    • HikariPool为什么要有两个(fastPathPool和pool)呢?
    • 创建连接
    • 获取链接
    • ConcurrentBag
    • 释放连接
    • 为什么用FastList而不用ArrayList呢?
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档