文档库 最新最全的文档下载
当前位置:文档库 › JAVA中数据库事务处理的实现

JAVA中数据库事务处理的实现

JAVA中数据库事务处理的实现
JAVA中数据库事务处理的实现

Java中数据库事务处理的实现

摘要本文介绍在Java中进行事务处理的方法,通过实例分别讲述了如何采用JavaBean、Ejb组件实现J2EE应用服务器支持的JDBC事务、JTA(Java Transaction API)事务。

关键词JavaBean,EJB,数据库,事务处理,JTA

JavaBean

JavaBean是用Java语言编写的与平台无关的组件。它是描述Java的软件组件模型,有点类似于Microsoft的COM组件的概念。在Java模型中,通过JavaBean可以无限扩充Java程序的功能,通过JavaBean的组合可以快速的生成新的应用程序。JavaBean可以实现代码的重复利用,对于程序的易维护性也有重大的意义。非可视化的JavaBean,在JSP程序中常用来封装事务逻辑、数据库操作等,可以很好的实现业务逻辑和前台程序的分离。JavaBean在服务器端的应用方面表现出了越来越强的生命力。

EJB

EJB技术定义了一组可重用的组件:Enterprise JavaBeans。你可以利用这些组件,像搭积木一样的建立你的分布式应用程序。当你把代码写好之后,这些组件就被组合到特定的文件中去。每个文件有一个或多个Enterprise Beans,在加上一些配置参数。最后,这些Enterprise Beans被配置到一个装了EJB容器的平台上。客户能够通过这些Beans的home接口,定位到某个beans,并产生这个beans的一个实例。这样,客户就能够调用Beans的应用方法和远程接口。EJB技术简化了用JAVA语言编写的企业应用系统的

开发、配置和执行。有三种类型的Enterprise beans:Session beans、entity beans和Message-driven Beans。

事务处理

信息是任何企事业单位的重要资产,任何企业部门都包含着信息的流入、流出,任何企业部门都控制着某些信息。同时,信息必须在适当的时机传播给需要的人。而且,信息还需要安全约束,通常根据信息的类型和内容实施访问控制。为了保证数据的安全有效和正确可靠,数据库管理系统(DBMS)必须提供统一的数据保护功能。

事务是现代数据库理论中的核心概念之一。如果一组处理步骤或者全部发生或者一步也不执行,我们称该组处理步骤为一个事务。当所有的步骤像一个操作一样被完整地执行,我们称该事务被提交。由于其中的一部分或多步执行失败,导致没有步骤被提交,则事务必须回滚(回到最初的系统状态)。事务必须服从ISO/IEC所制定的ACID原则。ACID是原子性(atomicity)、一致性(consistency)、隔离性(isolation)和持久性(durability)的缩写。事务的原子性表示事务执行过程中的任何失败都将导致事务所做的任何修改失效。一致性表示当事务执行失败时,所有被该事务影响的数据都应该恢复到事务执行前的状态。隔离性表示在事务执行过程中对数据的修改,在事务提交之前对其他事务不可见。持久性表示已提交的数据在事务执行失败时,数据的状态都应该正确。

在下面我们列举一个使用SQL Server数据库进行事务处理的例子。主表

是一个规章制度信息表(bylaw),主要字段有记录编号、标题、作者、书写日期等。两个子表分别是附件表(bylaw_affix)和文本信息表

(bylaw_content)。表结构见图1所示。bylaw表的记录编号与bylaw_affix 表的记录编号、bylaw_content表的记录编号是对应的,每次对规章制度信息的操作也就是对这三个表的联合操作。例如要删除规章制度中的一条记录,如果不使用事务,就可能会出现这样的情况:第一个表中成功删除后,数据库突然出现意外状况,而第二、三个表中的操作没有完成,这样,删除操作并没有完成,甚至已经破坏数据库中的数据。要避免这种情况,就应该使用事务,它的作用是:要么三个表都操作成功,要么都失败。换句话说,就是保持数据的一致性。所以,为了确保对数据操作的完整和一致,在程序设计时要充分考虑到事务处理方面的问题。

图1示例表结构

Java中的事务处理

一般情况下,J2EE应用服务器支持JDBC事务、JTA(Java Transaction API)事务、容器管理事务。一般情况下,最好不要在程序中同时使用上述三种事务类型,比如在JTA事务中嵌套JDBC事务。第二方面,事务要在尽可能短的时间内完成,不要在不同方法中实现事务的使用。下面我们列举两种

事务处理方式。

1、JavaBean中使用JDBC方式进行事务处理

在JDBC中怎样将多个SQL语句组合成一个事务呢?在JDBC中,打开一个连接对象Connection时,缺省是auto-commit模式,每个SQL语句都被当作一个事务,即每次执行一个语句,都会自动的得到事务确认。为了能将多个SQL语句组合成一个事务,要将auto-commit模式屏蔽掉。在

auto-commit模式屏蔽掉之后,如果不调用commit()方法,SQL语句不会得到事务确认。在最近一次commit()方法调用之后的所有SQL会在方法commit()调用时得到确认。

2、SessionBean中的JTA事务

JTA是事务服务的J2EE解决方案。本质上,它是描述事务接口(比如UserTransaction接口,开发人员直接使用该接口或者通过J2EE容器使用该接口来确保业务逻辑能够可靠地运行)的J2EE模型的一部分。JTA具有的三个主要的接口分别是UserTransaction接口、TransactionManager接口和Transaction接口。这些接口共享公共的事务操作,例如commit()和rollback(),但是也包含特殊的事务操作,例如suspend(),resume()和enlist(),它们只出现在特定的接口上,以便在实现中允许一定程度的访问控制。例如,UserTransaction能够执行事务划分和基本的事务操作,而TransactionManager能够执行上下文管理。

应用程序可以调用UserTransaction.begin()方法开始一个事务,该事务与应用程序正在其中运行的当前线程相关联。底层的事务管理器实际处理线程与事务之间的关联。https://www.wendangku.net/doc/8a12070555.html,mit()方法终止与当前线程关联的事务。UserTransaction.rollback()方法将放弃与当前线程关联的当前事务。

Last Modified:2004.04.04

JBoss的集群策略分析

(来源:https://www.wendangku.net/doc/8a12070555.html,)

序言

在阅读本文前,请确定您有以下基础,否则您可能会是在浪费您的时间:

1、了解J2EE的一些基本概念

2、了解集群的基本概念

3、对JBOSS有一些大致的了解,可到https://www.wendangku.net/doc/8a12070555.html,上下载它。JBOSS

是一个开放源码的、基于J2EE规范的应用服务器,它实现了大多数的J2EE规范,除此之外,它还提供了一些J2EE中所没有涉及到的企业级功能,例如集群。本文主要描述JBOSS采取的集群策略,并重点介绍它的负载平衡与失效转发机制。

由于JBOSS是一个建立在J2EE规范上的应用服务器,因此在开始之前,我们还是简单地介绍一下J2EE规范:J2EE是一套针对于企业级分布式应用的计算环境,它定义了动态WEB页面功能(servlet和jsp),商业组件(EJB),异步消息传输机制(JMS),名称和目录定位服务(JNDI),数据库访问(JDBC),与子系统的连接器(JCA),安全服务等等。

但美中不足的是J2EE并没有定义一些企业级应用所必须的规范,例如集群,所以集群的实现只能由各厂商自行来设计实现。要实现基于J2EE规范的集群,我们通常要做如下考虑:集群的管理、负载平衡、失效转发、服务端状态的复制(例如JSP 中的session),还要考虑同步和异步的问题(例如JMS服务就是异步方式)。如果要对这些内容做一个全面的阐述的话,估计可以写成一本书了:)因此本文主要探讨的是:怎样实现无状态EJB的负载平衡与失效转发机制?

1999年,Marc Fleury建立了JBOSS开源项目,现在它有差不多100个活跃的开发者,30个核心开发者,每月高达35万次的下载量,它当前的最高稳定版是3.2版,4.0版正在稳定之中,自从JBOSS3.0开始就加入了集群技术,几乎能对任何J2EE 规范进行集群管理,如JNDI、JSP中的session、EJB等等。更令人振奋的是,即将发行的JBOSS4.0将会对JMS也加入集群管理特色。

EJB集群在JBOSS中的实现

下面言归正传,上图大致描述了一个客户端调用JBOSS中的EJB的过程。在JBOSS 中,客户端并不直接调用EJB对像,而采用了一个迂回的方法,更专业的说是一种设计模式――代理模式,真正与客户端交互的是一个代理对像①,这个代理对像一般由客户端通过JNDI技术来取得的。而具体的代理对像的实现就由各厂商自完成了,在JBOSS中,一个代理对像是一段精心设计的复杂代码。

但在客户端看来,调用一个代理对像好像就是在调用那个实际的EJB对像,虽然事实并非如此。在这里JBOSS耍了一个小把戏,代理对像虽然实现了与EJB对像相同的接口,但它实际上是把客户端对它的调用转发到了它在服务端的另一个伙伴身上②,同时,这个伙伴同样定义了客户端所要求的一些EJB接口,当这些接口被调用时③,精彩的部分开始了,JBOSS把客户端发过来的各种各样不同的调用全部转换成为一个统一格式的接口④(在本文中我们暂且称客户端发出的调用为应用级接口,而JBOSS生成的统一格式的接口称为系统级接口)。当转换完成后,所有的应用级接口变成了系统级接口⑤。为了能更清楚地阐述这个问题,我们假设客户端向EJB对像发出如下调用:

myRemoteComponent.increaseSalary(100);

//myRemoteComponent为代理对像

这个调用实际上被JBOSS转换成了如下的系统级调用:

proxyClientContainer.invoke(invocation);

//proxyClientContainer为代理对像在服务端的另一个伙伴

但这个invocation到底是什么呢?实际上它是类Invocation的一个实例,这里有它的一个简单的说明:

public class Invocation{

Object[]args;//应用级接口中的一些参数

Method method;//被调用的应用级接口

Map payload;//JBOSS就是在这里采取的负载平衡策略的

……

}

当应用级接口被转换成为了系统级接口之后,它将经过一系列的拦截器(⑥至⑦)。在这里我首先要说明一下什么是拦截器,实际上,它是JBOSS中独具特色的一个设计思路,一个拦截器就好像是一张过滤网,它用来对客户端的调用进行拦截,并对其进行一些处理,比如检查客户端调用的合法性、实现安全策略、对事务进行支持等。值得一提的是,JBOSS的集群管理也是通过拦截器来实现的,更令人欣慰的是,JBOSS的设计者并没有将这个拦截器固化在其核心内,而是采用一种插件式(plug-in)的方法来设计,因此你只要实现它的插件接口,你甚至可以写出自己的拦截器来,当然,这已不属于本文的讨论范围之内了。

这里(⑥至⑦)的每个拦载器将顺序地拦截invocation,它们都具有如下的集群管理方面的能力:

1、分析invocation的内容和任务。

2、加入一些信息到invocation中的payload中,以优化集群策略。

3、读取出放在payload中的任何可用信息。

4、将invocation转发到下一个拦截器中。

5、如果发生错误,能够将错误报告给调用者,并返回到正确的地方去。

值得注意的是最后一个拦截器,它有一些特殊,因为它才真正地执行对实际的EJB的调用⑧,它能检测到客户端是否和EJB对像在同一个Java虚拟机中,如果是的话,它只是简单地将这个调用直接传给EJB对像,这样做的原因是可以避免由于网络传输带来的不必要的开销,使用调用速度大大加快。

另一方面,如果客户端与EJB不在同一个虚拟机中,那么它们就要通过网络传

输了,在这里JBOSS提供了另一个有趣的策略,就是代理对像并不知道采取的是什么传输协议,只有最后那个拦截器才知道真正采用的传输协议是什么。就目前而言,它提供了RMI/JRMP、IIOP、HTTP、SOAP等协议来进行传输。

当我们设计JBOSS的集群策略时,我们还必须决定究竟要在哪儿将负载平衡以及失效转发行激活,为此,请先看下图:

1、在某个服务器结点上发生

2、在一个中介服务器上进行发生

3、在客户端上进行发生

上图中的3种方案都有其利弊,但我们觉得最后一个方法要比前2个好,原因如下:

1、与第2种方案相比,它避免了由于中介服务器失效而引发的全线崩溃。

2、除非客户端崩溃,负载平衡和失效转发策略才会失败。而我想应该没有人会对此产生报怨的。这也没有什么好报怨的,不是吗?

3、从性能方面来考虑,这种方案也是最优的,因为所有的策略都是发生在客户端的,省去了第1、2种方案由服务器来管理带来的瓶颈。

因此,我们选择了最后一种方案来做为JBOSS的集群策略。其实,只要大家再仔细回顾一下前面的部分,就会发现我们先前描述的方案不正是第3种方案吗?但我们现在必须对这个策略在以下几个方面做一些更深入的分析:

1、我们必须加入真正实现负载平衡的逻辑。

2、当客户端发出调用时,我们应该能够决定到底将它发送到哪个服务器节点上。

3、我们希望为客户端代理对像设计一个比较合适的服务器结点的拓扑图,以便我们做出好的集群策略。

负载平衡的设计策略

前面已经说过,JBOSS的负载平衡与失效转发策略是由最后一个拦截器实现的(上图中的①),然而我们要考虑的是虽然客户端只发出一个调用,但针对于代理对像的调用可能包含多个可用的服务器结点,其个数等于集群中所有有效节点之和(参见上图中的②),那么到底是由谁来决定这个策略的呢?这个工作由一个叫插件式的负载平衡策略来实施的(在下一段中简称策略①,如下图)。

当客户端调用到达最后一个拦截器的时候,拦截器会请求策略①来为它选择一个服务器结点。如果此结点有效且调用成功,则结果会返回给代理对像,如果失败了,拦截器不会直接将错误返回给代理对像,而是将这个错误信息报告给策略①,并请求它再为客户端选择一个新节点。

但还有一个问题值得考虑的,就是对一些致命性错误的处理。例如某个数据库服务器突然崩溃了,那么最后一个拦截器将无法对此进行失效转发了,因为不管选择哪个服务器结点都不能解决这个问题了,在这里拦截器会将错误报告给客户端,并由其自已做出决定。

IT界里好像有这样一个原理,就是"越是可扩展性强,灵活的东西实施起来就越复杂"。在JBOSS中也不例外,但幸运的是这些工作并没为给客户端带来额外的编程负担,因为所有策略的配置都是在服务器完成的。

JBOSS的集群配置遵循XML规范,下面是的一个普通EJB对像的典型集群配置:

<jboss>

<enterprise-beans>

<session>

<ejb-name>MySessionBean</ejb-name>

<clustered>True</clustered>

<cluster-config>

<partition-name>DefaultPartition</partition-name>

<home-load-balance-policy>

org.jboss.ha.framework.interfaces.RoundRobin

</home-load-balance-policy>

<bean-load-balance-policy>

org.jboss.ha.framework.interfaces.FirstAvailable

</bean-load-balance-policy>

</cluster-config>

</session>

</enterprise-beans>

</jboss>

上述配置说明了一个名为MySessionBean的会话Bean的集群策略,它定义了名为DefaultPartion的缺省策略名称,并定义了2个具体的策略。当然,如果你觉得它比较复杂,而只想用JBOSS缺省的集群策略的话,可以将整个<cluster-config >标签去掉。

最后还有一个小问题值得考虑:由于集群策略是发生在客户端的,当客户端发出调用请求时,它不得不下载它的代理对像、拦截器、负载平衡策略等等。如果要下载的内容过多,会影响客户端的调用速度,这里JBOSS采取了一种延迟下载的方法,就是每次只下载一个必须的类,而不是一次全部下载,这样就能使性能得到较大的改善。

服务器结点拓扑图的刷新

JBOSS的集群实现是动态的,也就是说你可以动态地往集群中加入一个新节点或关闭任意一个节点,而不用费力地维护一张静态的拓扑图,就好像是JBOSS自己有能力管理集群一样。这个思想够先进吧?但与此同时它也带来了一些令人头痛的问题,请先看下图:

由于JBOSS的集群策略是在客户端进行的,那么客户端在调用EJB的时候会将所有必须的组件下载下来,然后由其进行集群决策。如果我们设T为时间,且t0<t1<t2,那么当处于t0时刻时,集群拓扑图中包含server1和server2两个节点,客户端的调用被转发到了结点2上。当处于t1时刻时,server1和server2全部都崩溃了。当处于t2时刻时,管理员增加了server3和server4两个节点,但客户端的拓扑图中还只是包含原先的server1和server2两节点的信息,因为它无法知道这新加入的2个节点。

为了解决这个问题,JBOSS是这样设计的,在客户端的每次对某个节点调用后,服务器节点自动检查客户的拓扑图是不是最新的,如果不是,则向客户端发送新的拓扑图,如下图所示:

当客户端进行调用时,代理对像对其进行了一个小小的包装,它将系统级调用invocation和自已现在的拓扑图(JBOSS开发者称它为view ID)发送到服务端,而服务端则检查它自己的view ID是否与代理对像中的view ID吻合。这里我们先简单介绍一下view ID,它实际上就是包含所有服务器节点的一个哈希表,至于为什么要用哈希表是因为它生成方便(java编译器自带)、存取快速,无须考虑排序问题。

下面接着讲述,如果代理对像的view ID与服务端节点的view ID相吻合的话,服务端将直接把结果传给EJB对像,并将结果返回。

如果服务器集群拓扑产生了变化,则会导致它们不吻合。这时服务器节点同样也将调用EJB对像,但此时返回的结果有所不同,它除了返回客户端的结果外,还要为代理对像返回一个最新的view ID,并通知代理对像:"喂,你的拓扑图太旧了,我发了份新的,你赶快更新一下吧!"当代理对像收到这个消息后会更新自己的view ID,并将结果返回客户端代码。

性能考虑

对于JBOSS来说,实现负载平衡与失效转发所带来的性能上的损失是很难计算的,因为它只发生在客户端上,而每个客户端不管从硬件配置、操作系统来说都是不一样的。

由于本文讲的主要是对于无状态的EJB对像的集群,但如果是有状态的EJB或实体EJB,那情况会怎样呢?答案是:情况只会更糟!为此服务器节点不得不进行状态复制,而这个开销通常是很大的,取决于状态中上下文的内容和状态更新的频率。所幸的是,对于大多数应用而言,它们主要是进行无状态的EJB调用,这样就不服务器节点就不需进行大量状态复制了。

结论

JBOSS为J2EE应用提供了一个非常灵活有效的集群机制。它能使得在保持服务端性能损失最小的情况下进行失效转发,并能动态地对集群节点进行配置。更令人振奋的是,在JBOSS4.0中,集群机制将会发挥到极致,到时候就不仅仅是J2EE应用能够进行集群管理了,连普通的J2SE应用都能进行集群了,到那时高可用性的计算并不只是一句口号了,而是JBOSS的一个简单实现!

Java中连接MySql数据库的几种方法

JDBC Java中JDBC定义了java与各种sql数据库之间的编程接口,JDBC API是一个统一的标准应用程序编程接口,这样可以屏蔽异种数据库之间的差异。 JDBC的工作原理 JDBC与ODBC(OpenData Base Connectivity,开放式数据库连接)的作用非常类似,它在应用程序和数据库之间起到了桥梁的作用。ODBC使用的特别广泛,在java中还提供了JDBC-ODBC桥,能够在JDBC与ODBC之间进行转换,这样可以通过ODBC屏蔽不同种数据库之间的差异。在JDK的包java.sql.*中定义了一系列的类、接口、异常以及这些类和接口中定义的属性和方法,java的开发人员通过一定的规则调用java.sql.*中的API就可以实现对数据库管理系统的访问。 JDBC的四种驱动 1.JDBC-ODBC Bridge JDBC-ODBC Bridge可以访问一个ODBC数据源,但在执行Java程序的机器上必须安装ODBC驱动,并作出配置,它的调用方式如下图: 因为中间有个JDBC-ODBC,所以影响了执行效率。 配置ODBC数据源的方法如下(以Mysql为例): 第一步,打开控制面板—>管理工具--->数据源(ODBC) 选择系统DSN,这一项默认应该是空的,我这里是已经配置好了一个数据源。

第二步,点击添加 第三步,选择Mysql的ODBC驱动,点击完成。 注:MySQL的ODBC驱动在系统中一般是找不到的,因为它不是系统默认自带的驱动,所以,我们要自己安装我们所需要的MySQL的ODBC驱动。安装步骤如下: ①.下载安装包,https://www.wendangku.net/doc/8a12070555.html,/downloads/connector/odbc/ ②.我们下载与自己系统相应的ODBC驱动 这里我们选择

完整java连接数据库步骤

完整java开发中JDBC连接数据库代码和步骤 JDBC连接数据库 ?创建一个以JDBC连接数据库的程序,包含7个步骤: 1、加载JDBC驱动程序: 在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机),这通过https://www.wendangku.net/doc/8a12070555.html,ng.Class类的静态方法forName(String className)实现。 例如: try{ //加载MySql的驱动类 Class.forName("com.mysql.jdbc.Driver") ; }catch(ClassNotFoundException e){ System.out.println("找不到驱动程序类,加载驱动失败!"); e.printStackTrace() ; } 成功加载后,会将Driver类的实例注册到DriverManager类中。 2、提供JDBC连接的URL ?连接URL定义了连接数据库时的协议、子协议、数据源标识。 ?书写形式:协议:子协议:数据源标识 协议:在JDBC中总是以jdbc开始 子协议:是桥连接的驱动程序或是数据库管理系统名称。 数据源标识:标记找到数据库来源的地址与连接端口。 例如:(MySql的连接URL) jdbc:mysql: //localhost:3306/test?useUnicode=true&characterEncoding=gbk ; useUnicode=true:表示使用Unicode字符集。如果characterEncoding设置为 gb2312或GBK,本参数必须设置为true 。characterEncoding=gbk:字符编码方式。 3、创建数据库的连接 ?要连接数据库,需要向java.sql.DriverManager请求并获得Connection对象,该对象就代表一个数据库的连接。 ?使用DriverManager的getConnectin(String url , String username , String password )方法传入指定的欲连接的数据库的路径、数据库的用户名和密码来获得。 例如: //连接MySql数据库,用户名和密码都是root String url = "jdbc:mysql://localhost:3306/test" ; String username = "root" ; String password = "root" ; try{ Connection con = DriverManager.getConnection(url , username , password ) ; }catch(SQLException se){ System.out.println("数据库连接失败!"); se.printStackTrace() ; }

java连接mysql数据库

Java连接MySQL 数据库的正确操作流程 时间:2010-05-25 15:41 来源:博客园字体:[大中小] 以下的文章主要介绍的是Java连接MySQL 数据库(以MySQL数据库为例),我们主要是以MySQL数据库为例讲下Java正确连接MySQL数据库的实际操作流程,以下就是对其详细内容的描述。 当然,首先要安装有JDK(一般是。然后安装MySQL,这些都比较简单,具体过程就不说了。配置好这两个环境后,下载JDBC驱动(这个是最新版的)。然后将其解压缩到任一目录。我是解压到D盘,然后将其目录下的加到classpath里,具体如下: “我的电脑”-> “属性” -> “高级” -> “环境变量”,在系统变量那里编辑classpath,将D:\加到最后,在加这个字符串前要加“;”,以与前一个classpath区分开。然后确定。 环境配置好了,很简单。现在,先配置MySQL,设其用户名为“root”,密码为“root”。在命令行或用一个SQL的前端软件创建Database。 我是用SQLyog的前端软件来创建Database的。 先创接MySQL 数据库: 1.CREATE DATABASE SCUTCS; 接着,创建表: 1.CREATE TABLE STUDENT 2.( 3.SNO CHAR(7) NOT NULL, 4.SNAME VARCHAR(8) NOT NULL, 5.SEX CHAR(2) NOT NULL, 6.BDATE DATE NOT NULL, 7.HEIGHT DEC(5,2) DEFAULT , 8.PRIMARY KEY(SNO) 9.); 然后插入数据,可以用SQL语句insert into <表名> values (value1, value2, ...); 也可以用SQLyog来操作 好了,创建好了。

JAVA_java数据库连接池

JAVA数据库连接池 ●基本概念及原理 ?数据库连接池是为了解决数据库对象 的共享出错问题。 ?实际就是建立一个缓冲池。 ?原理 预先在缓冲池中放入一定数量的连接, 当需要建立数据库连接时,只需从连接 池中取出一个,使用完毕之后再放回 去。 ?JDBC的API中没有提供连接池的方法。 ●连接池关键问题分析 ?使用线程同步来解决并发问题 ?使用一个单例模式的连接池管理类来 解决连接多个不同数据库。具体方法: ◆在连接池管理类的唯一实例被创建 时读取一个资源文件,其中资源文件 中存放着多个数据库的url地址()、 用户名()、密码()等信息。如 tx.url=172.21.15.123: 5000/tx_it,https://www.wendangku.net/doc/8a12070555.html,er=yang, tx.password=yang321。

◆根据资源文件提供的信息,创建多 个连接池类的实例,每一个实例都是 一个特定数据库的连接池。连接池管 理类实例为每个连接池实例取一个 名字,通过不同的名字来管理不同的 连接池。 ?使用资源文件来解决同一个数据库有多个用户使用不同的名称和密码访问的情况。具体方法: ◆资源文件中设置多个具有相同url 地址,但具有不同用户名和密码的数 据库连接信息。 ?可采用每一个事务独占一个连接来实现事务处理, 这种方法可以大大降低事务管理的复杂性。具体方法: ◆Connection类可以通过设置 Connection的AutoCommit属性为 false,然后显式的调用commit或 rollback方法来实现。 ?使用空闲池来解决连接池的分配与释放处理。具体办法:

◆把已经创建但尚未分配出去的连接按创建时间存放到一个空闲池中。 ◆每当用户请求一个连接时,系统首先检查空闲池内有没有空闲连接:●如果有就把建立时间最长(通过容 器的顺序存放实现)的那个连接分 配给他(实际是先做连接是否有效 的判断,如果可用就分配给用户, 如不可用就把这个连接从空闲池删 掉,重新检测空闲池是否还有连 接)。 ●如果没有则检查当前所建连接池是 否达到连接池所允许的最大连接数 (maxConn),如果没有达到,就新建 一个连接,如果已经达到,就等待 一定的时间(timeout)。如果在等 待的时间内有连接被释放出来就可 以把这个连接分配给等待的用户, 如果等待时间超过预定时间 timeout,则返回空值(null)。

java平时最常用的7种数据库连接方式

今天总结了java平时最常用的7种数据库连接方式,现在分享给大家 MySQL: String Driver="com.mysql.jdbc.Driver"; //驱动程序 String URL="jdbc:mysql://localhost:3306/db_name"; //连接的URL,db_name 为数据库名 String Username="username"; //用户名 String Password="password"; //密码 Class.forName(Driver).new Instance(); Connection con=DriverManager.getConnection(URL,Username,Password); Microsoft SQL Server: 1) String Driver="com.microsoft.jdbc.sqlserver.SQLServerDriver"; //连接SQL数据库的方法 String URL="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=db_name"; //db_name为数据库名 String Username="username"; //用户名 String Password="password"; //密码 Class.forName(Driver).new Instance(); //加载数据可驱动 Connection con=DriverManager.getConnection(URL,UserName,Password); // 2) String Driver="com.microsoft.sqlserver.jdbc.SQLServerDriver"; //连接SQL数据库的方法 String URL="jdbc:sqlserver://localhost:1433;DatabaseName=db_name"; //db_name为数据库名 String Username="username"; //用户名 String Password="password"; //密码 Class.forName(Driver).new Instance(); //加载数据可驱动 Connection con=DriverManager.getConnection(URL,UserName,Password); Sysbase: String Driver="com.sybase.jdbc.SybDriver"; //驱动程序 String URL="jdbc:Sysbase://localhost:5007/db_name"; //db_name为数据可名 String Username="username"; //用户名 String Password="password"; //密码 Class.forName(Driver).newInstance(); Connection con=DriverManager.getConnection(URL,Username,Password); Oracle(用thin模式): String Driver="oracle.jdbc.driver.OracleDriver"; //连接数据库的方法String URL="jdbc:oracle:thin:@loaclhost:1521:orcl"; //orcl为数据库的SID String Username="username"; //用户名 String Password="password"; //密码 Class.forName(Driver).newInstance(); //加载数据库驱动

java数据库连接方法

一、问题引入 在java程序中,需要访问数据库,做增删改查等相关操作。如何访问数据库,做数据库的相关操作呢? 二、Java连接数据库方法概述 java.sql提供了一些接口和类,用于支持数据库增删改查等相关的操作。该jar包定义了java访问各种不同数据库(mysql,oracle,sqlserver。。。。。)的统一接口和标准。同时,各个数据库厂商都提供了该jar包中定义的各个接口的实现类,用于具体实现本厂数据库的增删改查操作,即称之为“数据库驱动jdbc driver”。例如mysql的数据库驱动为:com.mysql.jdbc.driver;oracle的数据库驱动为:oracle.jdbc.driver.oracledriver。在java程序中访问数据库,做数据库连接时,可以采用两种方式: 1、使用java.sql API 利用该包提供的各种接口和类直接访问数据库。 例子: 2、使用数据库连接池 目前存在多个开源的java数据库连接池,这些连接池都是在java.sql基础上编写而成。 该连接池的解决的问题是: 当使用java.sql中提供的api创建数据库连接时候,需要耗费很大的资源,要进 行用户名密码数据库连接验证等,即耗费资源也耗费时间。如果在程序中,每次需 要访问数据库时候,都进行数据库连接,那么势必会造成性能低下;同时,如果用 户失误忘记释放数据库连接,会导致资源的浪费等。而数据库连接池就是解决该问 题,通过管理连接池中的多个连接对象(connection),实现connection重复利用。 从而,大大提高了数据库连接方面的性能。 该连接池的功能是: 负责创建,管理,释放,分配数据库连接即(connection)。首先,负责创建相应 数目的数据库连接对象(connection)对象,并存放到数据库连接池(connect pool)中。当用户请求数据库连接时,该连接池负责分配某个处于空闲状态的数据库连接 对象;当用户发出释放该数据库连接时,该连接池负责将该连接对象重新设置为空

JAVA连接各种数据库的代码大全

Java数据库连接大全 注:newInstance()可要可不要。 通用JDBC-ODBC直连方式(无需额外的驱动包): Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection conn=DriverManager.getConnection("jdbc:odbc:Driver={SQL Server};Server=localhost;uid=sa;pwd=1111;Database=db"); 以下方式中Class.forName中的都是需要添加的驱动包。 1Java连接Oralce Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); String url="jdbc:oracle:thin:@localhost:1521:orcl"; Connection conn=DriverManager.getConnection(url,user,password); 2Java连接MySQL Class.forName("org.gjt.mm.mysql.Driver").newInstance(); //Class.forName("com.mysql.jdbc.Driver"); String URL="jdbc:mysql://localhost/test"; Connection conn=DriverManager.getConnection(url,user,password); 3Java连接SQLServer 连接mssql2000 Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance(); String URL="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=db"; Connection conn=DriverManager.getConnection(url,user,password); 连接mssql2005+ Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver").newInstance(); String URL="jdbc:sqlserver://localhost:1433;DatabaseName=db"; Connection conn=DriverManager.getConnection(url,user,password); 通用方式: Class.forName("net.sourceforge.jtds.jdbc.Driver").newInstance(); String url="jdbc:jtds:sqlserver://localhost:1433;DatabaseName=db"; Connection conn=DriverManager.getConnection(url,user,password); 4Java连接DB2 Class.forName(“com.ibm.db2.jdbc.app.DB2Driver").newInstance(); String URL=”jdbc:db2://localhost:5000/db"; Connection conn=DriverManager.getConnection(url,user,password); 5Java连接Infomix Class.forName("https://www.wendangku.net/doc/8a12070555.html,rmix.jdbc.IfxDriver").newInstance(); String URL="jdbc:informix-sqli://123.45.67.89:1533/db:INFORMIXSERVER=myserver"; Connection conn=DriverManager.getConnection(url,user,password); 6Java连接SyBase Class.forName("com.sybase.jdbc.SybDriver").newInstance(); Properties sysProps=System.getProperties(); SysProps.put("user","userid"); SysProps.put("password","user_password"); Connection conn=DriverManager.getConnection(url,SysProps);

Java数据库连接池

Java数据库连接池 Tomcat6.0 Tomcat6.0连接池配置 1. 配置tomcat下的conf下的context.xml文件,在之间添加连接池配置: 2. 配置你的应用下的web.xml中的之间加入 DB Connection jdbc/oracle javax.sql.DataSource Container 3.把连接数据库的第三方驱动放到common/lib下面就ok了 4.测试程序我就不写了 1.配置tomcat下的conf下的server.xml中的host标签中添加连接池配置: 1.

Java连接MySql数据库入门操作

这是连接后进行一些简单操作后的结果: Succeeded connecting to the Database! 学号姓名 2011001 张三 2011002 李四 2011003 王五 先去下载MySql并安装好。安装MySql的方法在 https://www.wendangku.net/doc/8a12070555.html,/view/9cc0fcc76137ee06eff918d5.html 然后下载jdbc驱动。 https://www.wendangku.net/doc/8a12070555.html,/downloads/connector/j/ 下载好了解压即可。把那个zip文件也放到解压后的目录中,方便管理使用。 我使用的是eclipse,我要导入包,先进行一些设置。

安装jre。 添加外部jar文件 打开刚才解压得到的jar文件。

打开的效果。 使用mysql创建数据库,进行测试。 mysql> use test; Database changed mysql> create table student ( -> sno char(7) not null, -> sname varchar(8) not null, -> sex char(2) not null -> ); Query OK, 0 rows affected

mysql> insert into student values -> (2011001, '张三', '男'); Query OK, 1 row affected mysql> insert into student values -> (2011002, '李四', '男'); Query OK, 1 row affected mysql> insert into student values -> (2011003 , '王五', '男'); Query OK, 1 row affected mysql> select * from student; +---------+-------+-----+ | sno | sname | sex | +---------+-------+-----+ | 2011001 | 张三| 男| | 2011002 | 李四| 男| | 2011003 | 王五| 男| +---------+-------+-----+ 3 rows in set mysql> 编码测试。 输入下面源代码: import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class JDBCTest { public static void main(String[] args){ try { // 加载驱动程序 Class.forName("com.mysql.jdbc.Driver"); // URL指向要访问的数据库名test String url = "jdbc:mysql://127.0.0.1:3306/test"; // MySQL配置时的用户名 String user = "root";

Java连接数据库全过程

Java连接数据库全过程 第一次用java连接数据库,开始竟然不知道从哪里下手,后看了很多书,请教了很多高手,忙了一天才连接上,所以我把这个详细的过程整理出来贡献给大家,不当的地方,希望大家告诉我,一定更正。 要准备的软件: 1.操作系统:windows xp或其他系统; 2.java运行环境:JDK 官方下载网址:https://www.wendangku.net/doc/8a12070555.html,/javase/downloads/index.jsp 3.数据库:SQL server 2000; 下面是java连接数据库需要更新的东西,不然连不上的: 1安装SQL SP3补丁:“SQLSERVER2000SP3补丁.exe”,和普通的程序安装一样。 2.把3个jar包:“msbase.jar”,“mssqlserver.jar”,“msutil.jar”加到classpath中,具体的安装方法我已经详细整理:“Java连接数据库配置——加载jar包”。 Java连接数据库的核心程序文件:"TestConnect.java"如下 //TestConnect.java import java.sql.*; public class TestConnect { private Connection con=null;//Connection:与特定数据库的连接(会话)。在连接上下文中执行 SQL 语句并返回结果。 String dbDriver="com.microsoft.jdbc.sqlserver.SQLServerDriver";//声明数据库驱动名(这个是微软的驱动名) //String dbDriver="sun.jdbc.odbc.JdbcOdbcDriver";//sun驱动程序名 //String dbUrl="jdbc:odbc:lhs"; String dbUrl="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=lhs";//数据库驱动程序URL,和相应的驱动配套。 String dbUser="sa";//定义数据库登陆用户名 String dbPasw="123";//定义相应用户的登陆密码 //创建数据库连接 public void connect()

Java连接各种数据库写法

随笔- 6 文章- 0 评论- 1 Java连接各种数据库写法 # 示例配置参考,涵盖几乎所有的主流数据库 ############# Oracle数据库######################## # 数据库驱动名 driver=oracle.jdbc.driver.OracleDriver # 数据库URL(包括端口) dburl=jdbc:oracle:thin:@127.0.0.1:1521:zvfdb # 数据库用户名 user=root # 用户密码

password=zvfims ############# DB2数据库######################## # 数据库驱动名 driver=com.ibm.db2.jcc.DB2Driver # 数据库URL(包括端口) dburl=jdbc:db2://127.0.0.1:50000/zvfdb # 数据库用户名 user=root # 用户密码 password=zvfims ############# MySQL数据库######################## # 数据库驱动名

driver=com.mysql.jdbc.Driver # 数据库URL(包括端口) dburl=jdbc:mysql://127.0.0.1:3306/zvfdb # 数据库用户名 user=root # 用户密码 password=zvfims ############# PostgreSQL数据库数据库######################## # 数据库驱动名 driver=org.postgresql.Driver # 数据库URL(包括端口) dburl=jdbcostgresql://127.0.0.1/zvfdb

JAVA-JDBC连接数据库(查询_添加_修改_删除)

一实验目的 (1)理解JDBC的工作原理,熟悉java.sql包中与数据库访问相关的类及其用法,如DriverManager、 Connection、Statement、ResultSet。 (2)熟悉利用JDBC进行数据库访问的步骤: —加载JDBC驱动程序(Class.forName() —建立数据库连接(DriverManager.getConnection()) —发布SQL命令 (stmt=Con.createStatement(),stmt.executeQuery()) —取结果集并处理(ResultSet的next()方法和.get***()方法) —关闭连接,释放对象(close()) (3)掌握建立ODBC数据源的方法,会使用JDBC-ODBC Bridge进行数据库访问。 二实验内容 编写图形界面程序,利用JDBC实现图书/同学通讯录/校园卡/团员/教师/学生管理系统。(任选1题,也可自拟题目,但需指导教师同意!) 三实验要求 (1) 进行规范的数据库设计,正确地定义关系数据表的结构及表间联系(包括:字段的数据类型、宽度、精度、主键、外键、缺省值)。 (2)要求界面布局紧凑、流畅、美观,实现的功能较为完善 (3)本实验分两次完成,第一次可以先做一些准备测试,旨在熟悉JDBCAPI编程接口中相关类的使用方法,测试中可以先基于字符界面实现功能,再逐步过渡到图形界面。 四实验步骤 (1)在Access或SQL Server中建立数据库及基础表。在控制面板中正确配置ODBC数据源,并测试成功。 (2)编写图形界面的Application,利用JDBC-ODBC Bridge进行数据库访问,实现要求的功能。 五实验主要代码

java连接到各种数据库的方法

此文中的代码主要列出连接数据库的关键代码,其他访问数据库代码省略 1、Oracle8/8i/9i数据库(thin模式) Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); String url="jdbc:oracle:thin:@localhost:1521:orcl"; //orcl为数据库的SID String user="test"; String password="test"; Connection conn= DriverManager.getConnection(url,user,password); 2、DB2数据库 Class.forName("com.ibm.db2.jdbc.app.DB2Driver ").newInstance(); String url="jdbc:db2://localhost:5000/sample"; //sample为你的数据库名 String user="admin"; String password=""; Connection conn= DriverManager.getConnection(url,user,password); 3、Sql Server7.0/2000数据库 Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance (); String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=mydb"; //mydb为数据库 String user="sa"; String password=""; Connection conn= DriverManager.getConnection(url,user,password); 4、Sybase数据库 Class.forName("com.sybase.jdbc.SybDriver").newInstance(); String url =" jdbc:sybase:Tds:localhost:5007/myDB"; //myDB为你的数据库名 Properties sysProps = System.getProperties(); SysProps.put("user","userid"); SysProps.put("password","user_password"); Connection conn= DriverManager.getConnection(url, SysProps); 5、Informix数据库 Class.forName("https://www.wendangku.net/doc/8a12070555.html,rmix.jdbc.IfxDriver").newInstance(); String url = "jdbc:informix-sqli://123.45.67.89:1533/myDB:INFORMIXSERVER=myserver; user=testuser;password=testpassword"; //myDB为数据库名 Connection conn= DriverManager.getConnection(url);

JAVA与SQLServer数据库连接共有两种方式

JAVA与SQLServer数据库连接的两种方式 一.jdbc-odbc桥方式 1.1 建立ODBC数据源: 设置——〉控制面板——〉管理工具——〉数据源(ODBC)——〉系统DSN ——〉 添加——〉选择SQLServer驱动——>填写数据源名字——〉选择服务器——〉选择登陆方式(默认使用windows NT验证)——〉更改默认数据库为所有数据库——〉 完成测试成功则建立完毕。 1.2 导入包: import java.sql.*; 1.3 装载驱动: DriverManager.registerDriver(new sun.jdbc.odbc.JdbcOdbcDriver()); 或者:Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 第一种方式比较常用,也容易理解; 1.4 建立连接: Connection con = DriverManager.getConnection("jdbc:odbc:xx"); 其中xx是1.1建立的数据源名字,如果建立的数据源选择的windowsNT验证方式,则上面语句即可; 如果1.1所建立的数据源登陆方式选择的是SQL用户验证,则这里要写成:Connection con = DriverManager.getConnection("jdbc:odbc:xx","用户名","密码"); 其中的"用户名","密码"分别是SQLServer所建立的“登陆”用户,并具有对所用库的操作权限; 1.5 建立载体: Statement st = con.createStatement(); 1.6 发出数据请求: 查询数据操作: ResultSet rs = st.executeQuery("select * from titles"); 该语句将sql语句传递给数据库并返回一个结果集rs,即查询结果放在rs对象中;

JAVA数据库基本操作增删改查(精)

JAVA 数据库基本操作, 增删改查 package mypack; JAVA 数据库基本操作, 增删改查 import java.sql.Connection; import java.sql.ResultSet; import java.util.ArrayList; public class DbOper {//查询多行记录public ArrayList select({Connection conn =null; ResultSet rs =null; try {import java.sql.PreparedStatement; import java.sql.SQLException; PreparedStatement pstmt =null; ArrayList al =new ArrayList(; conn =DbConn.getConn(;pstmt =conn.prepareStatement(“select *from titles ”; rs =pstmt.executeQuery(;while (rs.next({Titles t =new Titles(;t.setTitleid(rs.getString(1;t.setTitle(rs.getString(2;al.add(t;}}catch (SQLExceptione { e.printStackTrace(;}finally {try {//TODO 自动生成catch 块if (rs!=null rs.close(;if (pstmt!=nullpstmt.close(;if (conn!=nullconn.close(;}catch (SQLExceptione { e.printStackTrace(;}}//TODO 自动生成catch 块 return al; }//查询单个对象public Titles selectOne(Stringtitleid{Connection conn =null; ResultSet rs =null; try {PreparedStatement pstmt =null; Titles t =new Titles(;

Java 数据库连接

Java 数据库连接(数据库为bbs,数据源名为test) 1、直接连接mysql数据库(先把mysql的驱动加载到工程中:选中工程:右键property---javabuildpath---libraries:再选择AddExternalJARS找到驱动存放位置把它加载进来)package dbLink; package dbLink; import java.sql.*; public class DataBaseConnection { public static Connection getConnection(){ Connection conn = null; try { Class.forName("com.mysql.jdbc.Driver"); conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/bbs","root","123"); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return conn; } public static void closeConnection(Connection conn){ if(conn!=null) try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } public static void closeResultSet(ResultSet rs){ if(rs!=null) try{ rs.close(); }catch(SQLException e){ e.printStackTrace(); } } public static void closePreparedStatment(PreparedStatement ps){ if(ps!=null) try{

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

1 package com.kyo.connection; 2 3 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; 11 12 public class ConnectionPool { 13 14 private ConnectionParam param; 15 16 private String testTable = ""; // 测试连接是否可用的测试表名,默认没 有测试表 17 18 private Vector connections = null; // 存放连接池中数据库连接的向量 , 初始时为 19 // null,它中存放的对象为PooledConnection 型 20 21 public void setParam(ConnectionParam param { 22 this.param = param; 23 } 24 25 public ConnectionParam getParam( { 26 return param;

27 } 28 29 /** 30 * 构造函数 31 * 32 * @param param 33 */ 34 public ConnectionPool(ConnectionParam param { 35 this.param = param; 36 } 37 38 /** 39 * 40 * 获取测试数据库表的名字 41 * 42 * @return 测试数据库表的名字 43 */ 44 45 public String getTestTable( { 46 return this.testTable; 47 } 48 49 /** 50 * 51 * 设置测试表的名字 52 * 53 * @param testTable

相关文档
相关文档 最新文档