xasqlserver的简单介绍

linux应用中间件连接sybase数据库日志报错 当前用户没有权限,不能进行 XA 样式的事务。

目前有许多DBMS产品,如DB2、Oracle、Microso SQL Ser ver 、Sybase SQLServer、Informix、MySQL 等,它们在数据库市场上各自占有一席之地。 中间件所包括的范围十分广泛

创新互联建站-专业网站定制、快速模板网站建设、高性价比凤凰网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式凤凰网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖凤凰地区。费用合理售后完善,十年实体公司更值得信赖。

请教was配置数据库中 连接池数据源和XA数据源区别

1.下载驱动的jar文件。

到microsoft官方网站下载sqlserver的jdbc驱动,其中主要有两个文件:sqljdbc.jar和sqljdbc4.jar

将这两个jar文件拷贝到websphere的安装路径下。

2.设置websphere的环境变量。

设置MSSQLSERVER_JDBC_DRIVER_PATH变量,指向官方驱动jar文件所存放的目录。

3.新建JDBC提供程序。

数据库类型:用户定义的

实现类名: com.microsoft.sqlserver.jdbc.SQLServerConnectionPoolDataSource

com.microsoft.sqlserver.jdbc.SQLServerXADataSource〔用于XA数据源〕

类路径: ${MSSQLSERVER_JDBC_DRIVER_PATH}/sqljdbc.jar 或是

${MSSQLSERVER_JDBC_DRIVER_PATH}/sqljdbc4.jar〔只适用于JDK1.6环境〕

java 数据库事务与应用事务的区别

在说他们之间的区别之前,先考虑如下几个问题:

1、getCurrentSession()与openSession()的区别?

* 采用getCurrentSession()创建的session会绑定到当前线程中,而采用openSession()

创建的session则不会

* 采用getCurrentSession()创建的session在commit或rollback时会自动关闭,而采用openSession()

创建的session必须手动关闭

2、使用getCurrentSession()需要在hibernate.cfg.xml文件中加入如下配置:

* 如果使用的是本地事务(jdbc事务)

property name="hibernate.current_session_context_class"thread/property

* 如果使用的是全局事务(jta事务)

property name="hibernate.current_session_context_class"jta/property

以上是hibernate中一些使用,下面来说说jdbc与jta的区别:

JDBC 事务

JDBC 事务是用 Connection 对象控制的。JDBC Connection 接口( java.sql.Connection )提供了两种事务模式:自动提交和手工提交。

#在jdbc中,事务操作缺省是自动提交。也就是说,一条对数据库的更新表达式代表一项事务操作,操作成功后,系统将自动调用commit()来提交,否则将调用rollback()来回滚。

# 在jdbc中,可以通过调用setAutoCommit(false)来禁止自动提交。之后就可以把多个数据库操作的表达式作为一个事务,在操作完成后调 用commit()来进行整体提交,倘若其中一个表达式操作失败,都不会执行到commit(),并且将产生响应的异常;此时就可以在异常捕获时调用 rollback()进行回滚。这样做可以保持多次更新操作后,相关数据的一致性,示例如下:

try {

conn =

DriverManager.getConnection

("jdbc:oracle:thin:@host:1521:SID","username","userpwd";

conn.setAutoCommit(false);//禁止自动提交,设置回滚点

stmt = conn.createStatement();

stmt.executeUpdate(“alter table …”); //数据库更新操作1

stmt.executeUpdate(“insert into table …”); //数据库更新操作2

conn.commit(); //事务提交

}catch(Exception ex) {

ex.printStackTrace();

try {

conn.rollback(); //操作不成功则回滚

}catch(Exception e) {

e.printStackTrace();

}

}

JDBC 事务的一个缺点是事务的范围局限于一个数据库连接。一个 JDBC 事务不能跨越多个数据库。

JTA事务

JTA(Java Transaction API) 为 J2EE 平台提供了分布式事务服务。

要用 JTA 进行事务界定,应用程序要调用 javax.transaction.UserTransaction 接口中的方法。例如:

utx.begin();

// ...

DataSource ds = obtainXADataSource();

Connection conn = ds.getConnection();

pstmt = conn.prepareStatement("UPDATE MOVIES ...");

pstmt.setString(1, "Spinal Tap");

pstmt.executeUpdate();

// ...

utx.commit();

让我们来关注下面的话:

“用 JTA 界定事务,那么就需要有一个实现 javax.sql.XADataSource 、 javax.sql.XAConnection 和 javax.sql.XAResource 接口的 JDBC 驱动程序。一个实现了这些接口的驱动程序将可以参与 JTA 事务。一个 XADataSource 对象就是一个 XAConnection 对象的工厂。 XAConnection s 是参与 JTA 事务的 JDBC 连接。”

要使用JTA事务,必须使用XADataSource来产生数据库连接,产生的连接为一个XA连接。

XA连接(javax.sql.XAConnection)和非XA(java.sql.Connection)连接的区别在于:XA可以参与JTA的事务,而且不支持自动提交。

注意:

Oracle, Sybase, DB2, SQL Server等大型数据库才支持XA, 支持分布事务。

My SQL 连本地都支持不好,更别说分布事务了。

JTA方式的实现过程:

用XADataSource产生的XAConnection它扩展了一个getXAResource()方法,事务通过这个方法把它加入到事务容器中进行 管理.对于调用者来说,根本看不到事务是如果管理的,你只要声明开始事务,告诉容器我下面的操作要求事务参与了,最后告诉事务说到这儿可以提交或回滚了, 别的都是黑箱操作。

在使用JTA之前,你必须首先实现一个Xid类用来标识事务(在普通情况下这将由事务管理程序来处理)。Xid包含三个元素:formatID、gtrid(全局事务标识符)和bqual(分支修饰词标识符)。

下面的例子说明Xid的实现:

import javax.transaction.xa.*;

public class MyXid implements Xid

{

protected int formatId;

protected byte gtrid[];

protected byte bqual[];

public MyXid()

{

}

public MyXid(int formatId, byte gtrid[], byte bqual[])

{

this.formatId = formatId;

this.gtrid = gtrid;

this.bqual = bqual;

}

public int getFormatId()

{

return formatId;

}

public byte[] getBranchQualifier()

{

return bqual;

}

public byte[] getGlobalTransactionId()

{

return gtrid;

}

}

其次,你需要创建一个你要使用的数据库的数据源:

public DataSource getDataSource()

throws SQLException

{

SQLServerDataSource xaDS = new

com.merant.datadirect.jdbcx.sqlserver.SQLServerDataSource();

xaDS.setDataSourceName("SQLServer");

xaDS.setServerName("server");

xaDS.setPortNumber(1433);

xaDS.setSelectMethod("cursor");

return xaDS;

}

例1 这个例子是用“两步提交协议”来提交一个事务分支:

XADataSource xaDS;

XAConnection xaCon;

XAResource xaRes;

Xid xid;

Connection con;

Statement stmt;

int ret;

xaDS = getDataSource();

xaCon = xaDS.getXAConnection("jdbc_user", "jdbc_password");

xaRes = xaCon.getXAResource();

con = xaCon.getConnection();

stmt = con.createStatement();

xid = new MyXid(100, new byte[]{0x01}, new byte[]{0x02});

try {

xaRes.start(xid, XAResource.TMNOFLAGS);

stmt.executeUpdate("insert into test_table values (100)");

xaRes.end(xid, XAResource.TMSUCCESS);

ret = xaRes.prepare(xid);

if (ret == XAResource.XA_OK) {

xaRes.commit(xid, false);

}

}

catch (XAException e) {

e.printStackTrace();

}

finally {

stmt.close();

con.close();

xaCon.close();

}

当然,实际过程中,我们不需要写这些代码,这些代码是JTA最终的实现代码。

关于“两步提交协议”,可以参看下面的文章:

两阶段提交(Two-Phase-Commit)协议

首先,两阶段提交(Two-Phase-Commit)事务的启动与常规的单阶段提交(One-Phase-Commit)事务类似。接着,应用程序/客 户机对该两阶段提交(Two-Phase-Commit)操作中所涉及的所有数据库执行其修改工作。现在,在最终提交该事务之前,客户机通知参与的数据库准备提交(第 1 阶段)。如果客户机从数据库收到一条“okay”,就发出命令向数据库提交该事务(第 2 阶段)。最后分布式事务(Distributed Transaction)结束。

上面的例子演示了如何在 Java 中使用 JTA 实现两阶段提交(Two-Phase-Commit)协议。在该应用程序中,如果一个事务分支报告了错误,您就要负责进行错误处理。但是“两阶段提交协议 简介”小节中提到仍然存在一个问题,那就是如果第 2 阶段中一个事务分支发生故障,该怎么办呢?

如果再次查看程序代码,您可以看到在“第 1 阶段”和“第 2 阶段”之间有一个很小的时间间隔。在这一时间间隔中,出于某种理由,其中某一参与数据库可能崩溃。如果发生了,我们将陷入分布式事务已经部分提交的情形中。

假 定下列情形:在“第 1 阶段”之后,您从 DB2 和 IDS 数据库中都收到了“okay”。在下一步中,应用程序成功提交了 DB2 的事务分支。接着,应用程序通知 DB2 事务分支提交事务。现在,在应用程序可以通知 IDS 事务分支提交它这一部分之前,IDS 引擎由于断电发生崩溃。这就是一种部分提交全局事务的情形。您现在该怎么办呢?

在重启之后,DB2 和 IDS 都将尝试恢复打开的事务分支。该引擎等待来自应用程序的提示如何做。如果应用程序没有准备重新发送“第 2 阶段”的提交,该事务分支将被引擎所启动的试探性回滚中止。这是非常糟糕的,因为这将使该全局事务处于不一致状态。

一种解决方案是用一个小型应用程序连接引擎中打开的事务分支,并通知引擎提交或回滚这一打开的事务。如果您使用 IDS 作为后端,那么还有一个隐藏的 onmode 标志,允许您结束打开的事务分支。(onmode -Z xid)。

在 DB2 UDB 中,您可以发出 LIST INDOUBT TRANSACTIONS 来获得打开的 XA 事务的有关信息。您必须查看 DB2 Information Center 中的描述来解决该问题。

上面描述的情形是一个很好的例子,也是使用应用程序服务器(Application Server)或事务监控器(Transaction Monitor)的理由。在使用一个中间层服务器时,就由该服务器负责保持事情正常。

求助在JBoss中配置MSSql Server DataSource的问题

创建组件(module)

1、建立目录

如果使用以前的JBoss版本,我们只需要简单地将JDBC的jar放到lib目录下就可以使用了,但是最新版的JBoss7.1,由于引入了组件(module)的概念之后,以前的这种方法就行不通了。为了引入JDBC,我们需要建立如下的目录结构:

$JBOSS_HOME\modules\com\microsoft\sqlserver\jdbc\main

建立目录之后,再将sqljdbc4.jar复制到main目录下面。

第一次看到JBoss的这种目录结构时,发现它跟Maven的类仓库目录结构很相似,都是组织得相当之好。不会象以前那样,将一大堆的jar放到一个目录中,令人看起来觉得相当之混乱。

2、建立module.xml

将jar放到指定的目录之后,还未结束,你还需要建立一个名为module.xml的文件,文件的内容如下所示:

module xmlns="urn:jboss:module:1.1" name="com.microsoft.sqlserver.jdbc"

resources

resource-root path="sqljdbc4.jar"/

/resources

dependencies

module name="javax.api"/

module name="javax.transaction.api"/

module name="javax.servlet.api" optional="true"/

/dependencies

/module

3、注册DataSource

配置的最后一步,就是要修改$JBOSS_HOME\standalone\configuration\standalone.xml文件,在datasources节点增加如下的内容:

datasource jndi-name="java:jboss/datasources/mssql" pool-name="mssql" enabled="true" use-java-context="true"

connection-urljdbc:sqlserver://SqlServer:1433;DatabaseName=test/connection-url

drivermssqlxa/driver

security

user-namesa/user-name

passwordsa/password

/security

/datasource

drivers

driver name="mssqlxa" module="com.microsoft.sqlserver.jdbc"

xa-datasource-classcom.microsoft.sqlserver.jdbc.SQLServerXADataSource/xa-datasource-class

/driver

/drivers

4、启动JBoss

当完成以上的配置后,你就可以尝试启动服务器,如果在log中没有出现什么错误信息,那你基本已经成功配置了MSSQL的DataSource。

5、使用DataSource

定义了DataSource之后,我们尝试在JSP页面中调用它,测试配置是否真正正确。

下面有一段很简单的JSP代码:

%@page contentType="text/html; charset=utf-8"%

%@ page import="java.sql.*,

javax.naming.*,

javax.sql.*

"%

%

Context ct = new InitialContext();

DataSource ds = (DataSource)ct.lookup("java:jboss/datasources/mssql");

Connection con=ds.getConnection();

Statement sm=con.createStatement();

ResultSet rs=sm.executeQuery("select * from User where UserID = '1'");

while(rs.next())

{

Stringtitle=rs.getString("title");

out.println(title +"br");

}

rs.close();

sm.close();

con.close();

%

html

head

meta http-equiv="Content-Type"content="text/html; charset=utf-8"

titleExample/title

/head

body bgcolor="white"

Hello

/body

/html

将上面的代码保存为一个JSP文件,例如ds.jsp,然后把它放到war中就可以做测试了。

这个JSP文件的逻辑很简单,首先它会调用上面所定义的DataSource,然后查询数据库中的User表,最后在页面中显示查询的结果。如果你的配置没问题,你会在浏览器中看到显示的结果(要保证数据库中有User表,而且表中有UserID为1的记录)。

总结

在JBoss7中配置MSSQL的DataSource,过程并不是太复杂。如果你以前使用过旧版本的JBoss,只需要转变一下使用习惯,配置过程就会变得很easy啦

SQLServer2000分布式事务错误解决方法

SQLServer2000分布式事务错误解决方法

如果在Windows.NETServer上安装的SQLServer2000中运行链接服务器查询,可能会返回下列错误(即使MSDTC正在该服务器上运行):

症状如果在Windows.NETServer上安装的SQLServer2000中运行链接服务器查询,可能会返回下列错误(即使MSDTC正在该服务器上运行):Server:Msg8501,Level16,State3,Line3

MSDTConserver'servername'isunavailable.在SQLServer错误日志中,您会发现由运行该查询的spid引发的下列错误:ResourceManagerCreationFailed:ResultCode=0x8004d01c原因这是设计使然。如果在"本地系统"帐户下运行"分布式事务处理协调器服务"就会发生此错误。解决方案最近为了提高RPC安全性对DTC所做的更改要求MSDTC作为"NTAuthority\NetworkService"运行。这是。NETServer的默认选项。在WindowsNT和Windows2000中,默认情况下MSDTC服务是在"本地系统"帐户下运行的。

警告:"注册表编辑器"使用不当可造成严重问题,这些问题可能需要重新安装操作系统。Microsoft不保证能够解决因为"注册表编辑器"使用不当而产生的问题。使用"注册表编辑器"需要您自担风险。

若要将MSDTC服务帐户从"本地系统"更改为"NTAuthority\NetworkService",请执行下列步骤:1.运行regedt32,浏览至HKEY_LOCAL_MACHINE\Software\Microsoft\MSDTC.添加一个DWORD值TurnOffRpcSecurity,值数据为1.2.打开命令提示,运行"netstopmsdtc",然后运行"netstartmsdtc".3.转至"组件服务管理工具".

a.浏览至"启动管理工具".

b.选择"组件服务".

c.展开"组件服务"树,然后展开"我的电脑".

d.右键单击"我的电脑",然后选择"属性".

e.在MSDTC选项卡中,确保选中了下列选项:网络DTC访问网络管理网络事务XA事务另外,"DTC登录帐户"一定要设置为"NTAuthority\NetworkService".

f.单击"确定".这样将会提示您"MSDTC将会停止并重新启动。所有的依赖服务将被停止。请按'是'继续".单击"是"继续。

g.单击"确定"关闭"我的电脑"属性窗口。

4.再次运行regedt32,浏览至HKEY_LOCAL_MACHINE\Software\Microsoft\MSDTC,然后删除TurnOffRpcSecurity项。现在您的MSDTC服务应该在"NTAuthority\NetworkService"帐户下运行了,并且不会再出现该错误。

更多信息当"MSDTC安全性"配置下的"网络DTC访问"禁用时,如果运行链接服务器查询则会返回下列错误:Server:Msg7391,Level16,State1,Line2TheoperationcouldnotbeperformedbecausetheOLEDBprovider'SQLOLEDB'

wasunabletobeginadistributedtransaction.[OLE/DBproviderreturnedmessage:Newtransactioncannotenlistinthespecifiedtransactioncoordinator.]

跟踪标记7300打开时:Server:Msg7391,Level16,State1,Line2TheoperationcouldnotbeperformedbecausetheOLEDBprovider'SQLOLEDB'

wasunabletobeginadistributedtransaction.[OLE/DBproviderreturnedmessage:Newtransactioncannotenlistinthespecifiedtransactioncoordinator.]OLEDBerrortrace[OLE/DBProvider'SQLOLEDB'ITransactionJoin::JoinTransactionreturned0x8004d00a].

MSDTC服务一定要按照上面"解决方案"一节中的说明进行设置,才能防止此错误。

再现现象的步骤

1.转至"启动管理工具服务".

2.右键单击"分布式事务处理协调器"服务,转至"登录"选项卡,选择"登录身份"下的"本地系统"帐户。

3.停止然后重新启动该服务。

4.从查询分析器,运行下列脚本:execsp_addlinkedserverremote1execsp_setnetnameremote1,remoteservernamegoexecremote1.pubs.dbo.sp_executesqlN'createtablet(c1int)'gosetxact_abortongobegintraninsertintoremote1.pubs.dbo.tvalues(1)committrango


分享文章:xasqlserver的简单介绍
标题URL:http://hbruida.cn/article/dscojci.html