




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、毕业设计(计算机应用工程系) 设计课题: Java数据库连接池 专业班级: 计算机应用工程系0701 学生姓名: 孟德军 学生学号: 指导教师: * 第一章 目录SJCP2第二章 课题背景31. 设计目的32. 连接池优点33. 减少连接创建时间34. 简化的编程模式35. 受控的资源使用46. 开源连接池46.1 C3P0 C3P046.2 Proxool46.3 Jakarta DBCP DBCP46.4 DDConnectionBroker DDConnectionBroker46.5 DBPool DBPool46.6 XAPool XAPoo46.7 Primrose Primros
2、e56.8 SmartPool SmartPool56.9 MiniConnectionPoolManager MiniConnectionPoolManager56.10 BoneCP BoneCP5第三章 数据库61. 数据库概述62. 数据库连接池的基本原理63. 连接池的工作原理7第四章 连接池概念81. 连接池中的关键技术82. 连接池的分配与释放83. 连接池的维护8第五章 系统总体设计思想及方案9设计理念91. 连接池中的管理机制92. 并发问题103. 连接池的分配与释放104. 连接池的关闭10第六章 设计流程111. 连接池的管理172. 连接池的关闭173. 连接池的测试
3、184. 性能优化23事务23连接管理23使用更新235. 连接池的泄露问题236. 产生现象247. 解决办法24第七章 结 论26第八章 参考文献27SJCP摘要 在基于JDBC的数据库实际应用开发中,对数据库连接的管理是一个重点也是一个难点,频繁对数据库的连接与关闭操作、多客户对数据库的并发访问,一定程度上决定了WEB系统的响应以及应用性能。使用数据库连接池方式能对数据库的连接进行管理和维护,上层应用程序通过数据库连接池使用数据库资源能提升系统性能,充分利用系统资源。文章通过介绍、分析数据库连接池工作的基本原理,了解目前流行的WEB服务器在数据库连接池方面的使用现状后,总结一了些数据库连
4、接池开发程序中容易忽略的问题。并在学习掌握了实现连接池的关键技术后给出了一个较为高效的连接池管理策略,在这种策略思想的指导下实际开发出一个数据库连接池模块,使得上层应用通过本连接池访问数据库资源变得相对高效和容易,从实际上论证了这种设计方案的可行性。关键字 连接池;数据库;JDBC;并发访问第二章 课题背景1. 设计目的数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出。对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标。数据库连接池正是针对这个问题提出来的。数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现
5、有的数据库连接,而再不是重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。2. 连接池优点连接池是创建和管理一个连接的缓冲池的技术,这些连接准备好被任何需要它们的线程使用。这种把连接“汇集”起来的技术基于这样的一个事实:对于大多数应用程序,当它们正在处理通常需要数毫秒完成的事务时,仅需要能够访问JDBC 连接的 1 个线程。当不处理事务时,这个连接就会闲置。相反,连接池允许闲置的连接被其它需要的线程使用。事实上,当一个线程需要用 JDBC 对一个 GBase 或其它数据库操作时,它从池中请求一个连接。
6、当这个线程使用完了这个连接,将它返回到连接池中,这样这就可以被其它想使用它的线程使用。当连接从池中“借出”,它被请求它的线程专有地使用。从编程的角度来看,这和用户的线程每当需要一个 JDBC 连接的时候调用DriverManager.getConnection() 是一样的,采用连接池技术,可通过使用新的或已有的连接结束线程。连接池可以极大的改善用户的 Java 应用程序的性能,同时减少全部资源的使用。连接池主要的优点有:3. 减少连接创建时间 虽然与其它数据库相比 GBase 提供了较为快速连接功能,但是创建新的 JDBC 连接仍会招致网络和 JDBC 驱动的开销。如果这类连接是“循环”使用
7、的,使用该方式这些花销就可避免。4. 简化的编程模式 当使用连接池时,每一个单独的线程能够像创建了一个自己的 JDBC 连接一样操作,允许用户直接使用JDBC编程技术。5. 受控的资源使用 如果用户不使用连接池,而是每当线程需要时创建一个新的连接,那么用户的应用程序的资源使用会产生非常大的浪费并由可能会导致高负载下的异常发生。注意,每个连到 GBase 的连接在客户端和服务器端都有花销(内存,CPU,上下文切换等等)。每个连接均会对应用程序和 GBase 服务器的可用资源带来一定的限制。不管这些连接是否在做有用的工作,仍将使用这些资源中的相当一部分。连接池能够使性能最大化,同时还能将资源利用控
8、制在一定的水平之下,如果超过该水平,应用程序将崩溃而不仅仅是变慢。6. 开源连接池6.1 C3P0 C3P0 C3P0 C3P0是一个开放源代码的JDBC连接池,它在lib目录中与Hibernate一起发布,包括了实现jdbc3和jdbc2扩展规范说明的Connection 和Statement 池的DataSources 对象。 6.2 ProxoolProxool 这是一个Java SQL Driver驱动程序,提供了对你选择的其它类型的驱动程序的连接池封装。可以非常简单的移植到现存的代码中。完全可配置。快速,成熟,健壮。可以透明地为你现存的JDBC驱动程序增加连接池功能。6.3 Jaka
9、rta DBCP DBCPJakarta DBCP DBCP是一个依赖Jakarta commons-pool对象池机制的数据库连接池.DBCP可以直接的在应用程序用使用。6.4 DDConnectionBroker DDConnectionBrokerDDConnectionBroker DDConnectionBroker是一个简单,轻量级的数据库连接池。6.5 DBPool DBPoolDBPool DBPool是一个高效的易配置的数据库连接池。它除了支持连接池应有的功能之外,还包括了一个对象池使你能够开发一个满足自已需求的数据库连接池。6.6 XAPool XAPooXAPool XA
10、Pool是一个XA数据库连接池。它实现了javax.sql.XADataSource并提供了连接池工具。6.7 Primrose PrimrosePrimrose Primrose是一个Java开发的数据库连接池。当前支持的容器包括Tomcat4&5,Resin3与JBoss3.它同样也有一个独立的版本可以在应用程序中使用而不必运行在容器中。Primrose通过一个web接口来控制SQL处理的追踪,配置,动态池管理。在重负荷的情况下可进行连接请求队列处理。6.8 SmartPool SmartPoolSmartPool SmartPool是一个连接池组件,它模仿应用服务器对象池的特性。
11、SmartPool能够解决一些临界问题如连接泄漏(connection leaks),连接阻塞,打开的JDBC对象如Statements,PreparedStatements等. SmartPool的特性包括支持多个pools,自动关闭相关联的JDBC对象, 在所设定time-outs之后察觉连接泄漏,追踪连接使用情况, 强制启用最近最少用到的连接,把SmartPool"包装"成现存的一个pool等。6.9 MiniConnectionPoolManager MiniConnectionPoolManagerMiniConnectionPoolManager MiniCon
12、nectionPoolManager是一个轻量级JDBC数据库连接池。它只需要Java1.5(或更高)并且没有依赖第三方包。6.10 BoneCP BoneCPBoneCP BoneCP是一个快速,开源的数据库连接池。帮你管理数据连接让你的应用程序能更快速地访问数据库。比C3P0/DBCP连接池快25倍。第三章 数据库1. 数据库概述数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,它产生于距今五十年前,随着信息技术和市场的发展,特别是二十世纪九十年代以后,数据管理不再仅仅是存储和管理数据,而转变成用户所需要的各种数据管理的方式。数据库有很多种类型,从最简单的存储有各种数据
13、的表格到能够进行海量数据存储的大型数据库系统都在各个方面得到了广泛的应用。2. 数据库连接池的基本原理 传统的数据库连接方式(指通过DriverManager和基本实现DataSource进行连接)中,一个数据库连接对象均对应一个物理数据库连接,数据库连接的建立及关闭对系统而言是耗费系统资源的操作,在多层结构的应用程式环境中这种耗费资源的动作对系统的性能影响尤为明显。在多层结构的应用程式中通过连接池(connection pooling)技术能使系统的性能明显得到提到,连接池意味着当应用程式需要调用一个数据库连接的时,数据库相关的接口通过返回一个通过重用数据库连接来代替重新创建一个数据库连接。
14、通过这种方式,应用程式能减少对数据库连接操作,尤其在多层环境中多个客户端能通过共享少量的物理数据库连接来满足系统需求。通过连接池技术Java应用程式不仅能提高系统性能同时也为系统提高了可测量性。数据库连接池是运行在后台的而且应用程式的编码没有所有的影响。此中状况存在的前提是应用程式必须通过DataSource对象(一个实现javax.sql.DataSource接口的实例)的方式代替原有通过DriverManager类来获得数据库连接的方式。一个实现javax.sql.DataSource接口的类能支持也能不支持数据库连接池,不过两者获得数据库连接的代码基本是相同的。3. 连接池的工作原理在实
15、际应用开发中,特别是在WEB应用系统中,如果JSP、Servlet或EJB使用JDBC直接访问数据库中的数据,每一次数据访问请求都必须经历建立数据库连接、打开数据库、存取数据和关闭数据库连接等步骤,而连接并打开数据库是一件既消耗资源又费时的工作,如果频繁发生这种数据库操作,系统的性能必然会急剧下降,甚至会导致系统崩溃。数据库连接池技术是解决这个问题最常用的方法,在许多应用程序服务器(例如:Weblogic,WebSphere,JBoss)中,基本都提供了这项技术,无需自己编程,但是,深入了解这项技术是非常必要的。数据库连接池技术的思想非常简单,将数据库连接作为对象存储在一个Vector对象中,
16、一旦数据库连接建立后,不同的数据库访问请求就可以共享这些连接,这样,通过复用这些已经建立的数据库连接,可以克服上述缺点,极大地节省系统资源和时间。数据库连接池的主要操作如下:(1)建立数据库连接池对象(服务器启动)。(2)按照事先指定的参数创建初始数量的数据库连接(即:空闲连接数)。(3)对于一个数据库访问请求,直接从连接池中得到一个连接。如果数据库连接池对象中没有空闲的连接,且连接数没有达到最大(即:最大活跃连接数),创建一个新的数据库连接。(4)关闭数据库,释放所有数据库连接(此时的关闭数据库连接,并非真正关闭,而是将其放入空闲队列中。如实际空闲连接数大于初始空闲连接数则释放连接)。第四章
17、 连接池概念1. 连接池中的关键技术 连接复用,通过建立一个数据库连接池以及一套连接使用、分配、管理策略,使得该连接池中的连接可以得到高效、安全的复用,避免了数据库连接频繁建立、关闭的开销。2. 连接池的分配与释放 3. 连接池的维护 package org.whvcse.dbms;import java.io.Serializable;import java.sql.SQLException;import java.util.Vector;import org.whvcse.dbms.domain.ConnectionInfo;public interface IValidate exten
18、ds Serializablepublic Vector<ConnectionInfo> validate(Vector<ConnectionInfo> v)throws SQLException;第五章 系统总体设计思想及方案 设计理念1. 连接池中的管理机制 连接池管理策略是连接池机制的核心。当连接池建立后,如何对连接池中的连接进行管理,解决好连接池内连接的分配和释放,对系统的性能有很大的影响。连接的合理分配、释放可提高连接的复用,降低了系统建立新连接的开销,同时也加速了用户的访问速度。下面介绍连接池中连接的分配、释放策略。连接池的分配、释放策略对于有效复用连接非常
19、重要,我们采用的方法是一个很有名的设计模式:Reference Counting(引用记数)。该模式在复用资源方面应用的非常广泛,把该方法运用到对于连接的分配释放上,为每一个数据库连接,保留一个引用记数,用来记录该连接的使用者的个数。具体的实现方法是:当客户请求数据库连接时,首先查看连接池中是否有空闲连接(指当前没有分配出去的连接)。如果存在空闲连接,则把连接分配给客户并作相应处理(即标记该连接为正在使用,引用计数加1)。如果没有空闲连接,则查看当前所开的连接数是不是已经达到maxConn(最大连接数),如果没达到就重新创建一个连接给请求的客户;如果达到就按设定的maxWaitTime(最大等
20、待时间)进行等待,如果等待maxWaitTime后仍没有空闲连接,就抛出无空闲连接的异常给用户。当客户释放数据库连接时,先判断该连接的引用次数是否超过了规定值,如果超过就删除该连接,并判断当前连接池内总的连接数是否小于minConn(最小连接数),若小于就将连接池充满;如果没超过就将该连接标记为开放状态,可供再次复用。可以看出正是这套策略保证了数据库连接的有效复用,避免频繁地建立、释放连接所带来的系统资源开销。2. 并发问题 为了使连接管理服务具有最大的通用性,必须考虑多线程环境,即并发问题。这个问题相对比较好解决,因为Java语言自身提供了对并发管理的支持,使用synchronized关键字
21、即可确保线程是同步的。使用方法为直接在类方法前面加上synchronized关键字,如:public synchronized Connection getConnection()3. 连接池的分配与释放连接池的分配与释放,对系统的性能有很大的影响。合理的分配与释放,可以提高连接的复用度,从而降低建立新连接的开销,同时还可以加快用户的访问速度。对于连接的管理可使用空闲池。即把已经创建但尚未分配出去的连接按创建时间存放到一个空闲池中。每当用户请求一个连接时,系统首先检查空闲池内有没有空闲连接。如果有就把建立时间最长(通过容器的顺序存放实现)的那个连接分配给他(实际是先做连接是否有效的判断,如果可
22、用就分配给用户,如不可用就把这个连接从空闲池删掉,重新检测空闲池是否还有连接);如果没有则检查当前所开连接池是否达到连接池所允许的最大连接数(maxConn),如果没有达到,就新建一个连接,如果已经达到,就等待一定的时间(timeout)。如果在等待的时间内有连接被释放出来就可以把这个连接分配给等待的用户,如果等待时间超过预定时间timeout,则返回空值(null)。系统对已经分配出去正在使用的连接只做计数,当使用完后再返还给空闲池。对于空闲连接的状态,可开辟专门的线程定时检测,这样会花费一定的系统开销,但可以保证较快的响应速度。也可采取不开辟专门线程,只是在分配前检测的方法。4. 连接池的
23、关闭 public synchronized boolean destory() throws SQLException并发控制关闭连接池资源.public synchronized boolean destory() throws SQLException if (null = this.connectionPool)throw new SQLException("Connection UnInitializing");for (ConnectionInfo con : this.connectionPool) con.getConnection().close();co
24、n.setStartTime(0);if (null != this.validateLink)this.validateLink.clear();this.validateLink = null;this.connectionPool = null;return this.connectionPool = null && this.validateLink = null;第六章 设计流程流程和实现 package org.whvcse.dbms.base;import java.io.Serializable;import java.sql.Connection;import
25、 java.sql.SQLException;import java.util.ArrayList;import java.util.List;import java.util.Vector;import org.whvcse.dbms.IConnectionLoader;import org.whvcse.dbms.IConnectionPoolLoader;import org.whvcse.dbms.ISQLBase;import org.whvcse.dbms.IValidate;import org.whvcse.dbms.domain.ConnectionInfo;import o
26、rg.whvcse.dbms.domain.Information;import org.whvcse.dbms.exception.LoadErrorException;import org.whvcse.dbms.loader.DefaultConnectionLoader;import org.whvcse.dbms.loader.PerpertiesLoader;/* * <span css='package_style'>连接池总控制器</span> * author 孟德军 * */public class DriverManager imp
27、lements Serializableprivate static DriverManager manager = null;private Vector<ConnectionInfo> connectionPool = null;private ISQLBase dataSource = null;private List<IValidate> validateLink = null;private ConnectionInfo info=null;/private Transaction transaction=null;public DriverManager(
28、ISQLBase base) throws SQLExceptionthis.dataSource = base;/info.getConnection().this.connectionPool=this.InitFromDataSource();public DriverManager(IConnectionPoolLoader loader) throws SQLExceptionthis.connectionPool=this.InitFromConnectionPoolLoader(loader);public DriverManager(String path) throws SQ
29、LException, LoadErrorExceptionthis.connectionPool=this.InitFromProperties(path);/* * 添加验证联 * param v 验证程序 * return 验证后的集合 * throws NullPointerException */public synchronized int addValidate(IValidate v)throws NullPointerException if (null = this.validateLink)this.validateLink = new ArrayList<IVal
30、idate>();this.validateLink.add(v);return this.validateLink.size();private Vector<ConnectionInfo> InitFromDataSource() throws SQLExceptionVector<ConnectionInfo> tv = new Vector<ConnectionInfo>(this.dataSource.getMax();if (null = this.dataSource)throw new SQLException("DataSo
31、urce Initializing Failture");for (int i = 0; i < this.dataSource.getMin(); i+)tryConnection temp = this.dataSource.getConnection();if (null != temp && !temp.isClosed()ConnectionInfo info=new ConnectionInfo();info.setStartTime(System.currentTimeMillis();info.setConnection(temp);info.s
32、etId(tv.size()+1);tv.add(info); catch (SQLException e) e.printStackTrace();return tv;private Vector<ConnectionInfo> InitFromConnectionPoolLoader(IConnectionPoolLoader loader) throws SQLExceptionVector<ConnectionInfo> tv =loader.load();return tv;private Vector<ConnectionInfo> InitFr
33、omProperties(String path) throws SQLException, LoadErrorExceptionInformation ti=new PerpertiesLoader().Init(path);if (null = ti)throw new SQLException("PerpertiesLoader Initializing Failture");Vector<ConnectionInfo> tv = new Vector<ConnectionInfo>(ti.getMax();IConnectionLoader
34、tl=new DefaultConnectionLoader();for (int i = 0; i < ti.getMin(); i+)tryConnection temp =tl.loadConnection(ti);if (null != temp && !temp.isClosed()ConnectionInfo info=new ConnectionInfo();info.setStartTime(System.currentTimeMillis();info.setConnection(temp);info.setId(tv.size()+1);tv.add(
35、info); catch (SQLException e)e.printStackTrace();return tv;/* * 数据源连接池 * param base 标准数据源连接池 * return 连接池的单态实例 * throws SQLException */public synchronized static DriverManager getInstance(ISQLBase base)throws SQLExceptionif (null = manager)manager = new DriverManager(base);return manager;/* * 连接池加载器
36、连接池 * param loader 加载器 * return 连接池的单态实例 * throws SQLException */public synchronized static DriverManager getInstance(IConnectionPoolLoader loader)throws SQLExceptionif (null = manager)manager = new DriverManager(loader);return manager;/* * 配置文件加载器 * param path 配置文件的路径 * return 连接池的单态实例 * throws SQL
37、Exception * throws LoadErrorException 读取文件错误 */public synchronized static DriverManager getInstance(String path)throws SQLException, LoadErrorException if (null = manager)manager = new DriverManager(path);return manager;/*3 * 获取数据库资源 * return 连接池管理的数据库连接 * throws SQLException */public synchronized C
38、onnection getConnection() throws SQLExceptionif (null = this.connectionPool | this.connectionPool.size() = 0)throw new SQLException("Connection UnInitializing");=this.connectionPool.firstElement();Connection temp=info.getConnection();.setConnection(temp);this.connectionPo
39、ol.add();return temp;/* * 释放数据库连接资源 * param connection 使用完的数据库连接,该连接不能为空或已关闭,否则会爆发SQLException异常. * return 释放资源的状态. * throws SQLException */public synchronized boolean release(Connection connection)throws SQLExceptionthis.validate();if (null = connection | connection.isClosed()throw new SQL
40、Exception("Connection is Closed");elseConnectionInfo o=new ConnectionInfo();o.setId(this.connectionPool.size()+1);o.setEndTime(System.currentTimeMillis();o.setConnection(connection);this.connectionPool.add(o);return this.connectionPool = null;/* * 销毁的连接池 * return 销毁状态 * throws SQLException
41、 */public synchronized boolean destory() throws SQLException if (null = this.connectionPool)throw new SQLException("Connection UnInitializing");for (ConnectionInfo con : this.connectionPool) con.getConnection().close();con.setStartTime(0);if (null != this.validateLink)this.validateLink.cle
42、ar();this.validateLink = null;this.connectionPool = null;return this.connectionPool = null && this.validateLink = null;private synchronized boolean validate() throws SQLExceptionif (null != this.validateLink) for (IValidate ti : this.validateLink)Vector<ConnectionInfo> tv = ti.validate
43、(this.connectionPool);this.connectionPool = tv;return this.connectionPool = null;1. 连接池的管理 SJCP采用单例模式与工厂模式,连接池管理器统一管理数据库的链接,并基于面向接口编程,将优化程序交给用户,但提供的默认的接口实现,从而提高管理的效率.2. 连接池的关闭 public synchronized boolean destory() throws SQLException if (null = this.connectionPool)throw new SQLException("Connec
44、tion UnInitializing");for (ConnectionInfo con : this.connectionPool) con.getConnection().close();con.setStartTime(0);if (null != this.validateLink)this.validateLink.clear();this.validateLink = null;this.connectionPool = null;return this.connectionPool = null && this.validateLink = null;
45、3. 连接池的测试 package main;import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;import java.util.Vector;import org.whvcse.dbms.base.SQLBaseAdapter;import org.whvcse.dbms.domain.ConnectionInfo;public class SqlDataSource extends SQLBaseAdapter/* * */private static final lo
46、ng serialVersionUID = 1L;private Connection connection=null;private final String USERNAME="root"private final String PASSWORD="admin"private final String URL="jdbc:mysql:/localhost:3306/mysql"private final String DRIVERCLASS="com.mysql.jdbc.Driver"Overridepubl
47、ic Connection getConnection() throws SQLExceptionif(null=this.connection)tryClass.forName(DRIVERCLASS); catch (ClassNotFoundException e)e.printStackTrace();this.connection=DriverManager.getConnection(URL,USERNAME,PASSWORD);return this.connection;Overridepublic Vector<ConnectionInfo> validate(V
48、ector<ConnectionInfo> v)throws SQLException return v;Overridepublic int getMax() / TODO Auto-generated method stubreturn 10;Overridepublic int getMin() / TODO Auto-generated method stubreturn 5;package main;import java.sql.Connection;import java.sql.ResultSet;import java.sql.SQLException;impor
49、t java.sql.Statement;import org.whvcse.dbms.ISQLBase;import org.whvcse.dbms.base.DriverManager;public class TestDriverManager public TestDriverManager() throws SQLExceptionthis.Init();private void Init() throws SQLExceptionISQLBase o=new SqlDataSource();DriverManager manager=null;manager=DriverManager.getInstance(o);manager.addValidate(o);for(int i=0;i<80000;i+)Connection con=manager.getConnection();Statement statement=con.createStatement();ResultSet set=statement.executeQuery("select * from user");while(set.next
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年中稀江西稀士有限公司招聘笔试真题
- 2024年西安市雁塔区第三小学招聘笔试真题
- 2025年法学概论考试的内容框架与试题及答案
- 系统设计考试题目及答案解析
- 2024年黑龙江大庆大同区养老服务中心招聘真题
- 企业合规管理的总结与对策计划
- 2024年连云港市灌云县公安局招聘笔试真题
- 2024年安徽省退役军人厅下属事业单位真题
- 2024年鸡东县司法局招聘民调解员笔试真题
- 2024年河南事业单位联考招聘笔试真题
- 全国优质课一等奖人教版高中化学必修第二册《金属矿物的开发利用》公开课课件
- 山西灵石红杏广进宝煤业有限公司新建煤矸石综合治理及土地复垦项目环评报告
- 睡莲花卉欣赏与养护
- 出生证明英语翻译模板
- 历史中考热点专题
- 中国石油大学(华东)宣讲
- 游泳运动比赛宣传PPT模板
- 武汉市房屋拆迁补偿方案实施细则
- SPC八大控制图自动生成器
- 石膏几何体组合素描课件
- 河堤防工程施工组织设计方案
评论
0/150
提交评论