这次所要做的测试是比较几种我们常用的数据库连接池的性能,他们分别是:c3p0 ,Proxool ,Druid ,Tomcat Jdbc Pool这四种,测试将采用统一的参数配置力求比较“公平”的体现统一水平下几种连接池的不同,有网友回复说测试不公平会互相干扰,那我就把代码分开,代码是死的人是活的,做事情不动脑只能吃别人剩下的,世界上没有绝对公平的事情,我在此只提供了一个思路,更多的测试还需要你自己去完成。
1.创建类TestDAO,封装统一的查询方法 :
import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class TestDAO { private final static String sql = "SELECT * FROM USER u WHERE u.USR_ID=9999"; public void query(Connection conn) { try { Statement st = conn.createStatement(); ResultSet result = st.executeQuery(sql); result.close(); st.close(); conn.close(); } catch (SQLException e) { e.printStackTrace(); } } }
2.创建测试类TestMain,其中包含:统一参数配置属性、获取各种连接池数据源方法、各种数据源调用方法等,下面分别是各种数据源的测试Main方法,开始测试之前做100次查询操作以初始化连接池并起到稳定测试结果作用:
(1)c3p0测试代码:
import java.beans.PropertyVetoException; import java.io.IOException; import java.sql.SQLException; import com.mchange.v2.c3p0.ComboPooledDataSource; public class C3p0Test { // 数据库驱动名称 final static String driver = "com.mysql.jdbc.Driver"; // 数据库连接地址 final static String jdbcUrl = "jdbc:mysql://192.168.0.1:3306/test"; // 数据库用户名 final static String user = "dba"; // 数据库密码 final static String passwd = "dba"; // 连接池初始化大小 final static int initialSize = 5; // 连接池最小空闲 final static int minPoolSize = 10; // 连接池最大连接数量 final static int maxPoolSize = 50; // 最小逐出时间,100秒 final static int maxIdleTime = 100000; // 连接失败重试次数 final static int retryAttempts = 10; // 当连接池连接耗尽时获取连接数 final static int acquireIncrement = 5; // c3p0数据源 final static ComboPooledDataSource c3p0DataSource = getC3p0DataSource(); // 查询次数 final static int count = 10; /** * 测试方式: 每种数据源配置信息尽量相同,以求结果更加准确 * 每种数据源做10次、100次、500次、1000次、2000次、4000次、8000次查询操作 每种查询重复100次,查看100次执行时间的波动图 * @param args * @throws IOException * @throws SQLException */ public static void main(String[] args) throws IOException, SQLException { TestDAO testDAO = new TestDAO(); System.out.println("查询次数为:" + count); System.out.println(); System.out.println("==========================c3p0 测试开始=========================="); // 测试c3p0 for (int i = 0; i < 100; i++) { queryC3p0(testDAO, c3p0DataSource, count); } System.out.println("==========================c3p0 测试结束=========================="); } /** * c3p0测试 * @param testDAO * @param ds * @param count * @throws SQLException */ public static void queryC3p0(TestDAO testDAO, ComboPooledDataSource ds, int count) throws SQLException { // 查询100次以初始化连接池 for (int i = 0; i < 100; i++) { testDAO.query(ds.getConnection()); } // 开始时间 long startMillis = System.currentTimeMillis(); // 循环查询 for (int i = 0; i < count; i++) { testDAO.query(ds.getConnection()); } // 结束时间 long endMillis = System.currentTimeMillis(); // 输出结束时间 System.out.println(endMillis - startMillis); } /** * 获取c3p0数据源 * @throws PropertyVetoException */ public static ComboPooledDataSource getC3p0DataSource() { // 设置参数 ComboPooledDataSource cpds = new ComboPooledDataSource(); try { cpds.setDriverClass(driver); } catch (PropertyVetoException e) { e.printStackTrace(); } cpds.setJdbcUrl(jdbcUrl); cpds.setUser(user); cpds.setPassword(passwd); cpds.setInitialPoolSize(initialSize); cpds.setMinPoolSize(minPoolSize); cpds.setMaxPoolSize(maxPoolSize); cpds.setMaxIdleTime(maxIdleTime); cpds.setAcquireRetryAttempts(retryAttempts); cpds.setAcquireIncrement(acquireIncrement); cpds.setTestConnectionOnCheckin(false); cpds.setTestConnectionOnCheckout(false); return cpds; } }
(2)Proxool测试代码:
import java.io.IOException; import java.sql.SQLException; import org.logicalcobwebs.proxool.ProxoolDataSource; public class ProxoolTest { // 数据库驱动名称 final static String driver = "com.mysql.jdbc.Driver"; // 数据库连接地址 final static String jdbcUrl = "jdbc:mysql://192.168.0.1:3306/test"; // 数据库用户名 final static String user = "dba"; // 数据库密码 final static String passwd = "dba"; // 连接池初始化大小 final static int initialSize = 5; // 连接池最小空闲 final static int minPoolSize = 10; // 连接池最大连接数量 final static int maxPoolSize = 50; // 最小逐出时间,100秒 final static int maxIdleTime = 100000; // 连接失败重试次数 final static int retryAttempts = 10; // 当连接池连接耗尽时获取连接数 final static int acquireIncrement = 5; // Proxool数据源 final static ProxoolDataSource proxoolDataSource = getProxoolDataSource(); // 查询次数 final static int count = 10; /** * 测试方式: 每种数据源配置信息尽量相同,以求结果更加准确 * 每种数据源做10次、100次、500次、1000次、2000次、4000次、8000次查询操作 每种查询重复100次,查看100次执行时间的波动图 * @param args * @throws IOException * @throws SQLException */ public static void main(String[] args) throws IOException, SQLException { TestDAO testDAO = new TestDAO(); System.out.println("查询次数为:" + count); System.out.println(); System.out.println("==========================Proxool 测试开始=========================="); // 测试Proxool for (int i = 0; i < 100; i++) { queryProxxool(testDAO, proxoolDataSource, count); } System.out.println("==========================Proxool 测试结束=========================="); } /** * Proxxool测试 * @param testDAO * @param ds * @param count * @throws SQLException */ public static void queryProxxool(TestDAO testDAO, ProxoolDataSource ds, int count) throws SQLException { // 查询100次以初始化连接池 for (int i = 0; i < 100; i++) { testDAO.query(ds.getConnection()); } // 开始时间 long startMillis = System.currentTimeMillis(); // 循环查询 for (int i = 0; i < count; i++) { testDAO.query(ds.getConnection()); } // 结束时间 long endMillis = System.currentTimeMillis(); // 输出结束时间 System.out.println(endMillis - startMillis); } /** * 获取Proxool数据源 * @return */ public static ProxoolDataSource getProxoolDataSource() { ProxoolDataSource pds = new ProxoolDataSource(); pds.setAlias("mysql"); pds.setUser(user); pds.setPassword(passwd); pds.setDriverUrl(jdbcUrl); pds.setDriver(driver); pds.setMaximumActiveTime(maxIdleTime); pds.setMaximumConnectionCount(maxPoolSize); pds.setMinimumConnectionCount(initialSize); pds.setPrototypeCount(minPoolSize); pds.setTestBeforeUse(false); pds.setTestAfterUse(false); return pds; } }
(3)Druid测试代码:
import java.io.IOException; import java.sql.SQLException; import com.alibaba.druid.pool.DruidDataSource; public class DruidTest { // 数据库驱动名称 final static String driver = "com.mysql.jdbc.Driver"; // 数据库连接地址 final static String jdbcUrl = "jdbc:mysql://192.168.0.1:3306/test"; // 数据库用户名 final static String user = "dba"; // 数据库密码 final static String passwd = "dba"; // 连接池初始化大小 final static int initialSize = 5; // 连接池最小空闲 final static int minPoolSize = 10; // 连接池最大连接数量 final static int maxPoolSize = 50; // 最小逐出时间,100秒 final static int maxIdleTime = 100000; // 连接失败重试次数 final static int retryAttempts = 10; // 当连接池连接耗尽时获取连接数 final static int acquireIncrement = 5; // Druid数据源 final static DruidDataSource druidDataSource = getDruidDataSource(); // 查询次数 final static int count = 10; /** * 测试方式: 每种数据源配置信息尽量相同,以求结果更加准确 * 每种数据源做10次、100次、500次、1000次、2000次、4000次、8000次查询操作 每种查询重复100次,查看100次执行时间的波动图 * @param args * @throws IOException * @throws SQLException */ public static void main(String[] args) throws IOException, SQLException { TestDAO testDAO = new TestDAO(); System.out.println("查询次数为:" + count); System.out.println(); System.out.println("==========================Druid 测试开始=========================="); // 测试Druid for (int i = 0; i < 100; i++) { queryDruid(testDAO, druidDataSource, count); } System.out.println("==========================Druid 测试结束=========================="); } /** * Druid测试 * @param testDAO * @param ds * @param count * @throws SQLException */ public static void queryDruid(TestDAO testDAO, DruidDataSource ds, int count) throws SQLException { // 查询100次以初始化连接池 for (int i = 0; i < 100; i++) { testDAO.query(ds.getConnection()); } // 开始时间 long startMillis = System.currentTimeMillis(); // 循环查询 for (int i = 0; i < count; i++) { testDAO.query(ds.getConnection()); } // 结束时间 long endMillis = System.currentTimeMillis(); // 输出结束时间 System.out.println(endMillis - startMillis); } /** * 获取Druid数据源 * @return */ public static DruidDataSource getDruidDataSource() { DruidDataSource dds = new DruidDataSource(); dds.setUsername(user); dds.setUrl(jdbcUrl); dds.setPassword(passwd); dds.setDriverClassName(driver); dds.setInitialSize(initialSize); dds.setMaxActive(maxPoolSize); dds.setMaxWait(maxIdleTime); dds.setTestWhileIdle(false); dds.setTestOnReturn(false); dds.setTestOnBorrow(false); return dds; } }
(4)Tomcat Jdbc Pool测试代码:
import java.io.IOException; import java.sql.SQLException; import org.apache.tomcat.jdbc.pool.DataSource; public class TomcatTest { // 数据库驱动名称 final static String driver = "com.mysql.jdbc.Driver"; // 数据库连接地址 final static String jdbcUrl = "jdbc:mysql://192.168.0.1:3306/test"; // 数据库用户名 final static String user = "dba"; // 数据库密码 final static String passwd = "dba"; // 连接池初始化大小 final static int initialSize = 5; // 连接池最小空闲 final static int minPoolSize = 10; // 连接池最大连接数量 final static int maxPoolSize = 50; // 最小逐出时间,100秒 final static int maxIdleTime = 100000; // 连接失败重试次数 final static int retryAttempts = 10; // 当连接池连接耗尽时获取连接数 final static int acquireIncrement = 5; // Tomcat Jdbc Pool数据源 final static DataSource tomcatDataSource = getTomcatDataSource(); // 查询次数 final static int count = 100; /** * 测试方式: 每种数据源配置信息尽量相同,以求结果更加准确 * 每种数据源做10次、100次、500次、1000次、2000次、4000次、8000次查询操作 每种查询重复100次,查看100次执行时间的波动图 * @param args * @throws IOException * @throws SQLException */ public static void main(String[] args) throws IOException, SQLException { TestDAO testDAO = new TestDAO(); System.out.println("查询次数为:" + count); System.out.println(); System.out.println("==========================Tomcat Jdbc Pool 测试开始=========================="); // 测试Tomcat Jdbc Pool for (int i = 0; i < 100; i++) { queryTomcatJDBC(testDAO, tomcatDataSource, count); } System.out.println("==========================Tomcat Jdbc Pool 测试结束=========================="); } /** * Tomcat Jdbc Pool测试 * @param testDAO * @param ds * @param count * @throws SQLException */ public static void queryTomcatJDBC(TestDAO testDAO, DataSource ds, int count) throws SQLException { // 查询100次以初始化连接池 for (int i = 0; i < 100; i++) { testDAO.query(ds.getConnection()); } // 开始时间 long startMillis = System.currentTimeMillis(); // 循环查询 for (int i = 0; i < count; i++) { testDAO.query(ds.getConnection()); } // 结束时间 long endMillis = System.currentTimeMillis(); // 输出结束时间 System.out.println(endMillis - startMillis); } /** * 获取Apache tomcat jdbc pool数据源 * @return */ public static DataSource getTomcatDataSource() { DataSource ds = new DataSource(); ds.setUrl(jdbcUrl); ds.setUsername(user); ds.setPassword(passwd); ds.setDriverClassName(driver); ds.setInitialSize(initialSize); ds.setMaxIdle(minPoolSize); ds.setMaxActive(maxPoolSize); ds.setTestWhileIdle(false); ds.setTestOnBorrow(false); ds.setTestOnConnect(false); ds.setTestOnReturn(false); return ds; } }
3.将测试结果粘贴到excel中,生成图表进行对比,可以很直观的看出几种数据源的性能差异,本文底部有此次测试的结果文档。
以下就是此次测试结果(本结果只供参考,更具体更准确的测试可以自行进行):
1.测试次数为10次时:
平均用时(单位:毫秒):
c3p0 | 32.26 |
Proxool | 33.42 |
Druid | 30.43 |
Tomcat Jdbc Pool | 37.61 |
2.测试次数为100次时:
平均用时(单位:毫秒):
c3p0 | 409.94 |
Proxool | 447.49 |
Druid | 382.7 |
Tomcat Jdbc Pool | 386.3 |
3.测试次数为500次时:
平均用时(单位:毫秒):
c3p0 | 1700.95 |
Proxool | 2053.85 |
Druid | 1777.36 |
Tomcat Jdbc Pool | 1749.02 |
4.测试次数为1000次时:
平均用时(单位:毫秒):
c3p0 | 3549.29 |
Proxool | 3435.8 |
Druid | 3167.59 |
Tomcat Jdbc Pool | 3162.25 |
因为测试耗时很长,所以我只做到了1000次查询测试,感兴趣的朋友可以继续更大规模的测试或修改相应参数来符合项目自身情况,这里不比去追究测试数据的准确性,比较测试程度还不够,且存在很大的偶然性,大家可以修改以上代码进行更精准的测试,只需要将数据导入到本文末尾的excel表格中即可生成相应测试图表。
很多人总是会回复在问“你的测试准不准啊?”,“你的测试一点都不准!”等等,其实我想说的是:不要太在意别人的结果,重要的是自己去做!
相关推荐
本文将详细介绍几个常见的Java数据库连接池实现:C3P0、Druid、JNDI、DBCP、Proxool以及BoneCP,并结合Spring+MyBatis+maven环境下的应用示例进行解析。 1. C3P0: C3P0是一个开源的JDBC连接池,它实现了数据源和...
* C3P0比较耗费资源,效率方面可能要低一点。 * DBCP在实践中存在BUG,在某些种情会产生很多空连接不能释放,Hibernate3.0已经放弃了对其的支持。 * Proxool的负面评价较少,现在比较推荐它,而且它还提供即时监控...
- c3p0:这是一个JDBC连接池,集成在Hibernate中,支持JDBC3和JDBC2扩展规范。c3p0提供了连接和Statement的池化,具备自动检测失效连接的功能。 - Druid:阿里巴巴开发的数据库连接池,不仅是一个连接池,还包括...
内容概要:本文详细介绍了如何利用STM32和MATLAB实现倒立摆控制系统。首先,文章讲解了硬件部分,包括STM32F4作为主控、TB6612驱动直流电机以及MPU6050进行角度采集。接着,深入探讨了PID控制算法的应用,尤其是增量式PID算法及其参数调节方法。此外,文章强调了MATLAB Simulink仿真的重要性,展示了如何通过Simulink自动生成适用于STM32的嵌入式代码。最后,分享了一些实用技巧,如角度采集的互补滤波算法、PWM输出限幅、硬件设计注意事项等。 适合人群:对嵌入式系统和自动化控制感兴趣的电子工程师、机器人爱好者以及有一定编程基础的学习者。 使用场景及目标:①帮助读者理解并掌握倒立摆控制系统的原理和技术细节;②提供从理论到实践的具体步骤指导,便于读者复现实验;③培养解决实际问题的能力,提高对PID控制和其他相关技术的理解。 其他说明:文中提供了大量源代码片段和硬件设计建议,有助于读者更好地理解和实施项目。同时,作者还分享了许多个人经验和常见错误,使得初学者能够避开一些潜在的陷阱。
内容概要:本文详细介绍了使用组态王6.53构建多种液体混合仿真监控系统的过程。从系统概述出发,涵盖了工程建立、变量定义、画面创建、命令语言编写、监控与调试等多个方面。具体实现了液位监测、阀门控制、搅拌控制、报警处理等功能,并针对可能出现的问题如模拟量输入抖动、阀门死锁、电机启动电流冲击等提供了有效的解决方案。此外,还探讨了硬件配置、数据记录、性能优化等方面的内容,强调了系统稳定性的重要性和实际应用中的注意事项。 适用人群:从事工业自动化领域的工程师和技术人员,尤其是对组态王有一定了解或正在学习组态王的初学者。 使用场景及目标:适用于需要开发类似液体混合仿真监控系统的工程项目,旨在提高系统的稳定性和可靠性,减少故障发生率,提升生产效率。 其他说明:文中不仅提供了详细的步骤指导,还分享了许多作者在实践中积累的经验和技巧,对于理解和掌握组态王的应用具有很高的参考价值。
内容概要:本文详细介绍了双馈风力发电机(DFIG)采用直接功率控制(DPC)策略的Matlab/Simulink模型搭建过程。首先解释了DPC相对于传统矢量控制的优势,然后逐步讲解了模型各组成部分的搭建方法,包括风速模块、风力机模型、双馈发电机模型、变换器模型和直接功率控制器模块。文中还提供了具体的MATLAB代码示例,展示了如何实现风速模拟、功率计算、PI控制算法等功能。此外,文章强调了模型调试过程中需要注意的关键点,如坐标变换、采样频率、滞环宽度等,并分享了一些实用的经验技巧。 适合人群:从事风力发电研究的技术人员、高校相关专业师生、对电力电子控制系统有兴趣的学习者。 使用场景及目标:适用于希望深入了解DFIG运行机制及其控制策略的研究人员和技术开发者。通过构建和仿真该模型,能够更好地掌握DPC的工作原理,优化风力发电系统的性能,提高发电效率和稳定性。 其他说明:文章不仅提供了详细的理论背景介绍,还包括大量实用的操作指南和代码片段,帮助读者快速入门并在实践中不断改进和完善自己的模型。
内容概要:本文详细介绍了使用COMSOL进行三维摩擦发电机数值模拟的方法和技术要点。首先讨论了几何建模的具体步骤,包括使用布尔运算创建咬合结构以及调整电极尺寸。接下来深入探讨了电荷密度的设定方法,强调了自定义场函数的应用及其灵活性。随后讲解了电场分布的计算,特别指出自适应网格细化的重要性,并展示了不同材料组合对电荷密度和电场分布的影响。此外,文中还提到了一些常见的陷阱,如介电常数设置不当可能导致模型偏差,并提供了相应的解决办法。最后,作者分享了一些实用的经验和技巧,帮助提高模拟的准确性和效率。 适合人群:从事电磁学、材料科学或相关领域的研究人员和工程师,尤其是那些希望深入了解摩擦发电机工作机制的人。 使用场景及目标:适用于需要精确模拟和分析摩擦发电机性能的研究项目。主要目标是通过数值模拟优化电荷密度和电场分布,从而提高摩擦发电机的能量转换效率。 其他说明:文中不仅提供了详细的建模指导,还包括了许多实用的代码片段和注意事项,有助于读者更好地理解和应用所学知识。
文档支持目录章节跳转同时还支持阅读器左侧大纲显示和章节快速定位,文档内容完整、条理清晰。文档内所有文字、图表、函数、目录等元素均显示正常,无任何异常情况,敬请您放心查阅与使用。文档仅供学习参考,请勿用作商业用途。 Rust 以内存安全、零成本抽象和并发高效的特性,重塑编程体验。无需垃圾回收,却能通过所有权与借用检查机制杜绝空指针、数据竞争等隐患。从底层系统开发到 Web 服务构建,从物联网设备到高性能区块链,它凭借出色的性能和可靠性,成为开发者的全能利器。拥抱 Rust,解锁高效、安全编程新境界!
内容概要:本文详细探讨了基于能源集线器参数的电热综合能源市场双层出清模型的实现。首先介绍了综合能源系统及其重要组成部分——能源集线器的功能,即作为电、热等不同能源形式的转换和分配枢纽。接着展示了如何使用MATLAB进行参数初始化、上层优化目标计算以及下层市场出清的潮流计算简化。文中还重点讲解了CPLEX在处理双层模型中的作用,如将MPEC问题转化为MILP并通过KKT条件解决市场博弈问题。此外,通过实例演示了电热价差对储热量的影响,并讨论了蒙特卡洛模拟用于处理风光出力不确定性的方法。最后给出了求解器调用时需要注意的问题和调试技巧。 适合人群:从事能源系统研究的专业人士、研究生及以上学历的学生,尤其是那些对电热综合能源市场、能源集线器、MATLAB编程和优化算法感兴趣的人群。 使用场景及目标:适用于希望深入了解并掌握电热综合能源市场运作机制的研究人员和技术开发者。目标是帮助读者理解如何利用MATLAB和CPLEX构建高效的能源管理系统,从而提高能源利用率,降低运营成本。 其他说明:文中提供了大量实用的MATLAB代码片段,有助于读者快速上手实践。同时提醒读者在实际应用中应注意求解器参数配置等问题,确保模型的有效性和准确性。
中心锥锥角对涡喷发动机尾喷管气动性能影响规律研究.pdf
内容概要:本文探讨了如何利用MATLAB代码实现综合能源系统在碳交易机制和需求响应下的优化运行。首先介绍了需求响应模型的两种类型:价格型和替代型。价格型需求响应基于价格弹性矩阵,描述了能源价格变动对用户需求的影响;替代型需求响应则关注电能和热能之间的转换。接着讨论了碳交易机制的构建,包括碳排放量的计算和碳排放配额的分配方法。然后提出了综合能源系统的低碳优化运行模型,设定了购能成本、碳交易成本及运维成本之和最小为目标函数,并通过线性规划求解。最后,通过对四种典型场景的验证,展示了模型的有效性。 适合人群:从事综合能源系统研究的技术人员、研究生及以上学历的研究人员。 使用场景及目标:适用于希望深入了解综合能源系统优化运行机制的人群,尤其是希望通过MATLAB代码实现具体模型构建和技术验证的专业人士。目标是在满足多种约束条件下,实现综合能源系统的低碳优化运行,降低运营成本并有效管理碳排放。 阅读建议:由于涉及较多具体的MATLAB代码实现细节,建议读者具备一定的编程基础和相关领域的背景知识,以便更好地理解和应用文中提供的技术和方法。
内容概要:本文深入探讨了路径规划算法的研究进展,特别是对经典的蚁群算法进行了多项创新性的改进。作者详细介绍了如何利用Matlab实现蚁群算法的基本框架,并针对路径平滑度不足的问题提出了基于Flod算法的双向平滑度优化方法。此外,还自主研发了一种全新的路径规划算法,能够灵活应对不同的地图环境。通过对多种算法的实际性能对比,展示了改进后的蚁群算法在路径长度和平滑度方面的显著提升。 适合人群:对路径规划算法感兴趣的科研人员、工程师以及高校师生。 使用场景及目标:适用于需要高效、平滑路径规划的应用场合,如机器人导航、物流配送系统等。目标是为用户提供一种更为智能化、高效的路径解决方案。 其他说明:文中提供了详细的代码片段和技术细节,有助于读者理解和复现实验结果。同时,强调了算法在实际应用场景中的表现和潜在价值。
图书馆管理系统源代码.7z
文档支持目录章节跳转同时还支持阅读器左侧大纲显示和章节快速定位,文档内容完整、条理清晰。文档内所有文字、图表、函数、目录等元素均显示正常,无任何异常情况,敬请您放心查阅与使用。文档仅供学习参考,请勿用作商业用途。 Rust 以内存安全、零成本抽象和并发高效的特性,重塑编程体验。无需垃圾回收,却能通过所有权与借用检查机制杜绝空指针、数据竞争等隐患。从底层系统开发到 Web 服务构建,从物联网设备到高性能区块链,它凭借出色的性能和可靠性,成为开发者的全能利器。拥抱 Rust,解锁高效、安全编程新境界!
文档支持目录章节跳转同时还支持阅读器左侧大纲显示和章节快速定位,文档内容完整、条理清晰。文档内所有文字、图表、函数、目录等元素均显示正常,无任何异常情况,敬请您放心查阅与使用。文档仅供学习参考,请勿用作商业用途。 编译闪电般迅速,并发性能卓越,部署轻松简单!Go 语言以极简设计理念和出色工程性能,成为云原生时代的首选编程语言。从 Docker 到 Kubernetes,全球顶尖科技企业都在采用 Go。点击了解 Go 语言的核心优势、实战窍门和未来走向,开启高效编程的全新体验!
c++-信息解密-代码
没啥东西
数字集群通信系统综述.pdf
基于谓词逻辑的归结原理研究.pdf