tomcat配置数据源及相关问题:
首先如何配置tomcat数据源(这里仅以tomcat 6.*版本为例)
1、找到\apache-tomcat-6.0.43\conf 目录下的context.xml文件 :
新安装后的该文件内容如下(其中的一些注释已经删掉):
-
<?xml version="1.0" encoding="UTF-8"?>
-
-
<Context>
-
-
<!-- Default set of monitored resources -->
-
<WatchedResource>WEB-INF/web.xml</WatchedResource>
-
</Context>
这里面的WatchedResource 标签是用来指定服务器的的监听资源的,也就是任何一个web项目都应该有的一个web.xml文件,当web前端在进行服务器请求时,服务器将通过该web.xml对后台资源的进行访问。
数据源配置:通过在Context标签内添加如下标签内容
-
<Resource name="jdbc/mysql" auth="Container" description="user database" driverClassName="com.mysql.jdbc.Driver" type="javax.sql.DataSource" url="jdbc:mysql://localhost:3306/demo" username="root" password="" maxIdle="4" maxWait="500" maxActive="10"/>
标签属性解析:
name 数据源的名称,是区别于其他数据源的ID ,当tomcat配置多个数据源时,此属性的值不能重复;
auth 表示Resource的manager,有两个备选值:Container,Application;顾名思义Container是表示容器内的资源,Application是表示应用的资源;(
对于这两个属性的区别,小编还没弄清楚,暂时先不解释了,等我弄清楚了再来修改)
driverClassName 表示数据库驱动
type 表示数据源类型
url 数据库地址
username 数据用户名 password 密码
maxIdle 连接池最大空闲连接
maxWait 最大等待请求
maxActive 最大连接数
这里小编想解释一下最后三个属性(
maxIdle ,maxWait, maxActive ),如果要想解释清楚这三个元素的含义就一定要明白连接池的工作原理和它的目的:在没有连接池之前,每次用户在操作数据库之前都需要与数据库进行交互来穿件数据库连接,这样就大大增加了交互时间,而且还需要用户自己来控制数据库连接的生命周期,就是在这种问题的驱动下连接池的应运而生。其工作原理是:通过连接池这一容器来预先建立一定数量的连接(也就是这里面的maxIdle的值),当用户请求连接数据库时就从连接池中获取一个数据库连接,当同时访问用户不断增加,所需要的数据库连接数超过了maxIdle时,连接池就会在之后的每个请求中新建数据库连接,但是为了缓解数据库的压力,不至于由于过多的数据库连接使得数据库崩溃,所以要设定一个最大可建立的数据库连接(maxActive),这样当用户申请数超过maxActive时,超过的部分就进入队列等待中直到有用户释放所占用的连接,maxWait就是用来设置最大等待数的。
2、当然上面操作仅仅是在tomcat服务器中来设置数据源,如果要想在自己的项目中调用该数据源则需要在项目的w
eb-INF/WEB.XML配置:
-
<resource-ref>
-
<res-ref-name>jdbc/mysql</res-ref-name>
-
<res-type>javax.sql.DataSource</res-type>
-
<res-auth>Container</res-auth>
-
</resource-ref>
通过上述代码来配置项目的数据源
3、做一个小的应用程序测试一下(切记一定要在web环境下,不可再后台应用程序main方法中调用):
-
try {
-
Context context = (Context)new InitialContext();
-
DataSource dataSource = (DataSource)context.lookup("java:comp/env/jdbc/mysql");
-
Connection conn = dataSource.getConnection();
-
Statement state = conn.createStatement();
-
state.execute("insert into user (username,password,email) value('111','111','ss')");
-
state.close();
-
conn.close();
-
} catch (NamingException e) {
-
// TODO Auto-generated catch block
-
e.printStackTrace();
-
} catch (SQLException e) {
-
// TODO Auto-generated catch block
-
e.printStackTrace();
-
}
因为如果不在web环境下调用的JVM与web环境下的jvm是不一样的(应用程序的jvm用的是eclipse所引用的jvm,而web环境下的jvm则是tomcat服务器中的jvm) ,这样导致的结果是Context实例中无法获取数据源。
阅读(3247) | 评论(0) | 转发(0) |