《21连接池和文件上传》由会员分享,可在线阅读,更多相关《21连接池和文件上传(16页珍藏版)》请在金锄头文库上搜索。
1、连接池连接池和和文件上传文件上传本章目标本章目标q连接池的相关概念q为什么要用连接池q连接池是什么及实现思想qJNDI相关概念q连接池的实现qServer.xml配置q通过连接池获取连接对象q文件上传为什么要用连接池为什么要用连接池q在实际应用开发中,特别是在WEB应用系统中,如果JSP、Servlet或EJB使用JDBC直接访问数据库中的数据,每一次数据访问请求都必须经历建立数据库连接、打开数据库、存取数据和关闭数据库连接等步骤,而连接并打开数据库是一件既消耗资源又费时的工作,如果频繁发生这种数据库操作,系统的性能必然会急剧下降,甚至会导致系统崩溃。数据库连接池技术是解决这个问题最常用的方法
2、,在许多应用程序服务器(例如:Weblogic,WebSphere,JBoss,Tomcat)中,基本都提供了这项技术,无需自己编程。连接池技术连接池技术q数据库连接池技术非常简单是将数据库连接作为对象存储在一个Vector对象中,一旦数据库连接建立后,不同的数据库访问请求就可以共享这些连接,这样,通过复用这些已经建立的数据库连接,可以克服上述缺点,极大地节省系统资源和时间。q数据库连接池的主要操作如下:q建立数据库连接池对象(服务器启动)。q按照事先指定的参数创建初始数量的数据库连接(即:空闲连接数)。q对于一个数据库访问请求,直接从连接池中得到一个连接。如果数据库连接池对象中没有空闲的连接
3、,且连接数没有达到最大(即:最大活跃连接数),创建一个新的数据库连接。q存取数据库。q关闭数据库,释放所有数据库连接(此时的关闭数据库连接,并非真正关闭,而是将其放入空闲队列中。如实际空闲连接数大于初始空闲连接数则释放连接)。q释放数据库连接池对象(服务器停止、维护期间,释放数据库连接池对象,并释放所有连接)。JNDI简介简介qJNDI( Java Naming and Directory Interface,Java命名和目录接口)是一组在Java应用中访问命名和目录服务的API。命名服务将名称和对象联系起来,使得我们可以用名称访问对象。qJNDI要注意的重要一点是,它提供了应用编程接口(a
4、pplication programming interface,API)和服务提供者接口(service provider interface,SPI)。这一点的真正含义是,要让你的应用与命名服务或目录服务交互,必须有这个服务的JNDI服务提供者,这正是JNDI SPI发挥作用的地方。服务提供者基本上是一组类,这些类为各种具体的命名和目录服务实现了JNDI接口很象JDBC驱动为各种具体的数据库系统实现了JDBC接口一样。作为一个应用开发者,你不必操心JNDI SPI。你只需要确认你要使用的每一个命名或目录服务都有服务提供者。 连接池的实现连接池的实现(配置配置)q我们知道许多应用程序服务器基
5、本都提供了连接池技术,无需自己编程。只需针对不同应用服务器进行相应的配置即可。q下面我们看看在Tomcat5.5中配置连接池; (大家注意就Tomcat不同版本之间连接池配置差别都很大)q在Tomcat5.5中配置连接池要编辑两个配置文件:qserver.xmlq将相应的数据驱动考到将相应的数据驱动考到 tomcat根目下根目下 common / lib 下下Tomcat连接池注意事项连接池注意事项q不能以发布的工程去调用连接池q不能没有Context,然后用发布,会提示在此Context中找不到连接池q只能以Context配置形式配连接池q必须将jar包拷到Tomcat根 common/li
6、b下。连接池配置连接池配置(servlet.xml) 配置说明一配置说明一qResource项(即连接池的DataSource对象),q有3个属性name、auth、type,qname项是JNDI的名称定义,程序通过JNDI才能找到此对象,名称可以任意取值,这里取名jdbc/tcpdb1 ;auth项即连接池管理权属性,这里取值Container,申明为容器管理;type项即对象的类型,这里取值javax.sql.DataSource,申明为数据库连接池。 配置说明二配置说明二qmaxActive是最大活动连接数,这里取值为20,表示同时最多有20个数据库连接。maxIdle是最大的空闲连接
7、数,这里取值为20,表示即使没有数据库连接时依然可以保持20空闲的连接,而不被清除,随时处于待命状态。MaxWait是最大等待秒钟数,这里取值-1,表示无限等待,直到超时为止,也可取值1000,表示1秒后超时。 通过连接池获取连接对象通过连接池获取连接对象Context context = new InitialContext(); /容器上下文初始化.DataSource ds= (DataSource)context.lookup(“java:comp/env/jdbc/tcpdb1”);/通过JNDI名得到数据源.Connection conn = ds.getConnection();
8、/获取连接对象.System.out.println(conn);conn.close();/用完一定要关闭.文件上传文件上传q对于客户端普通表单传过来的文本数据我们可以通过 request.getParameter(“”)方法来获取; 但如果客户端传的是二近制信息(如图片,文件等)那么获取二近制信息就比较麻烦; 下面我介绍利用struts框架中的相关包来实现文件上传。q将用到struts中的包是:qcommons-fileupload.jar (主要类包)q将上面三个包考到工程的 WEB-INF/lib下文件上传示例文件上传示例(表单表单)q如果要实现文件上传,对于要提交的表单 form 属
9、性设置有如下要求:q其中 method属性值必需是 postq必须具有: enctype=“multipart/form-data” 表示以字节方式提交数据q例如:文件上传示例文件上传示例(处理处理)public HashMap parseRequest(HttpServletRequest request) HashMap paramMap = new HashMap(); DiskFileUpload dfu = new DiskFileUpload(); /获取文件上传处理对象. dfu.setSizeMax(1024 * 1024 * 100);/设置允许上传文件大小上限. dfu.s
10、etSizeThreshold(4096);/设置缓冲区大小. dfu.setRepositoryPath(this.getServletContext().getRealPath(“/tmp”);/设置临时文件夹. try List list = dfu.parseRequest(request);/解析request. Iterator it = list.iterator(); while (it.hasNext() FileItem fi = (FileItem) it.next(); if (fi.isFormField() /如果是普通文本. paramMap.put(fi.get
11、FieldName(), fi.getString(); else /否则是文件. String tmpFileName = ; if (!fi.getName().equals() / 如果有传文件. tmpFileName = getRndFileName(fi.getName(); /将文件保存到服务器. fi.write(new File(this.getServletContext().getRealPath(“/mcimg/” + tmpFileName);文件上传示例文件上传示例(处理处理) paramMap.put(fi.getFieldName(), tmpFileName)
12、; catch (Exception e) e.printStackTrace(); return paramMap;/ 最后返回的的HashMap中存的是表单元素名与值; 如果是上传文件框,值是文件名;/ 获取随机文件名.如 aa.gif bb.jpg 等.public String getRndFileName(String path) String rndFileName = String.valueOf(System.currentTimeMillis() + String.valueOf(new Random().nextInt(100); String extFileName =
13、getExName(path); if (!extFileName.equals() rndFileName = rndFileName + . + extFileName; return rndFileName;/ 获取文件扩展名.如: gif jpg (不包括.)等.public String getExName(String path) int strint = path.lastIndexOf(.); return path.substring(strint + 1);总结总结q连接池的相关概念q为什么要用连接池q连接池是什么及实现思想qJNDI相关概念q连接池的实现qServer.xml配置q通过连接池获取连接对象q文件上传