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