SpringはTomcatとJndiを組み合わせて、データソースの外部構成を実現します

SpringはTomcatとJndiを組み合わせて、データソースの外部構成を実現します

jndiの公式説明

jndiとは

JNDI(Javaネーミングおよびディレクトリインターフェイス、Javaネーミングおよびディレクトリインターフェイス)は、SUNが提供する標準のJavaネーミングシステムインターフェイスです。JNDIは、さまざまなアクセスプロバイダーインターフェイスを介して統合クライアントAPIを提供します。JNDIサービスサプライインターフェイス(SPI)の実現では、マネージャはJNDI APIを特定のネーミングサービスおよびディレクトリシステムにマップし、Javaアプリケーションがこれらのネーミングサービスおよびディレクトリサービスと対話できるようにします。ディレクトリサービスは、ネーミングサービスの自然な拡張です。2つの主な違いは、ディレクトリサービスのオブジェクトには名前と属性を含めることができますが(たとえば、ユーザーには電子メールアドレスがあります)、ネーミングサービスのオブジェクトには属性がありません。

jndiを使用してコンテキストを作成する方法

JNDI APIは、オブジェクトの検索場所を指定するコンテキストを定義します。通常、初期コンテキストが開始点として使用されます。最も単純なケースでは、初期コンテキストは、特定の実装と、実装に必要な追加のパラメーターを使用して作成する必要があります。最初のコンテキストは、名前を検索するために使用されます。初期コンテキストは、ファイルシステムのディレクトリツリーのルートまたはトップに似ています。

実施計画1

var contextArgs = new Hashtable<String, String>();

// 设置参数,不同的服务提供商有不同的实现
contextArgs.put( Context.INITIAL_CONTEXT_FACTORY, "com.jndiprovider.TheirContextFactory" );

// 设置url明确数据存储位置
contextArgs.put( Context.PROVIDER_URL, "jndiprovider-database" );

// 此处可以实现安全校验 等

// 创建context
Context myCurrentContext = new InitialContext(contextArgs);
// 在上行下文昭寻找对应的beanName
MyBean myBean = (MyBean)  myCurrentContext.lookup("com.mydomain.MyBean");

実施計画2

// 还可以通过添加 jndi 来配置上下文对象。类路径中包含初始上下文工厂类名和提供程序 URL 的属性文件
// 仅需要创建上下文context,将会去类路径下读取配置文件 
Context myCurrentContext = new InitialContext();
// 从上下文中寻找初始化完成的bean信息
MyBean myBean = (MyBean)  myCurrentContext.lookup("com.mydomain.MyBean");

Springはtomcatを組み合わせてjndiインジェクションを実現します

jndiリソースデータソースを構成する

apache-tomcat-8.0.38\conf\context.xml設定

<Resource name="jdbc/sxsDB"       
	 auth="Container"
	 type="javax.sql.DataSource"
	 driverClassName="com.mysql.jdbc.Driver"
	 url="jdbc:mysql://localhost:3306/testdb"    
	 username="root"
	 password="123456"
	 maxIdle="40"
	 maxWait="4000"
	 maxActive="250"
	 removeAbandoned="true" 
	 removeAbandonedTimeout="180"
	 logAbandoned="true"/>

maven関連の依存関係を構成する

    <!-- mybatis -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis-spring</artifactId>
        <version>1.3.0</version>
    </dependency>
    
    <!--Spring java数据库访问包,在本例中主要用于提供数据源 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <!--mysql数据库驱动 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.38</version>
    </dependency>
    <!-- mybatis ORM框架 -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.4.1</version>
    </dependency>
    
    <!-- fastjson -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.30</version>
    </dependency>
    <!-- druid -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.1.6</version>
    </dependency>

データベース接続を構成する

@Configuration
@MapperScan("com.sxs.web.mapper")
public class MybatisConfiguration {
    
    
    @Bean
    public DataSource dataSource() throws ClassNotFoundException, NamingException {
    
    
        // 方式一
//        Context initContext = new InitialContext();
//        Context envContext  = (Context)initContext.lookup("java:/comp/env");
//        DataSource dataSource = (DataSource)envContext.lookup("jdbc/sxsDB");

        // 方式二
        JndiObjectFactoryBean factoryBean = new JndiObjectFactoryBean();
        JndiTemplate jndiTemplate = factoryBean.getJndiTemplate();
        DataSource dataSource = jndiTemplate.lookup("java:/comp/env/jdbc/sxsDB", DataSource.class);
        return dataSource;
    }

    @Bean
    public SqlSessionFactory sqlSessionFactory() throws Exception {
    
    
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource());
        sqlSessionFactoryBean.setTypeAliasesPackage("com.sxs.web.model");
        //   "classpath*:sqlmap/*-mapper.xml"
        sqlSessionFactoryBean.setMapperLocations(new Resource[]{
    
    });
        return sqlSessionFactoryBean.getObject();
    }

    @Bean
    public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
    
    
        return new SqlSessionTemplate(sqlSessionFactory);
    }

}

マッピングエンティティを構成します

public class Course implements Serializable {
    
    

    private static final long serialVersionUID = 1848918888438459623L;
    private String course_name;
    private String stu_name;
    private double score;
    private String currentThreadName;

    @Override
    public String toString() {
    
    
        return "Course{" +
                "course_name='" + course_name + '\'' +
                ", stu_name='" + stu_name + '\'' +
                ", score=" + score +
                ", currentThreadName='" + currentThreadName + '\'' +
                '}';
    }

    public String getCourse_name() {
    
    
        return course_name;
    }

    public void setCourse_name(String course_name) {
    
    
        this.course_name = course_name;
    }

    public String getStu_name() {
    
    
        return stu_name;
    }

    public void setStu_name(String stu_name) {
    
    
        this.stu_name = stu_name;
    }

    public double getScore() {
    
    
        return score;
    }

    public void setScore(double score) {
    
    
        this.score = score;
    }

    public String getCurrentThreadName() {
    
    
        return currentThreadName;
    }

    public void setCurrentThreadName(String currentThreadName) {
    
    
        this.currentThreadName = currentThreadName;
    }
}

マッパーマッピングを構成する

@Mapper
@Repository
public interface CourseMapper {
    
    

    @Select("select * from tb_score limit 2 offset 1")
    Collection<Course> findAllCourses();

    @Select("select * from tb_score limit 1 offset 1")
    Course findSingleCourse();
}

コントローラを構成します

@RestController
public class CourseController {
    
    

    @Autowired
    private CourseMapper courseMapper;

    @GetMapping("/find-all-courses")
    public Collection<Course> findAllCourses(){
    
    

        Collection<Course> courses1 = courseMapper.findAllCourses();

        for (Course course : courses1){
    
    
            course.setCurrentThreadName(Thread.currentThread().getName());
        }
        return courses1;
    }

    @GetMapping("/find-single-course")
    public String findSingleCourse(){
    
    
        Course course = courseMapper.findSingleCourse();
        course.setCurrentThreadName(Thread.currentThread().getName());
        return JSON.toJSONString(course);
    }
}

SQLスクリプトを追加する

-- 查询所有的数据库
show databases;
-- 使用testdb
use testdb;
-- 查询testdb所有的表
show tables ;
-- 建表前清除
drop table tb_score;
-- 建表语句
create table tb_score(
  id bigint primary key auto_increment,
  course_name varchar(20),
  stu_name varchar(20),
  score double
);
-- 插入数据
insert into tb_score (course_name, stu_name, score) values ('高数','尚先生',100.00);
insert into tb_score (course_name, stu_name, score) values ('英语','尚先生',80.00);
insert into tb_score (course_name, stu_name, score) values ('英语','尚小菲',100.00);
insert into tb_score (course_name, stu_name, score) values ('高数','尚小菲',90.00);
-- 查询入库数据
select *
from tb_score;

より優れた記事

javaの小学生
https://blog.csdn.net/shang_xs

その他のTomcat関連
https://blog.csdn.net/shang_xs/article/details/90610242Spring
はJbossとJndiを組み合わせて、データソースの外部構成を実装します

サーブレットの詳細な研究と理解(1)
https://blog.csdn.net/shang_xs/article/details/90371068のIn
サーブレットの深さ研究と理解(2)
https://blog.csdn.net/shang_xs/article/details/90376489

完全なコードと関連する依存関係については、GitHubを参照してください。

https://github.com/dwyanewede/spring-boot/tree/master/spring-webmvc/src/main

公式アカウントの推奨

ここに写真の説明を挿入

おすすめ

転載: blog.csdn.net/shang_xs/article/details/90599810