wildfly jobss 同时连接多个数据源

由于需要从一个远程机器取数据。处理后保存到本地数据库处理。用 wildfly datasource 会报:

[com.arjuna.ats.arjuna] (default task-6) ARJUNA012140: Adding multiple last resources is disallowed. Trying to add LastResourceRecord(XAOnePhaseResource([email protected][connectionListener=1......

这主要是jpa里面的的事物,只允许一个datasource连接。

采用xa-datasource即可。

standardalone.xml中:

 <subsystem xmlns="urn:jboss:domain:datasources:4.0">
            <datasources>
                <datasource jndi-name="java:jboss/datasources/ExampleDS" pool-name="ExampleDS" enabled="true" use-java-context="true">
                    <connection-url>jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE</connection-url>
                    <driver>h2</driver>
                    <security>
                        <user-name>sa</user-name>
                        <password>sa</password>
                    </security>
                </datasource>
                <datasource jndi-name="java:jboss/datasources/MySqlDS" pool-name="MySqlDS" enabled="true" use-java-context="true">
                    <connection-url>jdbc:mysql://localhost:3306/statisticsystem</connection-url>
                    <driver>mysql</driver>
                    <security>
                        <user-name>jboss</user-name>
                        <password>jboss</password>
                    </security>
                </datasource>
                <datasource jndi-name="java:jboss/datasources/MySqlStatBank" pool-name="MySqlStatBank" enabled="true" use-java-context="true">
                    <connection-url>jdbc:mysql://211.100.75.204:5029/statistics</connection-url>
                    <driver>mysql</driver>
                    <security>
                        <user-name>root</user-name>
                        <password>@^#coopen</password>
                    </security>
                </datasource>
                <xa-datasource jndi-name="java:jboss/datasources/MySqlStatBank1" pool-name="MySqlStatBank1" enabled="true" use-java-context="true">
                    <xa-datasource-property name="ServerName">
                        211.100.75.204
                    </xa-datasource-property>
                    <xa-datasource-property name="PortNumber">
                        5029
                    </xa-datasource-property>
                    <xa-datasource-property name="DatabaseName">
                        statistics
                    </xa-datasource-property>
                    <driver>mysql</driver>
                    <xa-pool>
                        <min-pool-size>5</min-pool-size>
                        <initial-pool-size>5</initial-pool-size>
                        <max-pool-size>100</max-pool-size>
                        <prefill>true</prefill>
                    </xa-pool>
                    <security>
                        <user-name>root</user-name>
                        <password>@^#coopen</password>
                    </security>
                </xa-datasource>
                <drivers>
                    <driver name="h2" module="com.h2database.h2">
                        <xa-datasource-class>org.h2.jdbcx.JdbcDataSource</xa-datasource-class>
                    </driver>
                    <driver name="mysql" module="com.mysqldatabase.mysql">
                        <driver-class>com.mysql.jdbc.Driver</driver-class>
                        <xa-datasource-class>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</xa-datasource-class>
                    </driver>
                </drivers>
            </datasources>
        </subsystem>

persistent.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
             version="2.1">

    <persistence-unit name="statLog">
        <jta-data-source>java:jboss/datasources/MySqlStatBank1</jta-data-source>
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
<!--        <class>com.italktv.colnv.stat.entity.LogOfPlay</class> -->
<!--        <class>com.italktv.colnv.stat.entity.LogOfView</class> -->

        <properties>
                    <property name="hibernate.hbm2ddl.auto" value="create-drop" />
            <!-- <property name= "hibernate.hbm2ddl.auto" value ="validate" /> create-drop -->
            <property name="hibernate.jdbc.fetch_size" value="15" />
            <property name="hibernate.jdbc.batch_size" value="10" />
            <property name="hibernate.show_sql" value="true" />
            <property name="hibernate.format_sql" value="true"></property>

            <!--
            <property name="javax.persistence.schema-generation.database.action" value="drop-and-create"/>
            <property name="javax.persistence.schema-generation-target" value="scripts"/>
            <property name="javax.persistence.ddl-create-script-target" value="e:\createSeats.sql"/>
            <property name="javax.persistence.ddl-drop-script-target" value="e:/dropSeats.sql"/>
             -->
        </properties>

    </persistence-unit>

        <persistence-unit name="primary"  >
        <class>com.italktv.colnv.stat.entity.Seat</class>
        <class>com.italktv.colnv.stat.entity.SeatType</class>
        <class>com.italktv.colnv.stat.entity.LogOfPlayDuration</class>
        <class>com.italktv.colnv.stat.entity.ReportLiveHits</class>     

        <properties>
                    <property name="hibernate.hbm2ddl.auto" value="update" />
            <!-- <property name= "hibernate.hbm2ddl.auto" value ="validate" /> create-drop -->
            <property name="hibernate.jdbc.fetch_size" value="15" />
            <property name="hibernate.jdbc.batch_size" value="10" />
            <property name="hibernate.show_sql" value="true" />
            <property name="hibernate.format_sql" value="true"></property>

            <!--
            <property name="javax.persistence.schema-generation.database.action" value="drop-and-create"/>
            <property name="javax.persistence.schema-generation-target" value="scripts"/>
            <property name="javax.persistence.ddl-create-script-target" value="e:\createSeats.sql"/>
            <property name="javax.persistence.ddl-drop-script-target" value="e:/dropSeats.sql"/>
             -->
        </properties>
    </persistence-unit>

</persistence>

mysql driver的配置参考以前文档,在

 <driver name="mysql" module="com.mysqldatabase.mysql">

调用:
public class PlayDurationTask {

    @PersistenceContext(unitName = "statLog")
    private EntityManager emStatLog;

        String query = "SELECT *  FROM statistics.log_2016  ;";
        List aa = emStatLog.createNativeQuery(query).getResultList();
//ddl语句用 createNativeUpdate
        // 处理

        for (int i = 0; i < aa.size(); i++) {
            Object[] obj = (Object[]) aa.get(i);
            // 使用obj[0],obj[1],obj[2]...取出属性 
            ... ...
        }
}

class two{

@PersistenceContext(unitName = "primary")
private EntityManager em ;
public void genLiveReport() {
em.createNativeQuery(LIVE_PLAY_USERS_BY_MAINID).executeUpdate();
logger.info(LIVE_PLAY_USERS_BY_MAINID);

}

 

参考:

Demystifying Datasource JTA and XA settings on JBoss-WildFly

One topic which is often misunderstood by middleware administrators is the configuration of JTA and XA attributesand their effect on transactions. Let‘s see more in practice.

Basically on a JBoss AS 6/WildFly configuration you can choose three different strategies as far as transactioons are concerned:

1) Setting jta = false and Non-XA datasource


1

<datasource jta="false"  . . . >

When setting this option you will be responsible for managing by yourself the transactions.  For example, the following code will work when using a Datasource with JTA=false:


1

2

3

4

5

6

7

8

9

10

11

12

@Resource(mappedName="java:jboss/datasources/ExampleDS"

private DataSource ds; 

. . . . . . . . . . .

Connection conn = ds.getConnection();

conn.setAutoCommit(false);

PreparedStatement stmt = conn.prepareStatement("INSERT into PROPERTY values (?,?)");

stmt.setString(1,key);

stmt.setString(2,value);

stmt.execute();

conn.commit();

Please note: the datasource with jta=false corresponds exactly to the older definition of local-tx-datasource you can find in JBoss AS 4/5

What if you are using JPA instead ?

So, when using plain JDBC you can handle by yourself transaction boundaries using commit/rollback. What about if you are using JPA with JTA=false? in short, the transaction-type for JPA will be RESOURCE_LOCAL. This would use basic JDBC-level transactions. In such scenario you are responsible for EntityManager (PersistenceContext/Cache) creating and tracking and you have to follow these rules:

  • You must use the EntityManagerFactory to get an EntityManager
  • The resulting EntityManager instance is a PersistenceContext/Cache An EntityManagerFactory can be injected via the @PersistenceUnit annotation only (not @PersistenceContext)
  • You are not allowed to use @PersistenceContext to refer to a unit of type RESOURCE_LOCAL
  • You must use the EntityTransaction API to begin/commit around every call to your EntityManger

Here is an example of using JPA with a RESOURCE_LOCAL transaction:


1

2

3

4

5

6

7

@PersistenceUnit(unitName="unit01")

private EntityManagerFactory emf;

    

EntityManager em = emf.createEntityManager();

em.getTransaction().begin();

em.persist(mag);

em.getTransaction().commit();

 2) Setting jta = true and Non-XA datasource


1

<datasource jta="true"  . . . >

This is the default. When JTA is true, the JCA connection pool manager knows to enlist the connection into the JTA transaction. This means that, if the Driver and the database support it, you can use JTA transaction for a single resource.


1

2

3

4

5

6

@PersistenceContext(unitName = "unit01")

private EntityManager entityManager;

public void addMovie(Movie movie) throws Exception {

        entityManager.persist(movie);

}

If you try to manage JDBC transactions by yourself when jta=true an exception will be raised:


1

2

3

12:11:17,145 SEVERE [com.sample.Bean] (http-/127.0.0.1:8080-1) null: java.sql.SQLException: You cannot set autocommit during a managed transaction!

    at org.jboss.jca.adapters.jdbc.BaseWrapperManagedConnection.setJdbcAutoCommit(BaseWrapperManagedConnection.java:961)

    at org.jboss.jca.adapters.jdbc.WrappedConnection.setAutoCommit(WrappedConnection.java:716)

 3) Using an XA datasource

An XA transaction, in the most general terms, is a "global transaction" that may span multiple resources. A non-XA transaction always involves just one resource.


1

<xa-datasource . . . .>

An XA transaction involves a coordinating transaction manager, with one or more databases (or other resources, like JMS) all involved in a single global transaction. Non-XA transactions have no transaction coordinator, and a single resource is doing all its transaction work itself.

The Transaction Manager coordinates all of this through a protocol called Two Phase Commit (2PC). This protocol also has to be supported by the individual resources.

In terms of datasources, an XA datasource is a data source that can participate in an XA global transaction. A non-XA datasource can‘t participate in a global transaction

时间: 2024-08-25 11:55:19

wildfly jobss 同时连接多个数据源的相关文章

JDBC连接池(数据源)

自定义连接池:用装饰设计模式将原连接的close方法改造成将连接还回数据源:装饰设计模式:http://www.cnblogs.com/tongxuping/p/6832518.html: 开源数据库连接池: C3P0连接池: 基本步骤: 1.导入开发包           2.创建数据库连接池         ComboPooledDataSource cpds = new ComboPooledDataSource();           3.配置基本的连接信息              

BIEE 连接SQLServer业务数据源(Linux环境)

biee11g默认安装了mssqlserver的数据驱动,不需要在服务器端进行重新安装,配置过程主要基于ODBC实现,本文主要介绍客户端为windows服务端为linux系统的配置过程. 1.客户端 在客户端首先配置odbc数据源,可以直接在运行中输入odbcad32,打开配置界面--系统DNS---添加 选择SQLserver的相关驱动,一般选择wire protocol型的驱动,配置sqlserver数据库连接信息,测试一下是否连接成功,并保存退出. 注意此时的ODBC数据源名称要记录下来,

Tomcat 【中配置连接池和数据源】

四.Tomcat 中配置连接池和数据源   1.DataSource接口介绍   (1)DataSource 概述 JDBC1.0原来是用DriverManager类来产生一个对数据源的连接.JDBC2.0用一种替代的方法,使用DataSource的实现,代码变的更小巧精致,也更容易控制. 一个DataSource对象代表了一个真正的数据源.根据DataSource的实现方法,数据源既可以是从关系数据库,也电子表格,还可以是一个表格形式的文件.当一个DataSource对象注册到名字服务中(JN

Netbeans 中创建数据连接池和数据源步骤

1.启动glassfish服务器, 在浏览器的地址栏中输入 http://localhost:4848 2.首先建立JDBC Connection Pools: 3.new 一个Connectio Pools 4.对General Settings属性填写: 5.填写Datasource Classname:com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource Ping属性选中,可以用来检验数据连接池是否创建成功! . 6.对Ad

jdbc基础 (五) 连接池与数据源 DBCP以及C3P0的使用

一.连接池的概念和使用 在实际应用开发中,特别是在WEB应用系统中,如果JSP.Servlet或EJB使用JDBC直接访问数据库中的数据,每一次数据访问请求都必须经历建立数据库连接.打开数据库.存取数据和关闭数据库连接等步骤,而连接并打开数据库是一件既消耗资源又费时的工作,如果频繁发生这种数据库操作,系统的性能必然会急剧下降,甚至会导致系统崩溃.数据库连接池技术是解决这个问题最常用的方法. 数据库连接池的主要操作如下: (1)建立数据库连接池对象. (2)按照事先指定的参数创建初始数量的数据库连

在Tomcat中配置连接池和数据源

1.DataSource接口介绍 (1)DataSource 概述 JDBC1.0原来是用DriverManager类来产生一个对数据源的连接.JDBC2.0用一种替代的方法,使用DataSource的实现,代码变的更小巧精致,也更容易控制. 一个DataSource对象代表了一个真正的数据源.根据DataSource的实现方法,数据源既可以是从关系数据库,也电子表格,还可以是一个表格形式的文件.当一个DataSource对象注册到名字服务中(JNDI),应用程序就可以通过名字服务获得DataS

连接池、数据源、JNDI三者间的关系及用法

连接池:连接池是由容器(比如Tomcat)提供的,用来管理池中的连接对象.连接池自动分配连接对象并对闲置的连接进行回收.连接池中的连接对象是由数据源(DataSource)创建的.连接池(Connection Pool)用来管理连接(Connection)对象. 数据源:数据源(DataSource)用来连接数据库,创建连接(Connection)对象. java.sql.DataSource接口负责建立与数据库的连接 由Tomcat提供,将连接保存在连接池中. JNDI(Java Naming

javaweb高级 第六章 连接池与数据源

1.本章目标 了解连接池 掌握JNDI.DBCP链接池的使用 2.连接池 理解为一个带有多个连接的池子 比如: 连接池最小连接数:10,也就是该连接池初始化时有10个可用的连接 连接池有最大连接数:100,表示该连接池最大上限100个连接 当有请求连接数据库时,先判断10个连接是否有空闲. 若有,就直接分配一个链接. 若没有(10不够)就在小于最大连接数的前提下打开一个新的连接 若已经有100个连接都在使用,后面的请求会等待前面使用完成后释放连接,在使用 3.JDNI java naming a

springboot jdbc连接多个数据源

源码 依赖 注:github中源码依赖是精简后的结果. <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- spring's support of jdbc --> <depend