功能完善的Java连接池调用实例

合集下载

javaweb,标签库,函数库,数据库连接池实例

javaweb,标签库,函数库,数据库连接池实例

修改tomcat中的server.xml中的<Connector prot=”” protocol=”” maxThreads=””…..URIEncoding=”utf-8”>URIEncoding=”utf-8”是解决get方法传递中文参数乱码的问题让tomcat自动识别我们的修改要改动context.xml文件中的代码在<Context>标签中增加reloadable=”true”但是在产品发布的时候不能是true增加tomcat的使用者修改tomcat下的users.xml中的代码<tomcat-users><role rolename=”manager”><role rolename=”admin”><user username=”名字”password=”密码”roles=”admin,manager”></ tomcat-users >ctrl+shift+F //可以对我们的代码进行格式化http 80 , Ftp 21, smtp 25, pop3 110,查看提交的数据和从数据库取得数据是不是为空Mvc的优缺点:有利于分工,有利于组件的重用但是增加了系统的开发难度JspEL 直接写在jsp页面中也没有.jar包没有<%%> 在servlet2.4这个规范里或更高的规范里应用运算符:当字符串比较时是一个一个字符的比较大的就是true基本用法${表达式或变量}它的前后是没有空格的相当于但是不等价于<%=表达式或变量%> 这里的写的html语言会在客户端执行的可是设定jsp页面不使用jspEL 如下:<%@ page isELIgnored=”true”%> //设定当前页面不使用jspEL或者修改web.xml 是设定当前应用程序都不使用<web-app….><jsp-config><jsp-property-group><url-pattern>*.jsp</url-pattern><el-ignored>true</el-ignored></jsp-property-group></jsp-config></web-app>如果想要在页面直接输出${表达式或变量} 就需要转义\${表达式或变量}或者‟‟$‟‟{表达式或变量}是两个单引号<%pageContext.setAttribute(“username”,”xx”)%>${empty username}//该表达式是按照page→request→session→application的范围中去找username这个变量输出jsp内置对象的值<%pageContext.setAttribute(“uername”,”zhang”);request.setAttribute(“uername”,1);session.setAttribute(“uername”,new Integer(1));application.setAttribute(“uername”,”好的”);%>${ername} ${pageScope[“username”]}${ username}//按照page→ request→ session→application的范围中去找${ ername}${ ername}${ ername}输出bean中的参数值<jsp:useBean id=”user”class=””/> ${ername}或者采用点符号级联输出输出form表单中的值${param.表单中的参数名字}或者${paramV alues.表单中参数名字[数字]}//表示的是选中的参数值的第几个值从0开始${header[”host”]} 对应的是request.getHeaderNames()中的Host的值读取cookieresponse.addCookie(new Cookie(“user”,”123”)) ${er.value}读取web.xml文件中的初始参数${initParam.参数的名字}判断空值${empty 元素名称} 元素=””或元素=空的集合或根本就没有该元素或为null就都是为空${!empty 元素名称} 判断非空定制标记库好处是可以减少在jsp中的java代码java代码是写在处理类中的增强了表现层的处理能力javax.servlet.jsp.tagext.*;中放置的都是与定制标记的类和接口通过重写javax.servlet.jsp.tagext.TagSupport中的方法doStartTag() 和doAfterBodyTag() doEndTag()方法System.currentTimeMillis()//方法是得到当前时间首先是有一个标记处理类然后是编写.tld文件最后在jsp中使用自定义的标记了自定义标记库的打包需要的文件有处理类文件带包和tld文件tld文件要在WETA-INF文件夹下进入到放置文件按的目录使用命令jar –cvf 名字.jar * //*表示对所有文件进行打包名字.jar文件放到应用程序的WEB-INF下的lib目录下就可以使用了jstl标准的标记库和el配合使用需要下载jstl.jar和standard.jar包用<%@ taglib uri=” /jsp/jstl/core”prefix=”c也可以是任意的”%>引入有5个标记库核心标记库格式化标记库sql标记库xml标记库函数标记库核心标记库要配合el表达式使用<c:set value=”value” var=”name” [scope=”{page|request|session|application}”]/>默认是page< c:set value=”value”target=”target”property=”propertyName”/>//value是要赋的值target是一个对象property是一个对象的属性名就是给已有的对象的属性赋值<c:if test=”condition” var=”name” [scope=”{page|request|session|application}”/>默认为page<c:if test=”${ername= =‟system‟}” var =”result”/> <c:out value=”${result}”>或者<c:if test=”${ername= =‟system‟}” var =”result”>当result为true时,要执行的内容</c:if><c:chose > 内容(<when>and <otherwise>)</c:chose><c:when test=”condition”>语句体</c:when><c:otherwise>语句体</c:otherwise>举例:<c:chose ><c:when test=”${param.age>20}”>语句体</c:when>//提取表单中参数名为age的值<c:when test=” ${param.age>20 and param.age<80}”>语句体</c:when><c:otherwise>语句体</c:otherwise></c:chose><c:forEach[var=”name”] items=“collection”[varStatus=”varStatusName”] [begin=”begin”]””varStatus=”i” > ${变量} ${i.index}//输出的是当前数组成员的索引</c:foreach><c:foreach items=”${ map对象名}” var=”变量” begin=”” end=”” step=”” varStatus=”i” > ${变量.key} ${变量.value}</c:foreach><c:forEach items="${userlist}" var="user" varStatus="vs"><c:choose> vs.count是输出当前元素在userlist中的索引<c:when test="${vs.count % 2 == 0}"> <tr bgcolor="red"> </c:when><c:otherwise> <tr> </c:otherwise></c:choose></c:forEach><c:forEach begin="1" end="10">a<br>//输出10个a</c:forEach><c:forTokens items=“collection” delims=”delimiters” [var=”name”] [varStatus=”varStatusName”]<c:import url=”url” [context=”context”] [var=”name”] [scope=”{page|request|session|application} ” ] [charEncoding=”charEncoding”]> <c:param>带的参数</c:import><c:import url=”url” [context=”context”] [var=”name”] varReader=” varReadername”[charEncoding=”charEncoding”]> body content要增加的内容</c:import>可以把另一个页面的内容引入到当前页,该页面可以是本地的也可以是网络上的也可以另一个web应用中的页面<c:url value=”value” [context=”context”] [var=”name”] [scope=”{page|request|session|application }” ] />//不带参数的url地址的构造<c:url value=”value” [context=”context”] [var=”name”] [scope=”{page|request|session|application”hello”/> </c:url> ${urls}输出构造好的url http:/h.htm?p=hello<c:redirect url=”value” [context=”context”] />//url不带参数的转向<c:redirect context="/struts_login" url="/index.jsp"/><fmt:bundlebasename=”basename” [prefix=”prefix”][scope=”{page|request|session|applicaiton}”] >body content </fmt:bundle>属性名描述El 必选缺省值可以是无basename 设置使用的资源文件束文件的路径和名称,不应该包含任何本地化后缀或文件扩展名自定义函数标记库dwr框架要看一下它是服务器端的一个ajax框架。

java调用api接口实例

java调用api接口实例

java调用api接口实例# 2. 使用JAVA调用API的实例## 2.1 简介API(Application Programming Interface),即应用程序接口,是一种特定的接口,它允许第三方软件(如Java)与另一个软件系统进行交互,以便更好地提供服务。

Java将API作为类库,可帮助开发人员更容易的进行开发。

## 2.2 实现### 2.2.1 准备工作首先,我们需要准备基本的环境:- Java开发环境(如Eclipse)- 用于调用API的第三方jar包### 2.2.2 使用API使用API的步骤一般如下:- 加载API:将jar包添加到Java项目中,使用Java类可以访问API。

- 初始化:初始化API的配置文件,设置必要的参数,以便API 可以正常工作。

- 调用API:通过调用API中的方法,获取要求的功能,完成任务。

### 2.2.3 编写实例下面是一个使用API的实例,以调用Amazon S3(Simple StorageService)的API进行数据处理。

```javapackage com.example.s3;import com.amazonaws.auth.AWSStaticCredentialsProvider; import com.amazonaws.auth.BasicAWSCredentials;import com.amazonaws.regions.Regions;import com.amazonaws.services.s3.AmazonS3;import com.amazonaws.services.s3.AmazonS3ClientBuilder; public class S3Example {// 访问keyprivate static final String ACCESS_KEY = 'XXXXXXXX';// 密钥private static final String SECRET_KEY = 'XXXXXXXX';public static void main(String[] args) {// 获取S3客户端AmazonS3 s3Xclient = getS3Client();// 使用客户端进行操作doSomething(s3Xclient);}// 获取S3客户端private static AmazonS3 getS3Client() {// 创建认证信息BasicAWSCredentials awsCreds = new BasicAWSCredentials(ACCESS_KEY, SECRET_KEY);// 设置区域AWSCredentialsProvider awsCredsProvider = new AWSStaticCredentialsProvider(awsCreds);// 创建S3客户端AmazonS3 s3Client = AmazonS3ClientBuilder.standard().withCredentials(awsCredsProvider).withRegion(_EAST_1).build();return s3Client;}// 使用S3客户端private static void doSomething(AmazonS3 s3Client) {// TODO// 使用API调用S3相关的操作,如上传文件,下载文件,列出bucket等}}```该实例使用了Amazon S3的API,读取了访问key和密钥的信息,调用了接口获取S3客户端,并通过调用`doSomething()`方法实现了对S3的操作,如上传文件,下载文件,列出bucket等。

javawebservice接口调用实例

javawebservice接口调用实例

Java Web Service 是一种轻量级的、基于标准的 Web 协议进行通讯的服务。

它允许在异构系统之间进行交互,并支持跨评台。

在本篇文章中,我们将介绍如何在 Java 中使用 Web Service 接口进行调用的实例。

1. 确定 Web Service 接口我们需要确定要调用的 Web Service 接口。

通常情况下,我们可以通过 WSDL(Web Services Description Language)文档来获取接口的相关信息,包括接口的位置区域、方法名以及参数列表等。

2. 创建 Java 项目在 Eclipse 或者其他 Java 开发环境中,我们可以创建一个新的 Java 项目。

在项目中,我们需要引入相关的 Web Service 库,以便在代码中进行调用。

3. 生成客户端代码通过 WSDL 文档,我们可以使用工具来生成客户端代码。

这些工具通常包括 wsimport(用于生成客户端代码)等。

生成的客户端代码将包含接口的相关信息,以便我们在代码中进行调用。

4. 编写调用代码在生成客户端代码之后,我们可以编写调用代码来实现对 Web Service 接口的调用。

在代码中,我们需要首先创建对应的 WebService 客户端实例,然后通过该实例来调用接口中的方法。

5. 编译和运行完成代码编写之后,我们需要对代码进行编译,并运行相应的测试。

在运行的过程中,我们可以观察接口的调用情况,以及调用结果。

6. 处理异常情况在实际的调用过程中,我们经常会遇到各种异常情况,比如网络连接失败、接口调用超时等。

我们需要在代码中添加相应的异常处理逻辑,以保证程序的稳定性和可靠性。

通过以上步骤,我们可以实现在Java 中对Web Service 接口的调用。

通过这种方式,我们可以实现不同系统之间的数据交互,实现数据共享和系统集成。

我们也可以利用 Web Service 在不同评台之间实现数据的传输和处理,为企业的信息化建设提供更多的可能性。

Java中数据库连接和连接池的最佳实践

Java中数据库连接和连接池的最佳实践

Java中数据库连接和连接池的最佳实践引言:在Java开发中,数据库连接和连接池是非常重要的概念。

数据库连接是应用程序与数据库之间的通道,用于执行SQL语句和获取数据。

而连接池则是为了提高数据库连接的效率和性能,避免频繁地创建和关闭连接。

本文将介绍Java中数据库连接和连接池的最佳实践,包括连接的建立和关闭、连接池的配置和使用等方面。

一、数据库连接的建立和关闭1. 使用JDBC连接数据库在Java中,我们可以使用JDBC(Java Database Connectivity)来连接数据库。

JDBC提供了一套API,用于与不同的数据库进行交互。

连接数据库的过程通常包括以下几个步骤:(1)加载数据库驱动程序:使用Class.forName()方法加载数据库驱动程序,例如Class.forName("com.mysql.jdbc.Driver")加载MySQL的驱动程序。

(2)建立数据库连接:使用DriverManager.getConnection()方法建立与数据库的连接,需要提供数据库的URL、用户名和密码等信息。

(3)执行SQL语句:使用Connection对象的createStatement()方法创建Statement对象,然后使用Statement对象的executeQuery()方法执行SQL语句。

(4)获取结果集:使用ResultSet对象获取执行SQL语句的结果集。

(5)关闭连接:使用Connection对象的close()方法关闭数据库连接。

2. 连接的关闭在使用完数据库连接后,我们需要及时关闭连接,释放资源。

关闭连接的目的是为了避免数据库连接的泄露和占用过多的系统资源。

通常情况下,我们可以在finally块中关闭连接,以确保无论是否发生异常,连接都能被正确关闭。

二、连接池的配置和使用1. 为什么需要连接池在传统的数据库连接方式中,每次请求都需要创建一个新的数据库连接,执行完操作后再关闭连接。

Java开发druid数据连接池maven方式简易配置流程示例

Java开发druid数据连接池maven方式简易配置流程示例

Java开发druid数据连接池maven⽅式简易配置流程⽰例⽬录1.pom.xml⽂件引⼊druid和数据库连接jar包2.jdbc.properties配置3.ibatis-config.xml关于mybatis的参数配置4.spring-mybatis.xml整合⽂件配置5.web.xml配置检测访问禁⽌访问的ip6.根据需要配置各类监控Spring-mvc.xml7.可选安全的加密操作数据库加密8.访问⽅式1.pom.xml⽂件引⼊druid和数据库连接jar包<properties><druid.version>1.0.18</druid.version></properties><dependencies><!-- connection pool --><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>${druid.version}</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.38</version></dependency></dependencies>2.jdbc.properties配置datasource.mysql.driverClassName=com.mysql.jdbc.Driverdatasource.mysql.url=jdbc:mysql://localhost:3306/ganlandoudata?useUnicode=true&characterEncoding=UTF-8&useSSL=falseername=rootdatasource.mysql.password=jdbc.pool.init=1 连接池初始化的连接数jdbc.pool.minIdle=3 连接池连接最⼩空闲数jdbc.pool.maxActive=20 连接池最⼤活跃连接数datasource.validationQuery=select 1 from dual 连接测试datasource.testOnBorrow=true <span style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; background-color: rgb(254, 254, 242);">申请连接时执⾏validationQuery检测连接是否有效,做了这个配置会降低性能。

Java使用独立数据库连接池(DBCP为例)

Java使用独立数据库连接池(DBCP为例)

Java使⽤独⽴数据库连接池(DBCP为例)⽬前,绝⼤多数的软件系统都会使⽤数据库,⽽在软件构建起来之后,访问数据库⼜成为软件系统性能的短板(I/O操作)。

⼀般来说⼀次访问数据库就需要⼀个数据库连接。

⽽每次创建数据库连接都需要访问,分配空闲资源,占⽤资源,释放资源,结束访问。

⾮常的耗费时间和空间。

于是数据连接池技术便产⽣了,其原理就是在数据请求⽅和数据库之间建⽴⼀个数据库连接管理层。

在系统启动的时候就分配⼀定数量的连接,并维护这些连接,保持最低数量的连接数。

同时为了保护数据库和系统,设置⼀个最⼤连接数,缓解数据库的访问压⼒。

这样在每次数据请求⽅需要连接时,管理器便分配⼀个连接给数据请求⽅,数据请求⽅使⽤完连接后,将连接归还给管理器,这样就尽可能的减少不必要的数据库连接消耗。

在Java的数据库服务JDBC中并没有提供⼀个实际ConnectionPool实现,但是留出了接⼝以⽀持第三⽅服务提供商,我觉得其中最重要的接⼝是DataSource。

实际上Java访问数据库的⽅式主要有四种:⼀、使⽤DriverMananger来直接编程实现,这种是最基本的⽅式。

DriverMananger实现数据库连接的关键步骤为:1>Class.forName("com.ibm.db2.jcc.DB2Driver").newInstance();2>Connection conn = null;3>conn = DriverManager.getConnection(url, "name", "password");⼆、使⽤服务器配置⽂件来实现连接池。

⼀些服务器提供了⾃⼰的数据库连接池服务,例如Tomcat服务器就提供了由commons-DBCP⽀持的数据池连接服务,只需要在context.xml 中填写相应的数值就可以了。

三、配置⽂件配置 datasourceDataSource是在JavaAPI中提供的⼀个接⼝,第三⽅服务在实现了DataSource之后,例如DBCP的BasicDataSource,为了提⾼数据库连接池的可配置性,便利⽤IOC模式(控制反转),将实际的Bean与配置数据分开,配置数据放在配置⽂件中(⼀般使⽤XML)。

如何在Java中进行数据库的连接池和连接管理

如何在Java中进行数据库的连接池和连接管理

如何在Java中进行数据库的连接池和连接管理?在Java中进行数据库的连接池和连接管理是非常重要的,它可以帮助我们高效地管理数据库连接并提高系统的性能。

本文将介绍在Java中进行数据库连接池和连接管理的方法,包括连接池的概念、连接池的实现、连接的获取和释放、连接的测试和超时处理等。

一、连接池的概念连接池是一种管理数据库连接的机制,它通过预先创建一定数量的数据库连接,并将这些连接保存在池中,待需要时从池中获取连接,使用完毕后再释放连接到池中,以供其他请求使用。

这样可以避免频繁地创建和销毁数据库连接,从而提高系统的性能。

二、连接池的实现Java中有多种数据库连接池的实现,常见的有C3P0、DBCP和Druid等。

这些连接池实现都提供了相关的API和配置文件,以便我们方便地使用和配置连接池。

1. C3P0连接池C3P0连接池是一个开源的Java连接池实现,它提供了丰富的配置选项和高度可定制的特性。

我们可以通过以下步骤来使用C3P0连接池:(1)导入C3P0的相关依赖包,如c3p0-0.9.5.5.jar。

(2)在数据库连接的配置文件中配置相应的连接池参数,如最小连接数、最大连接数、预创建连接数等。

(3)通过C3P0的DataSource来获取数据库连接,如:```javaComboPooledDataSource dataSource = new ComboPooledDataSource();Connection connection = dataSource.getConnection();```2. DBCP连接池DBCP连接池是Apache软件基金会开发的一个连接池实现,它具有良好的性能和稳定性。

我们可以通过以下步骤来使用DBCP连接池:(1)导入DBCP的相关依赖包,如commons-dbcp2-2.9.0.jar。

(2)在数据库连接的配置文件中配置相应的连接池参数,如最小空闲连接数、最大活动连接数、连接超时时间等。

Java实现数据库连接池的代码.

Java实现数据库连接池的代码.

1 package com.kyo.connection;23 import java.sql.Connection;4 import java.sql.DatabaseMetaData;5 import java.sql.Driver;6 import java.sql.DriverManager;7 import java.sql.SQLException;8 import java.sql.Statement;9 import java.util.Enumeration;10 import java.util.Vector;1112 public class ConnectionPool {1314 private ConnectionParam param;1516 private String testTable = ""; // 测试连接是否可用的测试表名,默认没有测试表1718 private Vector connections = null; // 存放连接池中数据库连接的向量 , 初始时为19 // null,它中存放的对象为PooledConnection 型2021 public void setParam(ConnectionParam param {22 this.param = param;23 }2425 public ConnectionParam getParam( {26 return param;27 }2829 /**30 * 构造函数31 *32 * @param param33 */34 public ConnectionPool(ConnectionParam param {35 this.param = param;36 }3738 /**39 *40 * 获取测试数据库表的名字41 *42 * @return 测试数据库表的名字43 */4445 public String getTestTable( {46 return this.testTable;47 }4849 /**50 *51 * 设置测试表的名字52 *53 * @param testTable54 * String 测试表的名字55 */5657 public void setTestTable(String testTable {58 this.testTable = testTable;59 }6061 /**62 * 创建一个数据库连接池,连接池中的可用连接的数量采用类成员initialConnections 中设置的值63 */6465 public synchronized void createPool( throws Exception {6667 // 确保连接池没有创建68 // 如果连接池己经创建了,保存连接的向量 connections 不会为空69 if (connections != null {70 return; // 如果己经创建,则返回71 }7273 // 实例化 JDBC Driver 中指定的驱动类实例74 Driver driver = (Driver (Class.forName(this.param.getDriver(75 .newInstance(;76 DriverManager.registerDriver(driver; // 注册 JDBC 驱动程序77 // 创建保存连接的向量 , 初始时有 0 个元素78 connections = new Vector(;7980 // 根据 initialConnections 中设置的值,创建连接。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

功能完善的Java连接池调用实例/*** Title: ConnectPool.java* Description: 连接池管理器* Copyright: Copyright (c) 2002/12/25* Company:* Author :* V ersion 2.0*/import java.io.*;import java.sql.*;import java.util.*;import java.util.Date;/*** 管理类DBConnectionManager支持对一个或多个由属性文件定义的数据库连接* 池的访问.客户程序可以调用getInstance()方法访问本类的唯一实例. */public class ConnectPoolstatic public ConnectPool instance; // 唯一实例static public int clients;public V ector drivers = new V ector(); //驱动public PrintWriter log;public Hashtable pools = new Hashtable(); //连接/*** 返回唯一实例.如果是第一次调用此方法,则创建实例** @return DBConnectionManager 唯一实例*/static synchronized public ConnectPool getInstance() {if (instance == null){instance = new ConnectPool();}clients++;return instance;/*** 建构函数私有以防止其它对象创建本类实例*/public ConnectPool() {init();}/*** 将连接对象返回给由名字指定的连接池** @param name 在属性文件中定义的连接池名字* @param con 连接对象*/public void freeConnection(String name, Connection con){DBConnectionPool pool = (DBConnectionPool) pools.get(name); if (pool != null){pool.freeConnection(con);}else{System.out.println("pool ==null");}clients--;}/*** 获得一个可用的(空闲的)连接.如果没有可用连接,且已有连接数小于最大连接数* 限制,则创建并返回新连接** @param name 在属性文件中定义的连接池名字* @return Connection 可用连接或null*/public Connection getConnection(String name){DBConnectionPool pool = (DBConnectionPool) pools.get(name);if (pool != null){//return pool.getConnection();return pool.returnConnection();return null;}/*** 获得一个可用连接.若没有可用连接,且已有连接数小于最大连接数限制,* 则创建并返回新连接.否则,在指定的时间内等待其它线程释放连接. ** @param name 连接池名字* @param time 以毫秒计的等待时间* @return Connection 可用连接或null*/public Connection getConnection(String name, long time){DBConnectionPool pool = (DBConnectionPool) pools.get(name);if (pool != null){return pool.getConnection(time);}return null;}/*** 关闭所有连接,撤销驱动程序的注册*/public synchronized void release(){// 等待直到最后一个客户程序调用if (--clients != 0){return;}Enumeration allPools = pools.elements();while (allPools.hasMoreElements()){DBConnectionPool pool = (DBConnectionPool) allPools.nextElement(); pool.release();}Enumeration allDrivers = drivers.elements();while (allDrivers.hasMoreElements()){Driver driver = (Driver) allDrivers.nextElement();try {DriverManager.deregisterDriver(driver);log("撤销JDBC驱动程序" + driver.getClass().getName()+"的注册"); }catch (SQLException e){log(e, "无法撤销下列JDBC驱动程序的注册: " + driver.getClass().getName());}}}/*** 根据指定属性创建连接池实例.** @param props 连接池属性*/private void createPools(Properties props){Enumeration propNames = props.propertyNames();while (propNames.hasMoreElements()){String name = (String) propNames.nextElement();if (name.endsWith(".url")) {String poolName = name.substring(0, stIndexOf("."));String url = props.getProperty(poolName + ".url");if (url == null) {log("没有为连接池" + poolName + "指定URL");continue;}String user = props.getProperty(poolName + ".user");String password = props.getProperty(poolName + ".password");String maxconn = props.getProperty(poolName + ".maxconn", "0");int max;try{max = Integer.valueOf(maxconn).intValue();}catch (NumberFormatException e){log("错误的最大连接数限制: " + maxconn + " .连接池: " + poolName); max = 0;}DBConnectionPool pool = new DBConnectionPool(poolName, url, user,password, max);pools.put(poolName, pool);log("成功创建连接池" + poolName);}}}/*** 读取属性完成初始化*/private void init(){try{Properties p = new Properties();String configs = System.getProperty("user.dir")+"confdb.properties";System.out.println("configs file local at "+configs); FileInputStream is = new FileInputStream(configs);Properties dbProps = new Properties();try{dbProps.load(is);}catch (Exception e){System.err.println("不能读取属性文件. " +"请确保db.properties在CLASSPA TH指定的路径中");return;}String logFile = dbProps.getProperty("logfile", "DBConnectionManager.log");try{log = new PrintWriter(new FileWriter(logFile, true), true);}catch (IOException e){System.err.println("无法打开日志文件: " + logFile);log = new PrintWriter(System.err);}loadDrivers(dbProps);createPools(dbProps); }catch(Exception e){}}/**171 * 装载和注册所有JDBC驱动程序172 *173 * @param props 属性174 */private void loadDrivers(Properties props){String driverClasses = props.getProperty("drivers"); StringTokenizer st = new StringTokenizer(driverClasses); while (st.hasMoreElements()){String driverClassName = st.nextToken().trim();try{Driver driver = (Driver)Class.forName(driverClassName).newInstance(); DriverManager.registerDriver(driver);drivers.addElement(driver);System.out.println(driverClassName);log("成功注册JDBC驱动程序" + driverClassName); }catch (Exception e)log("无法注册JDBC驱动程序: " + driverClassName + ", 错误: " + e);}}}/*** 将文本信息写入日志文件*/private void log(String msg){log.println(new Date() + ": " + msg);}/*** 将文本信息与异常写入日志文件*/private void log(Throwable e, String msg) {log.println(new Date() + ": " + msg);e.printStackTrace(log);/*** 此内部类定义了一个连接池.它能够根据要求创建新连接,直到预定的最* 大连接数为止.在返回连接给客户程序之前,它能够验证连接的有效性.*/class DBConnectionPool{//private int checkedOut;private V ector freeConnections = new V ector();private int maxConn;private String name;private String password;private String URL;private String user;/*** 创建新的连接池** @param name 连接池名字* @param URL 数据库的JDBC URL* @param user 数据库帐号,或null* @param password 密码,或null* @param maxConn 此连接池允许建立的最大连接数*/public DBConnectionPool(String name, String URL, String user, String password,int maxConn){ = name;this.URL = URL;er = user;this.password = password;this.maxConn = maxConn;}/*** 将不再使用的连接返回给连接池** @param con 客户程序释放的连接*/public synchronized void freeConnection(Connection con) {// 将指定连接加入到向量末尾try{if(con.isClosed()){System.out.println("before freeConnection con is closed");}freeConnections.addElement(con);Connection contest = (Connection) stElement();if(contest.isClosed()){System.out.println("after freeConnection contest is closed");}notifyAll();}catch(SQLException e){System.out.println(e);}}/*** 从连接池获得一个可用连接.如没有空闲的连接且当前连接数小于最大连接* 数限制,则创建新连接.如原来登记为可用的连接不再有效,则从向量删除之,* 然后递归调用自己以尝试新的可用连接.*/public synchronized Connection getConnection(){Connection con = null;if (freeConnections.size() > 0){// 获取向量中第一个可用连接con = (Connection) freeConnections.firstElement(); freeConnections.removeElementAt(0);try {if (con.isClosed()){log("从连接池" + name+"删除一个无效连接");System.out.println("从连接池" + name+"删除一个无效连接");// 递归调用自己,尝试再次获取可用连接con = getConnection();}}catch (SQLException e){log("从连接池" + name+"删除一个无效连接时错误"); System.out.println("从连接池" + name+"删除一个无效连接出错"); // 递归调用自己,尝试再次获取可用连接con = getConnection();}if(freeConnections.size()>maxConn){ System.out.println(" 删除一个溢出连接"); releaseOne();}}else if((maxConn == 0)||(freeConnections.size()<maxConn)) {con = newConnection();}return con;}public synchronized Connection returnConnection(){Connection con = null;//如果闲置小于最大连接,返回一个新连接if(freeConnections.size()<maxConn){con = newConnection();}//如果闲置大于最大连接,返回一个可用的旧连接else if(freeConnections.size()>=maxConn){con = (Connection) freeConnections.firstElement();System.out.println(" [a 连接池可用连接数] : "+"[ "+freeConnections.size()+" ]");freeConnections.removeElementAt(0);System.out.println(" [b 连接池可用连接数] : "+"[ "+freeConnections.size()+" ]");try{if (con.isClosed()){log("从连接池" + name+"删除一个无效连接");System.out.println("从连接池" + name+"删除一个无效连接"); returnConnection();}}catch (SQLException e){log("从连接池" + name+"删除一个无效连接时错误");System.out.println("从连接池" + name+"删除一个无效连接出错");returnConnection();}}return con;}/*** 从连接池获取可用连接.可以指定客户程序能够等待的最长时间* 参见前一个getConnection()方法.** @param timeout 以毫秒计的等待时间限制*/public synchronized Connection getConnection(long timeout){long startTime = new Date().getTime();Connection con;while ((con = getConnection()) == null){try{wait(timeout);}catch (InterruptedException e) {}if ((new Date().getTime() - startTime) >= timeout) {// wait()返回的原因是超时return null;}}return con;}/*** 关闭所有连接*/public synchronized void release(){Enumeration allConnections = freeConnections.elements(); while (allConnections.hasMoreElements()){Connection con = (Connection) allConnections.nextElement(); try {con.close();log("关闭连接池" + name+"中的一个连接");}catch (SQLException e){log(e, "无法关闭连接池" + name+"中的连接");}}freeConnections.removeAllElements();}/*** 关闭一个连接*/public synchronized void releaseOne(){if(freeConnections.firstElement()!=null){ Connection con = (Connection) freeConnections.firstElement(); try {con.close();System.out.println("关闭连接池" + name+"中的一个连接"); log("关闭连接池" + name+"中的一个连接");}catch (SQLException e){System.out.println("无法关闭连接池" + name+"中的一个连接");log(e, "无法关闭连接池" + name+"中的连接");}}else{System.out.println("releaseOne() bug.......................................................");}}/*** 创建新的连接*/private Connection newConnection(){Connection con = null;try{if (user == null) {con = DriverManager.getConnection(URL);}else{con = DriverManager.getConnection(URL, user, password); }log("连接池" + name+"创建一个新的连接");}catch (SQLException e) {log(e, "无法创建下列URL的连接: " + URL);return null;}return con;}}}================================/*** Title: ConnectPool.java* Description: 数据库操作* Copyright: Copyright (c) 2002/12/25* Company:* Author :* remark : 加入指针回滚* V ersion 2.0*/import java.io.*;import com.sjky.pool.*;import java.sql.*;import java.util.*;import java.util.Date;import .*;public class PoolMan extends ConnectPool {private ConnectPool connMgr;private Statement stmt;private Connection con ;private ResultSet rst;/***对象连接初始化* */public Connection getPool(String name) throws Exception{try{connMgr = ConnectPool.getInstance();con = connMgr.getConnection(name);}catch(Exception e){System.err.println("不能创建连接!请尝试重启应用服务器");}return con;}/***同以上方法,加入连接空闲等待时间*待用方法* */public Connection getPool_t(String name, long time) throws Exception {try{connMgr = ConnectPool.getInstance();con = connMgr.getConnection(name,time);}catch(Exception e){System.err.println("不能创建连接!");}return con;}/***执行查询方法1* */public ResultSet executeQuery(String SqlStr) throws Exception {ResultSet result = null;try{stmt = con.createStatement();result = stmt.executeQuery(SqlStr);// here add one line by jnma 12.11mit();}catch(java.sql.SQLException e){throw new Exception("执行查询语句出错");}return result;}/***执行查询方法2* */public ResultSet getRst(String SqlStr) throws Exception{// ResultSet result = null;try{stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet. CONCUR_UPDA TABLE);rst = stmt.executeQuery(SqlStr);// here add one line by jnma 12.11mit();}catch(java.sql.SQLException e){throw new Exception("执行查询语句出错");}return rst;}/***执行更新* */public int Update(String SqlStr) throws Exception{int result = -1;try{stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet. CONCUR_UPDA TABLE);result = stmt.executeUpdate(SqlStr);// here add one line by jnma 12.11mit();if(result==0)System.out.println("执行delete,update,insert SQL出错");}catch(java.sql.SQLException e){System.err.println("执行delete,update,insert SQL出错");}return result;}/***执行事务处理* */public boolean handleTransaction(V ector SqlArray) throws Exception {boolean result = false;int ArraySize = SqlArray.size();try{stmt = con.createStatement();con.setAutoCommit(false);System.out.println("ArraySize is" +ArraySize);for(int i=0;i<ArraySize;i++){System.out.println(" 开始执行语句"+(String)SqlArray.elementAt(i)); stmt.executeUpdate((String)SqlArray.elementAt(i));System.out.println(" 执行成功");}mit();con.setAutoCommit(true) ;//必须System.out.println("事务执行成功"); result = true;}catch(java.sql.SQLException e){try{System.out.println(e.toString()); System.out.println("数据库操作失败"); con.rollback();}catch(java.sql.SQLException Te){System.err.println("事务出错回滚异常"); }}try{con.setAutoCommit(true);}catch(java.sql.SQLException e){System.err.println("设置自动提交失败");}return result;}/***释放连接* */public void close(String name) throws Exception {try{if(stmt!=null)stmt.close();if(con!=null){connMgr.freeConnection(name,con);System.out.println(" [c 正在释放一个连接] ");}}catch(java.sql.SQLException e){System.err.println("释放连接出错");}}}===========================属性文件db.properties放在conf下#drivers=com.inet.tds.TdsDriver#logfile=c: esin-2.1.4DBConnectPool-log.txt#test.maxconn=1000#test.url=jdbc:inetdae:SERVER:1433?sql7=true#er=sa#test.password=testdrivers=com.microsoft.jdbc.sqlserver.SQLServerDriverlogfile=F: esin-2.1.4DBConnectPool-log.txttest.maxconn=20test.url=jdbc:microsoft:sqlserver://192.168.0.5:1433;DatabaseName=test er=satest.password=test#drivers=oracle.jdbc.driver.OracleDriver#logfile=c: esin-2.1.4DBConnectPool-log.txt#test.maxconn=100#test.url=jdbc:oracle:thin:@192.168.0.10:1521:myhome#er=system#test.password=manager#mysql端3306#drivers=org.gjt.mm.mysql.Driver#logfile=c: esin-2.1.4DBConnectPool-log.txt#test.maxconn=100#test.url=jdbc:mysql://192.168.0.4:3306/my_test#er=root#test.password=system原作者:薄冰来源:。

相关文档
最新文档