Atomikos分布式事务配置

kingschan 2016-01-17 18:25:39 阅读 1372 评论 0 喜欢 2
配置 spring java 事务 hibernate 

由于项目涉及到跨库操作并且还要保证事务的一致,因此不得不考虑JTA分布式事务处理,我是用Atomikos实现的

JTA的配置文件放在classpath下面:(注意文件名要如下所示)
transactions.properties

com.atomikos.icatch.service=com.atomikos.icatch.standalone.UserTransactionServiceFactory
com.atomikos.icatch.console_file_name = tm.out
com.atomikos.icatch.log_base_name = tmlog
com.atomikos.icatch.tm_unique_name = com.atomikos.spring.jdbc.tm
com.atomikos.icatch.console_log_level = DEBUG
com.atomikos.icatch.max_timeout=3600000

Log4j配置:

log4j.logger.com.atomikos=INFO

让Atomikos输出程序运行时的信息注意观察回滚:

atomikos
atomikos
atomikos
atomikos

Properties文件

############################################
jdbc.oracle.diriverClassName=oracle.jdbc.xa.client.OracleXADataSource
jdbc.oracle.url=jdbc:oracle:thin:@192.168.xxx.xxx:1521:oracle
jdbc.oracle.name=oracleXaDS
jdbc.oracle.username=scott
jdbc.oracle.password=tiger
#############################################
jdbc.driverClassName=com.mysql.jdbc.jdbc2.optional.MysqlXADataSource
jdbcremote.url=jdbc:mysql://192.168.xxx.xxx:3333/rbac
jdbcremote.name=remote
jdbc.username=root
jdbc.password=xxxx
##############################################
jdbc.htsac.diriverClassName=com.microsoft.sqlserver.jdbc.SQLServerXADataSource
jdbc.htsac.url=jdbc:sqlserver://192.168.xxx.xx:1433;DatabaseName=xxx;
jdbc.htsac.name=htsacXaDs
jdbc.htsac.username=sa
jdbc.htsac.password=xxx

jar包: (Spring+JTA+Hibernate4+Atomikos分布式事务配置)

Spring+JTA+Hibernate4+Atomikos分布式事务配置

spring

<?xml version="1.0" encoding="UTF-8"?>
<beans default-lazy-init="true"
xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:task="http://www.springframework.org/schema/task" xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.2.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
">
<!--oracle数据源 -->
<bean id="cloud_oracle_ds" class="com.atomikos.jdbc.AtomikosDataSourceBean"
init-method="init" destroy-method="close" >
<description>cloudds</description>
<property name="uniqueResourceName" value="${jdbc.oracle.name}" />
<property name="xaDataSourceClassName" value="${jdbc.oracle.diriverClassName}" />
<property name="xaProperties">
<props>
<prop key="user">${jdbc.oracle.username}</prop>
<prop key="password">${jdbc.oracle.password}</prop>
<prop key="URL">${jdbc.oracle.url}</prop>
</props>
</property>
<!-- 连接池里面连接的个数 -->
<property name="poolSize"><value>10</value></property>
<property name="maxPoolSize"><value>100</value></property>
<!--获取连接失败重新获等待最大时间,在这个时间内如果有可用连接,将返回-->
<property name="borrowConnectionTimeout" value="60" />
<property name="testQuery" value="select 1 from dual" />
<!--最大获取数据时间,如果不设置这个值,Atomikos使用默认的5分钟,那么在处理大批量数据读取的时候,一旦超过5分钟,就会抛出类似 Resultset is close 的错误.-->
<!-- 管理 Connection 被占用的时间 -->
<property name="reapTimeout"><value>0</value></property>
<!--连接最大存活时间,超过这个且没有正在使用的连接将自动销毁,0无限制,1000 =1000s,对于一些会自动中断连接的数据库如mysql,可以设置这个参数,在达到这个时间的时候会自动关闭连接,下次数据库调用的时候就会新建-->
<property name="maxLifetime"><value>0</value></property>
<!--java数据库连接池,最大可等待获取datasouce的时间-->
<property name="loginTimeout"><value>0</value></property>
</bean>
<!-- htsac数据源 -->
<bean id="htsacDS"
class="org.springframework.jdbc.datasource.DriverManagerDataSource" >
<property name="driverClassName" value="org.logicalcobwebs.proxool.ProxoolDriver" />
<property name="url" value="proxool.htsac" />
</bean>
<!-- 基础件数据源 -->
<bean id="htcloudDataSource"
class="com.atomikos.jdbc.nonxa.AtomikosNonXADataSourceBean">
<property name="uniqueResourceName" value="${jdbc.htcloud.name}" />
<property name="user" value="${jdbc.htcloud.username}" />
<property name="password" value="${jdbc.htcloud.password}"/>
<property name="url" value="${jdbc.htcloud.url}"/>
<property name="driverClassName" value="${jdbc.htcloud.diriverClassName}" />
<property name="poolSize" value="10" />
<property name="borrowConnectionTimeout" value="120" />
<property name="testQuery" value="SELECT 1" />
<property name="reapTimeout" value="0" />
</bean>
<!--ExMiddleDB数据源 -->
<bean id="ExMiddleDBDataSource" class="com.atomikos.jdbc.nonxa.AtomikosNonXADataSourceBean"
init-method="init" destroy-method="close" >
<description>ExMiddleDBDataSource</description>
<property name="uniqueResourceName" value="${jdbc.ExMiddleDB.name}" />
<property name="user" value="${jdbc.ExMiddleDB.username}" />
<property name="password" value="${jdbc.ExMiddleDB.password}"/>
<property name="url" value="${jdbc.ExMiddleDB.url}"/>
<property name="driverClassName" value="${jdbc.ExMiddleDB.diriverClassName}" />
<property name="poolSize" value="10" />
<property name="borrowConnectionTimeout" value="120" />
<property name="testQuery" value="SELECT 1" />
<property name="reapTimeout" value="0" />
</bean>
<!--htcloud oracle -->
<bean id="oracleSessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="cloud_oracle_ds" />
<property name="mappingDirectoryLocations">
<list>
<value>classpath:com/gaojinsoft/cloud/po</value>
</list>
</property>
<property name="hibernateProperties">
<value>
hibernate.dialect=org.hibernate.dialect.OracleDialect
hibernate.show_sql=true
hibernate.format_sql=false
hibernate.temp.use_jdbc_metadata_defaults=false
<!-- 是否开启二级缓存 -->
hibernate.cache.use_second_level_cache=false
<!-- 是否开启查询缓存 -->
hibernate.cache.use_query_cache=false
<!-- 数据库批量查询最大数 -->
hibernate.jdbc.fetch_size=50
<!-- 数据库批量更新、添加、删除操作最大数 -->
hibernate.jdbc.batch_size=50
<!-- 创建session方式 hibernate4.x 的方式 -->
hibernate.current_session_context_class=org.springframework.orm.hibernate4.SpringSessionContext
hibernate.transaction.factory_class=org.hibernate.engine.transaction.internal.jta.CMTTransactionFactory
hibernate.transaction.manager_lookup_class=com.atomikos.icatch.jta.hibernate3.TransactionManagerLookup
hibernate.connection.release_mode=after_transaction
hibernate.connection.autocommit=false
</value>
</property>
<property name="jtaTransactionManager" ref="jtaTransactionManager"></property>
</bean>
<!-- start -->
<bean id="userTransactionService" class="com.atomikos.icatch.config.UserTransactionServiceImp"
init-method="init" destroy-method="shutdownForce">
<constructor-arg>
<props>
<prop key="com.atomikos.icatch.service">com.atomikos.icatch.standalone.UserTransactionServiceFactory</prop>
</props>
</constructor-arg>
</bean>
<bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager"
init-method="init" destroy-method="close" depends-on="userTransactionService">
<property name="forceShutdown" value="false" />
</bean>
<!-- it defined in millisecond unit-->
<!-- 配置 Atomikos 的 JtaTransaction 的时候需注意, 单这样配置, 这里的设置的 20000 秒有可能不会生效。
Atomikos 对它的Transaction Manager 有个宏观上的设置. 可以参考
http://www.atomikos.com/Documentation/JtaProperties
注意 com.atomikos.icatch.max_timeout 这个参数. 他的作用是给所有的 Transaction 的 Timeout设置一个最大值(单位是毫秒),默认值是5分钟,如果小于它生效,如果大于它不生效(还是5分钟)。
所以,如果没有设置 com.atomikos.icatch.max_timeout 这个参数的话,设置20000秒是不会生效的.
如何设置 com.atomikos.icatch.max_timeout , 文档里面描述,部署一个 jta.properties 文件在 classpath的根目录下(bin目录),但是不同的atomikos可能不同,我部署的是 transactions.properties文件.
如何设置
Transactions.properties代码 收藏代码
#Set the max timeout (in milliseconds) for local transactions
com.atomikos.icatch.max_timeout = 20000000
这样的话, atomikosUserTransaction 设置的 Timeout 20000 才能生效.
Reference: http://www.atomikos.com/Documentation
-->
<bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp"
depends-on="userTransactionService">
<property name="transactionTimeout" value="3600" />
</bean>
<bean id="jtaTransactionManager"
class="org.springframework.transaction.jta.JtaTransactionManager" depends-on="userTransactionService">
<property name="transactionManager" ref="atomikosTransactionManager" />
<property name="userTransaction" ref="atomikosUserTransaction" />
<!-- 允许事务的隔离级别 -->
<property name="allowCustomIsolationLevels" value="true" />
</bean>
<!-- end -->
<bean id="txDefinition" class="org.springframework.transaction.support.DefaultTransactionDefinition">
<property name="propagationBehaviorName" value="PROPAGATION_REQUIRED"></property>
</bean>
<tx:advice id="txAdvice" transaction-manager="jtaTransactionManager">
<tx:attributes>
<tx:method name="get*" isolation="READ_COMMITTED" propagation="REQUIRED" read-only="true" timeout="100"/>
<tx:method name="find*" isolation="READ_COMMITTED" propagation="REQUIRED" read-only="true" timeout="100" />
<tx:method name="has*" isolation="READ_COMMITTED" propagation="REQUIRED" read-only="true" timeout="100"/>
<tx:method name="query*" isolation="READ_COMMITTED" propagation="REQUIRED" read-only="true" timeout="100" />
<tx:method name="locate*" isolation="READ_COMMITTED" propagation="REQUIRED" read-only="true" timeout="100"/>
<tx:method name="delete*" propagation="REQUIRED" rollback-for="Exception" timeout="100"/>
<tx:method name="update*" propagation="REQUIRED" rollback-for="Exception" timeout="100" />
<tx:method name="add*" propagation="REQUIRED" rollback-for="Exception" timeout="100"/>
<tx:method name="save*" propagation="REQUIRED" rollback-for="Exception" timeout="100"/>
<tx:method name="create*" propagation="REQUIRED" rollback-for="Exception" timeout="100"/>
<tx:method name="*" propagation="REQUIRED" rollback-for="Exception" timeout="100"/>
</tx:attributes>
</tx:advice>
<aop:aspectj-autoproxy proxy-target-class="true" expose-proxy="true"/>
<tx:jta-transaction-manager />
<aop:config expose-proxy="true">
<!-- 只对业务逻辑层实施事务 -->
<aop:pointcut id="txPointcut"
expression="execution(* com.gaojinsoft.cloud.services..**.*Serv.*(..))" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut" />
</aop:config>
</beans>

java basedao:

import java.io.Serializable;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.transform.Transformers;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
*
* @author kingschan
* date:2013-10-08
* @param*/
public class BaseDao
{
public Logger log = LoggerFactory.getLogger(BaseDao.class);
private SessionFactory sessionfactory;
public SessionFactory getSessionfactory()
{
return sessionfactory;
}
public void setSessionfactory(SessionFactory sessionfactory)
{
this.sessionfactory = sessionfactory;
log.info("注入sessionfactory");
}
public Session getSession()
{
Session session = null;
try
{
session = sessionfactory.getCurrentSession();
log.info("只有在事务管理下,才能通过 getCurrentSession() 得到 session ,如果显示这个信息,则说明事务管理工作起作用了。");
}
catch(HibernateException ex)
{
session = sessionfactory.openSession();
log.info("*************************************************************");
log.info("* *");
log.info("* 通过 openSession() 得到。事务管理没有起作用,需要检查配置。 *");
log.info("* *");
log.info("*************************************************************");
}
return session;
}
/**
* 保存一个对象
* @param obj
*/
public void save(Object obj)
{
Session s = getSession();
s.save(obj);
}
/**
* 保存多个对象
* @param lis
*/
public void saveList(List lis)
{
Session session = getSession();
for(int a = 0; a < lis.size(); a++)
{
session.save(lis.get(a));
= "" if = "" (a = "" %= "" 10 = "=" 0) = "" { = "" session.flush(); = "" session.clear(); = "" } = "" * *= "" *= "" 根据hql返回一个list = "" 如果有参数刚hql用 ? 来表示条件 = "" @param = "" hql = "" args = "" 从1开始赋值 = "" @return = "" public = "" listqueryForList(String hql, Object...args)
{
List lis = null;
Session s = getSession();
Query q = s.createQuery(hql);
if (null != args && args.length > 0)
{
for (int i = 0; i < args.length; i++)
{
q.setParameter(i, args[i]);
}
}
lis = q.list();
return lis;
}
/**
* sql查询
* @param sql
* @param args
* @return
*/
public Listquery(String sql, Object...args)
{
List lis = null;
Session s = getSession();
Query q = s.createSQLQuery(sql);
if (null != args && args.length > 0)
{
for (int i = 0; i < args.length; i++)
{
q.setParameter(i, args[i]);
}
}
lis = q.list();
return (List) lis;
}
/**
* sql查询
* @param sql
* @param args
* @return
*/
public List query1(String sql, Object...args)
{
List lis = null;
Session s = getSession();
Query q = s.createSQLQuery(sql).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);;
if (null != args && args.length > 0)
{
for (int i = 0; i < args.length; i++)
{
q.setParameter(i, args[i]);
}
}
lis = q.list();
return lis;
}
/**
* 分页查询
* @param hql
* @param pageindex
* @param limit
* @param args
* @return
*/
public List Pagination(String hql, int pageindex, int limit, Object...args)
{
List lis = null;
Session s = getSession();
Query q = s.createQuery(hql);
if (null != args && args.length > 0)
{
for (int i = 0; i < args.length; i++)
{
q.setParameter(i, args[i]);
}
}
q.setFirstResult((pageindex - 1) * limit);
q.setMaxResults((pageindex - 1) * limit + limit);
lis = q.list();
return lis;
}
/**
* 修改一个实体
* @param obj
*/
public void update(Object obj)
{
getSession().update(obj);
}
/**
* 删除一个实体
* @param obj
*/
public void delete(Object obj)
{
getSession().delete(obj);
}
/**
* 删除多个实体
* @param obj
*/
public void deleteList(List lis)
{
Session session = getSession();
for(int a = 0; a < lis.size(); a++)
{
session.delete(lis.get(a));
= "" if = "" (a = "" %= "" 10 = "=" 0) = "" { = "" session.flush(); = "" session.clear(); = "" } = "" * *= "" *= "" 根据主键返回一个实体 = "" @param = "" clazz = "" id = "" @return = "" public = "" object = "" get(classclazz, Object id)
{
return getSession().get(clazz, (Serializable) id);
}
/**
* 执行HQL
* @param hql
* @param obj
*/
public int executeHQL(String hql, Object...args)
{
Query q = getSession().createQuery(hql);
if (null != args && args.length > 0)
{
for (int i = 0; i < args.length; i++)
{
q.setParameter(i, args[i]);
}
}
return q.executeUpdate();
}
/**
* 执行SQL
* @param hql
* @param obj
*/
public int executeSQL(String sql, Object...args)
{
Query q = getSession().createSQLQuery(sql);
if (null != args && args.length > 0)
{
for (int i = 0; i < args.length; i++)
{
q.setParameter(i, args[i]);
}
}
return q.executeUpdate();
}
/**
* hql单一值查值
* @param hql
* @param args
* @return
*/
public Object uniqueQueryByHql(String hql, Object...args)
{
Query q = getSession().createQuery(hql);
if (null != args && args.length > 0)
{
for (int i = 0; i < args.length; i++)
{
q.setParameter(i, args[i]);
}
}
return q.uniqueResult();
}
/***
* sql 单一值查值
* @param sql
* @param args
* @return
*/
public Object uniqueQueryBySql(String sql, Mapparams)
{
Query q = getSession().createSQLQuery(sql);
if (null != params && !params.isEmpty())
{
Iteratoritera = params.keySet().iterator();
while (itera.hasNext())
{
String key = itera.next();
q.setParameter(key, params.get(key));
}
}
return q.uniqueResult();
}
/***
* sql 单一值查值
* @param sql
* @param args
* @return
*/
public Object uniqueQueryBySql(String sql, Object...args)
{
Query q = getSession().createSQLQuery(sql);
if (null != args && args.length > 0)
{
for (int i = 0; i < args.length; i++)
{
q.setParameter(i, args[i]);
}
}
return q.uniqueResult();
}
/**
* 本地命名查询返回List* @return
* @throws Exception
*/
@SuppressWarnings("unchecked")
public List getNameQuery(String key, Object...args)throws Exception
{
List<map> lis = null;
Session s = getSession();
Query q = s.getNamedQuery(key);
if (null != args && args.length > 0)
{
for (int i = 0; i < args.length; i++)
{
q.setParameter(i, args[i]);
}
}
q.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
lis = q.list();
return lis;
}
/**
* 执行sql语句返回list【map【String,object】】
* @param sql
* @param objects
* @return
*/
public List executeSQLQuery(String sql , Object...objects)
{
List lis = null;
Session s = getSession();
Query q = s.createSQLQuery(sql);
if (null != objects && objects.length > 0)
{
for (int i = 0; i < objects.length; i++)
{
q.setParameter(i, objects[i]);
}
}
q.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
return lis = q.list();
}
}

Oracle XA事务权限配置:

分布式事务在连接Oracle数据时,可能会报错,错误信息如下:

javax.transaction.xa.XAException at oracle.jdbc.xa.OracleXAResource.recover(OracleXAResource.java:526) at com.ibm.ws.rsadapter.spi.WSRdbXaResourceImpl.recover(WSRdbXaResourceImpl.java:1038) at com.ibm.ws.Transaction.JTA.XARminst.recover(XARminst.java:138) at com.ibm.ws.Transaction.JTA.XARecoveryData.recover(XARecoveryData.java:687) at com.ibm.ws.Transaction.JTA.PartnerLogTable.recover(PartnerLogTable.java:524) at com.ibm.ws.Transaction.JTA.RecoveryManager.resync(RecoveryManager.java:1859) at com.ibm.ws.Transaction.JTA.RecoveryManager.run(RecoveryManager.java:2580) at java.lang.Thread.run(Thread.java:810)

可以在Oracle数据库中执行sql语句:

create user htcloud identified by htcloud;
grant dba to htcloud;
1.grant select on sys.dba_pending_transactions to username; 2.grant select on sys.pending_trans$ to username; 3.grant select on sys.dba_2pc_pending to username; 4.grant execute on sys.dbms_system to username;
grant select on sys.dba_pending_transactions to scott;
grant select on sys.pending_trans$ to scott;
grant select on sys.dba_2pc_pending to scott;
grant execute on sys.dbms_system to scott;

sqlserver配置 XA 事务

您必须在安装 Microsoft SQL Server 数据库之后,启动服务器之前配置 XA 事务。SQL Server JDBC 驱动程序为提供对 Java Platform, Enterprise Edition/JDBC 2.0 可选分布式事务的支持。从 SQLServerXADataSource 类获取的 JDBC 连接可参与标准分布式事务处理环境,如 Java 平台、Enterprise Edition (Java EE) 应用程序服务器。
关于此任务

配置 XA 事务失败可能会在服务器启动时导致以下错误:javax.transaction.xa.XAException: com.microsoft.sqlserver.jdbc.SQLServerException: Failed to create the XA control connection. Error: "Could not find stored procedure 'master..xp_sqljdbc_xa_init_ex'."..
在 Service Manager 中,应将 MS DTC 服务标记为“自动”,以确保在 SQL Server 服务启动时运行 MS DTC 服务。
过程

  1. 要为 XA 事务启用 MS DTC,必须执行以下步骤:
    在 Windows XP 和 Windows Server 2003 上:
    2.
  2. 选择控制面板 > 管理工具 > 组件服务。
  3. 选择组件服务 > 计算机,然后右键单击我的电脑,然后选择属性。
  4. 单击 MSDTC 选项卡,然后单击安全性配置。
  5. 选中启用 XA 事务复选框,然后单击确定。这将使 MS DTC 服务重新启动。
  6. 再次单击确定以关闭属性窗口,然后关闭组件服务。
  7. 重新启动 SQL Server 以确保它与 MS DTC 更改同步。
    在 Windows Vista、Windows 7、Windows Server 2008 R2 或 Windows Server 2012 上:
  8. 选择控制面板 > 管理工具 > 组件服务。
  9. 选择组件服务 > 计算机 > 我的电脑 > Distributed Transaction Coordinator。
  10. 右键单击本地 DTC,然后选择属性。
  11. 单击本地 DTC 属性窗口上的安全性选项卡。
  12. 选中启用 XA 事务复选框,然后单击确定。这将重新启动 MS DTC 服务。
  13. 再次单击确定以关闭“属性”窗口,然后关闭“组件服务”。
  14. 重新启动 SQL Server 以确保它与 MS DTC 更改同步。
  15. 配置 JDBC 分布式事务组件:
  16. 如果您尚未安装 IBM® Business Process Manager,请从 Microsoft 站点下载 Microsoft SQL Server JDBC Driver 3.0,并将其解压至任意文件夹。
  17. 如果已安装 BPM ,请转至 bpm_install_root\jdbcdrivers\SQLServer\xa 以获取以下步骤中需要的文件:
  18. 将 sqljdbc_xa.dll 文件从 JDBC unarchived 目录复制到 SQL Server 计算机的 Binn 目录(对于缺省 SQL Server 安装,该位置为 C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Binn)。如果将 XA 事务与 32 位 SQL Server 一起使用,那么请使用 x86 文件夹中的 sqljdbc_xa.dll 文件,即使该 SQL Server 安装在 x64 处理器上也如此。如果将 XA 事务与 x64 处理器上的 64 位 SQL Server 一起使用,那么请使用 x64 文件夹中的sqljdbc_xa.dll 文件。
  19. 在 SQL Server 上运行 xa_install.sql 数据库脚本。例如,从命令提示符中运行 sqlcmd -i xa_install.sql。该脚本会安装由 sqljdbc_xa.dll 调用的扩展存储过程。这些扩展存储过程会针对 Microsoft SQL Server JDBC 驱动程序实施分布式事务和 XA 支持。您将需要以 SQL Server 实例管理员的身份运行该脚本。您可以忽略有关无法删除不存在的过程的错误。
  20. 打开 SQL Server Management Studio 以查找 master 数据库下的安全性文件夹。要授予特定用户参与 JDBC 驱动程序的分布式事务的许可权,请将该用户添加到主数据库中的 SqlJDBCXAUser 角色(例如,对于 Lombardi 用户,在用户映射中添加主数据库并选中 SqlJDBCXAUser 角色)。
  21. 遵循以下步骤来配置 Windows 认证:
  22. 查找 sqljdbc_auth.dll。 如果您尚未安装 IBM Business Process Manager,请转至BPM_install_root\jdbcdrivers\SQLServer\auth 以获取此文件。如果您未安装 BPM,请在下载的 Microsoft JDBC 驱动程序包中找到 dll 文件。
  23. 将 sqljdbc_auth.dll 文件复制到 SQL Server 计算机的 Binn 目录(对于缺省 SQL Server 安装,该位置为 C:/Program Files/Microsoft SQL Server/MSSQL10_50.MSSQLSERVER/MSSQL/Binn)。如果您的 JRE 是 32 位,请使用 x86 文件夹中的sqljdbc_auth.dll 文件,即使 SQL Server 是安装在 x64 处理器上。如果您的 JRE 是 64 位,请使用 x64 文件夹中的sqljdbc_auth.dll 文件。
    下一步做什么

在配置 XA 事务之后,启动服务器之前,必须使用以下步骤配置您的 TCP/IP 连接:
1. 从“开始”菜单中依次单击 Microsoft SQl Server 2008 R2 > 配置工具 > SQL Server 配置管理器。
2. 展开 SQl Server 网络配置 > SQL2008 协议
3. 找到右侧的 TCP/IP。
4. 双击 TCP/IP 并在协议选项卡下启用此协议。
5. 双击 IP 地址选项卡,为各个已配置的 IP 地址启用 TCP 端口。
在某些情况中,您还可以在 IBM BPM SystemOut.logs 中看到以下锁定超时错误:
Lock request time out period exceeded.; nested exceptionis com.microsoft.sqlserver.jdbc.SQLServerException: Lock request time out period exceeded.
要防止发生锁定超时(或者在锁定超时发生之后进行解决),您可以在事务服务上添加定制属性 ENABLE_XARESOURCE_TIMEOUT。事务服务将在全局事务中列出 XA 资源时为其提供相应的超时值。
注意:
XA事务下不支持DDL语句(创建表结构那些语句)

支持@用户名回复

×  

:bowtie: :smile: :laughing: :blush: :smiley: :relaxed: :smirk: :heart_eyes: :kissing_heart: :kissing_closed_eyes: :flushed: :relieved: :satisfied: :grin: :wink: :stuck_out_tongue_winking_eye: :stuck_out_tongue_closed_eyes: :grinning: :kissing: :kissing_smiling_eyes: :stuck_out_tongue: :sleeping: :worried: :frowning: :anguished: :open_mouth: :grimacing: :confused: :hushed: :expressionless: :unamused: :sweat_smile: :sweat: :weary: :pensive: :disappointed: :confounded: :fearful: :cold_sweat: :persevere: :cry: :sob: :joy: :astonished: :scream: :neckbeard: :tired_face: :angry: :rage: :triumph: :sleepy: :yum: :mask: :sunglasses: :dizzy_face: :imp: :smiling_imp: :neutral_face: :no_mouth: :innocent: :alien: :yellow_heart: :blue_heart: :purple_heart: :heart: :green_heart: :broken_heart: :heartbeat: :heartpulse: :two_hearts: :revolving_hearts: :cupid: :sparkling_heart: :sparkles: :star: :star2: :dizzy: :boom: :collision: :anger: :exclamation: :question: :grey_exclamation: :grey_question: :zzz: :dash: :sweat_drops: :notes: :musical_note: :fire: :hankey: :poop: :shit: :+1: :thumbsup: :-1: :thumbsdown: :ok_hand: :punch: :facepunch: :fist: :v: :wave: :hand: :open_hands: :point_up: :point_down: :point_left: :point_right: :raised_hands: :pray: :point_up_2: :clap: :muscle: :metal: :walking: :runner: :running: :couple: :family: :two_men_holding_hands: :two_women_holding_hands: :dancer: :dancers: :ok_woman: :no_good: :information_desk_person: :raised_hand: :bride_with_veil: :person_with_pouting_face: :person_frowning: :bow: :couplekiss: :couple_with_heart: :massage: :haircut: :nail_care: :boy: :girl: :woman: :man: :baby: :older_woman: :older_man: :person_with_blond_hair: :man_with_gua_pi_mao: :man_with_turban: :construction_worker: :cop: :angel: :princess: :smiley_cat: :smile_cat: :heart_eyes_cat: :kissing_cat: :smirk_cat: :scream_cat: :crying_cat_face: :joy_cat: :pouting_cat: :japanese_ogre: :japanese_goblin: :see_no_evil: :hear_no_evil: :speak_no_evil: :guardsman: :skull: :feet: :lips: :kiss: :droplet: :ear: :eyes: :nose: :tongue: :love_letter: :bust_in_silhouette: :busts_in_silhouette: :speech_balloon: :thought_balloon:

共0条评论

文章导航

  1. Log4j配置:
  2. 让Atomikos输出程序运行时的信息注意观察回滚:
  3. Properties文件
  4. jar包: (Spring+JTA+Hibernate4+Atomikos分布式事务配置)
  5. spring
  6. java basedao:
  7. Oracle XA事务权限配置:
  8. 分布式事务在连接Oracle数据时,可能会报错,错误信息如下:
  9. sqlserver配置 XA 事务

相似文章

  • 顶部
  • 关灯
  • 留言
  • 点赞