美文网首页
atomikos + jdbcTemplate + spring

atomikos + jdbcTemplate + spring

作者: 长孙俊明 | 来源:发表于2019-10-14 04:56 被阅读0次

准备两张表

-- db test 
CREATE TABLE t_user (
  id varchar(30) NOT NULL,
  user_name varchar(60) NOT NULL,
  PRIMARY KEY (id)
);

-- db logdb
CREATE TABLE t_log (
  id varchar(32) DEFAULT NULL,
  log varchar(20) DEFAULT NULL
);

映射表

import lombok.Data;
import java.io.Serializable;

@Data
public class Log implements Serializable {

    private static final long serialVersionUID = -5575893900970589345L;

    private String id;

    private String log;

    public Log() {
    }

    public Log(String id, String log) {
        super();
        this.id = id;
        this.log = log;
    }

}
import lombok.Data;

import java.io.Serializable;

@Data
public class User implements Serializable {

    private static final long serialVersionUID = -5575893900970589345L;

    private String id;

    private String userName;


}

DAO层

import com.frame.study.jta.entity.Log;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
@Component
public class LogDao {

    @Autowired
    @Qualifier("first")
    private JdbcTemplate jdbcTemplate;

    public void insert(Log log) {
        jdbcTemplate.update("insert t_log(id,log) values(?,?)", log.getId(), log.getLog());
    }

}
import java.sql.ResultSet;
import java.sql.SQLException;

import com.frame.study.jta.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.ResultSetExtractor;
import org.springframework.stereotype.Component;

@Component
public class UserDao {
    @Autowired
    @Qualifier("second")
    private JdbcTemplate jdbcTemplate;

    public void insert(User u) {
        jdbcTemplate.update("insert t_user(id,user_name) values(?,?)", u.getId(), u.getUserName());
    }

    public void update(User u) {
        jdbcTemplate.update("update t_user set user_name = ? where id= ?", u.getUserName(), u.getId());
    }

    public void delete(String id) {
        jdbcTemplate.update("delete from t_user where id= ?", id);
    }

    public User find(String id) {
        return jdbcTemplate.query("select id,user_name from t_user where id= ?", new Object[] { id },
                new ResultSetExtractor<User>() {

                    @Override
                    public User extractData(ResultSet rs) throws SQLException, DataAccessException {
                        if (rs.next()) {
                            User user = new User();
                            user.setId(rs.getString(1));
                            user.setUserName(rs.getString(2));
                            return user;
                        }
                        return null;
                    }

                });
    }

}

service层

import com.frame.study.jta.dao.LogDao;
import com.frame.study.jta.entity.Log;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class LogService {

    @Autowired
    private LogDao logDao;

    @Transactional
    // @Transactional(propagation = Propagation.REQUIRES_NEW)
    // @Transactional(propagation = Propagation.NESTED)
    public void insertLog(Log log) throws Exception {
        this.logDao.insert(log);
//      if(true) {
//          throw new RuntimeException("asdfasdffsadf");
//      }
    }

}
import com.frame.study.jta.dao.UserDao;
import com.frame.study.jta.entity.Log;
import com.frame.study.jta.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

@Service
public class UserService {

    @Autowired
    private UserDao userDao;

    @Autowired
    private LogService logService;

    @Transactional
    public User insertUser(User u) throws Exception {

        this.userDao.insert(u);

        Log log = new Log(System.currentTimeMillis() + "", u.getUserName());
        this.logService.insertLog(log);

        return this.userDao.find(u.getId());
    }

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void doAddUser(User u) {
        this.userDao.insert(u);
    }

    @Transactional()
    public User updateUser(User u) {
        this.userDao.update(u);
        return this.userDao.find(u.getId());
    }

    public User findById(String id) {
        System.err.println("根据id=" + id + "获取用户对象,从数据库中获取");
        return this.userDao.find(id);
    }

    public void deleteById(String id) {
        this.userDao.delete(id);
    }
}

controller层

import com.frame.study.jta.entity.User;
import com.frame.study.jta.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class JTAController {

    @Autowired
    private UserService userService;

    @GetMapping("/my/jtaTest")
    public void insert() {
        User user = new User();
        user.setId("1234569");
        user.setUserName("mike-666666666");
        try {
            userService.insertUser(user);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

配置层

import com.alibaba.druid.pool.xa.DruidXADataSource;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.jta.atomikos.AtomikosDataSourceBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.core.JdbcTemplate;

import javax.sql.DataSource;
import javax.sql.XADataSource;

@Configuration
public class MyDataSourceAutoConfiguration {
    @Primary
    @Bean(name = "dataSource1")
    public DataSource dataSource1() {
        AtomikosDataSourceBean ds = new AtomikosDataSourceBean();
        ds.setXaDataSource(xaDataSource1());
        return ds;
    }

    @Bean(name = "dataSource2")
    public DataSource dataSource2() {
        AtomikosDataSourceBean ds = new AtomikosDataSourceBean();
        ds.setXaDataSource(xaDataSource2());
        return ds;
    }

    XADataSource xaDataSource1() {
        DruidXADataSource xaDataSource = new DruidXADataSource();
        xaDataSource.setUrl("jdbc:mysql://192.168.0.10:3306/spring_test?useUnicode=true&characterEncoding=UTF8&useSSL=false");
        xaDataSource.setUsername("spring_test");
        xaDataSource.setPassword("java_test_@#.");
        return xaDataSource;
    }

    XADataSource xaDataSource2() {
        DruidXADataSource xaDataSource = new DruidXADataSource();
        xaDataSource.setUrl("jdbc:mysql://192.168.0.11:3306/spring_test?useUnicode=true&characterEncoding=UTF8&useSSL=false");
        xaDataSource.setUsername("spring_test");
        xaDataSource.setPassword("java_test_@#.");
        return xaDataSource;
    }

    @Bean("first")
    JdbcTemplate first(@Qualifier("dataSource1") DataSource dataSource) {
        JdbcTemplate jdbcTemplate = new JdbcTemplate();
        jdbcTemplate.setDataSource(dataSource);
        return jdbcTemplate;
    }

    @Bean("second")
    JdbcTemplate second(@Qualifier("dataSource2") DataSource dataSource) {
        JdbcTemplate jdbcTemplate = new JdbcTemplate();
        jdbcTemplate.setDataSource(dataSource);
        return jdbcTemplate;
    }

}

springboot启动

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class JtaApplication {

    public static void main(String[] args) {
        SpringApplication.run(JtaApplication.class, args);
    }

}

pom文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.7.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.frame.study</groupId>
    <artifactId>jta</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>jta</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jta-atomikos</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.10</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.44</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.6</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

application.properties

# 主数据源
mysql.datasource.one.url = jdbc:mysql://192.168.0.11:3306/spring_test?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull
mysql.datasource.one.username =spring_test
mysql.datasource.one.password =java_test_@#.
mysql.datasource.one.minPoolSize =3
mysql.datasource.one.maxPoolSize =25
mysql.datasource.one.maxLifetime =20000
mysql.datasource.one.borrowConnectionTimeout =30
mysql.datasource.one.loginTimeout =30
mysql.datasource.one.maintenanceInterval =60
mysql.datasource.one.maxIdleTime =60
mysql.datasource.one.testQuery =select 1
# 数据源 2
mysql.datasource.two.url =jdbc:mysql://192.168.0.12:3306/spring_test?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull
mysql.datasource.two.username =spring_test
mysql.datasource.two.password =java_test_@#.
mysql.datasource.two.minPoolSize =3
mysql.datasource.two.maxPoolSize =25
mysql.datasource.two.maxLifetime =20000
mysql.datasource.two.borrowConnectionTimeout =30
mysql.datasource.two.loginTimeout =30
mysql.datasource.two.maintenanceInterval =60
mysql.datasource.two.maxIdleTime =60
mysql.datasource.two.testQuery =select 1

相关文章

网友评论

      本文标题:atomikos + jdbcTemplate + spring

      本文链接:https://www.haomeiwen.com/subject/esioectx.html