请教tomcat的datasource的工作原理

时间:2021-03-24 21:51:10
tomcat自己有一个管理连接的机制,我不知道他是怎么管理的,也因为这样我就不知道在程序里怎么用DataSource的对象,tomcat会自己管理链接吗,无论我初始化多少个DataSource对象,他都会统一管理建立一个singlton对象,which管理同数据库的链接,当服务器初始化service,tomcat会创立这个singlton对象,当关闭service,tomcat会回收链接管理对象?

7 个解决方案

#1


没人理会?

#2


首先你要了解一下JNDI,因为tomcat的datasource服务是通过JNDI来外提供的。
tomcat会自动维护一个Connection对象池,你只需要取得或关闭Connection即可。

一般的使用流程:
1,为Tomcat配置datasource
2,将tomcat的datasource映射到webapp
  (或者直接为webapp配置datasource)
3,通过JNDI查找datasource取回datasource实例
4,通过datasource实例取得Connection对象
5,JDBC操作
6,关闭Connection对象

#3


javax.naming.Context ctx = 
    (Context) new InitialContext().lookup( "java:/comp/env" );

DataSource ds = null;
Connection conn = null;

ds = (DataSource)ctx.lookup( "Your_Datasource_name" );
conn = ds.getConnection();

//and some Exception handle coding

#4


学习下

#5


如wingtrace所说的流程,到底它是应该发生在同一个项目中的每个需要使用数据库的servlet的每个生存周期一次,还是要这个项目使用spring框架来创建维护一个统一的datasource对象,每次项目加载就连到数据库,项目停止再关闭数据库,整个过程只有travel这个流程一次?

case:
项目AApp有不同子服务servlet a, b, c;他们都要访问数据库
如果abc分别在起内部声明datasource对象,初始化servlet的时候初始化数据库链接,销毁servlet的时候关闭数据库连接,那么是不是整个AApp将有三个datasource链接,那么tomcat是同一将这三个链接同时放入pool里面并加以管理对吗?
可不可以这个AApp的生存周期中只维护一个datasource对象呢?

#6


1, “初始化servlet的时候初始化数据库链接,销毁servlet的时候关闭数据库连接”
这不像是一种合理的做法。推荐的做法是“尽可能晚地占用资源,尽可能早地释放资源”
在需要正式访问数据库的前一刻取得Connection实例,访问完马上Close。

2, Datasource和Connection是两个概念,不要混为一谈。
一般来说Datasource的实例只有一个,生命周期由容器维护,通过JNDI取得。
Connection对象可以有多个,生命周期由容器维护(通过Datasource),
但也可以自行编码维护(不使用Datasource)。

一时之间恐怕不能理解太多,如果只是想知道怎么写代码,
先看看别人的代码怎么写的就可以了,以后在实践中慢慢领悟。

#7


可能为了弄清楚这个问题,你需要先学习以下两个基础知识:
·JNDI
·连接池

#1


没人理会?

#2


首先你要了解一下JNDI,因为tomcat的datasource服务是通过JNDI来外提供的。
tomcat会自动维护一个Connection对象池,你只需要取得或关闭Connection即可。

一般的使用流程:
1,为Tomcat配置datasource
2,将tomcat的datasource映射到webapp
  (或者直接为webapp配置datasource)
3,通过JNDI查找datasource取回datasource实例
4,通过datasource实例取得Connection对象
5,JDBC操作
6,关闭Connection对象

#3


javax.naming.Context ctx = 
    (Context) new InitialContext().lookup( "java:/comp/env" );

DataSource ds = null;
Connection conn = null;

ds = (DataSource)ctx.lookup( "Your_Datasource_name" );
conn = ds.getConnection();

//and some Exception handle coding

#4


学习下

#5


如wingtrace所说的流程,到底它是应该发生在同一个项目中的每个需要使用数据库的servlet的每个生存周期一次,还是要这个项目使用spring框架来创建维护一个统一的datasource对象,每次项目加载就连到数据库,项目停止再关闭数据库,整个过程只有travel这个流程一次?

case:
项目AApp有不同子服务servlet a, b, c;他们都要访问数据库
如果abc分别在起内部声明datasource对象,初始化servlet的时候初始化数据库链接,销毁servlet的时候关闭数据库连接,那么是不是整个AApp将有三个datasource链接,那么tomcat是同一将这三个链接同时放入pool里面并加以管理对吗?
可不可以这个AApp的生存周期中只维护一个datasource对象呢?

#6


1, “初始化servlet的时候初始化数据库链接,销毁servlet的时候关闭数据库连接”
这不像是一种合理的做法。推荐的做法是“尽可能晚地占用资源,尽可能早地释放资源”
在需要正式访问数据库的前一刻取得Connection实例,访问完马上Close。

2, Datasource和Connection是两个概念,不要混为一谈。
一般来说Datasource的实例只有一个,生命周期由容器维护,通过JNDI取得。
Connection对象可以有多个,生命周期由容器维护(通过Datasource),
但也可以自行编码维护(不使用Datasource)。

一时之间恐怕不能理解太多,如果只是想知道怎么写代码,
先看看别人的代码怎么写的就可以了,以后在实践中慢慢领悟。

#7


可能为了弄清楚这个问题,你需要先学习以下两个基础知识:
·JNDI
·连接池