使用Tomcat实现Java连接池(解决main中不能够调用问题)

来源:互联网 发布:javascript 输入 赋值 编辑:程序博客网 时间:2024/06/05 17:22

前言:

之前自己写过一个关于连接池的文章,并且自己简单实现了一个连接池。虽然现在使用最多的是阿里提供的连接池,但是自己因为一些原因接触了这个Tomcat。这次折腾了大概1个半小时,解决了这个问题,这里好好分享一下

连接池介绍和简单实现

http://blog.csdn.net/m0_37568521/article/details/78598766

使用Tomcat的连接池

关于连接池的配置,我们可以进行全局配置,也可以进行局部配置。对于全局配置,只需要配置一次,在其他使用使用的时候只需要在该项目下面的web.xml指明数据源名称即可

全局配置

1.在服务器下面的conf文件下的context.xml中输入下面代码

<?xml version='1.0' encoding='utf-8'?><Context>    <WatchedResource>WEB-INF/web.xml</WatchedResource>    <Resource name="jdbc/mysqlds"  //连接池资源名称        //容器负责资源的连接        auth="Container"         // 容器名称对应的类型        type="javax.sql.DataSource"         //数据库账号        username="root"         //数据库密码        password="root"         //最小连接数        maxIdle="30"         //最长等待时间        maxWait="10000"         //最大连接数        maxActive="100"        // 数据库驱动程序(不同的包可能不一样)        driverClassName="org.gjt.mm.mysql.Driver"        //数据库名称(这里的web是数据库名称,3306是端口号)        url="jdbc:mysql://localhost:3306/web" /></Context>

2.在需要使用连接池的项目中指明连接池名称(在项目下面的web.xml写入下面代码)

<resource-ref>    <description>DB Pool</description>    <!-- 连接池名称也需要和context.xml一样 -->    <res-ref-name>jdbc/mysqlds</res-ref-name>    <!-- 容器类型需要和context.xml文件一样 -->    <res-type>javax.sql.DataSource</res-type>    <res-auth>Container</res-auth></resource-ref>

3.测试是否配置成功
建立一个web数据库,并且建立一个test表,如下

create database web;create table test(    userid int not null primary key,    username varchar(20) not null);--插入模拟数据insert into test(username) values('xiaoD');

在项目中的index.jsp中写入下面代码

<%@ page language="java"  pageEncoding="UTF-8" contentType="text/html; charset=UTF-8"%>     <%@ page import="java.sql.*" %><%@ page import="javax.naming.*" %>     <%@ page import="javax.sql.DataSource" %><html>     <head>     <title>welcome</title>    </head>        <body>    <%             try {                  //初始化            Context ctx = new InitialContext();            //取得数据连接池            DataSource ds = (DataSource)ctx.lookup("java:/comp/env/jdbc/mysqlds");            //从数据连接池获取连接            Connection conn = ds.getConnection();            String sql = "select * from test";            Statement stmt = conn.createStatement();            ResultSet rs = stmt.executeQuery(sql);            while(rs.next()) {                out.print(rs.getInt(1)+"----"+rs.getString(2));            }            //关闭数据库连接池            conn.close();        } catch (Exception e) {                out.println("fail");        }       %>    </body>     </html>   

运行即可在网页上看到

0----xiaoD

局部配置

全局配置和局部配置只有一个地方不同,那就是我们进行局部配置的时候,本来应该服务器下面的context.xml的代码,我们写在当前项目下面的context.xml下面(代码一样,如果当前项目没有context.xml,在WebRoot/META-INF/ 下面建立一个即可)

main中不能够调用问题

如果只是为了写上面的内容,那么我认为这个博客没有意义的,上面的文章在网上不少于50篇。我这里想要说明另外一个问题,我们一般测试的时候会在Java类中的main方法中测试。但是我们如果测试连接池仍然这样测试的话,则会出现下面的错误

Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file:  java.naming.factory.initial    at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:662)    at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:307)    at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:344)    at javax.naming.InitialContext.lookup(InitialContext.java:411)

出现这个错误的原因主要是默认只能够在web容器中才能够获得连接(经过其他配置也可以在类中获得连接,这里不做介绍,因为没必要)。我们直接在main方法中调用,并没有启动web容器,所以这时候就会出错。那么问题就来了,我们在进行DAO操作的时候(如果不是很清楚DAO操作,可以看我另外的一篇文章DAO设计模式的介绍与实现),需要在类中获得数据库的连接啊,这个怎么办呢?
很简单,既然需要在web容器中才能够获得连接,我们就启动web容器啊。如何启动呢,就是通过我们网页向servlet或者jsp发送请求,就可以启动web容器(关于容器不太清除的可以看看 各种容器与服务器的区别与联系:Servlet容器 WEB容器 Java EE容器 应用服务器 WEB服务器 Java EE服务器)。
换句话说,我们其实不用做额外的处理就可以在DAO中使用连接池,具体步骤如下
1. 页面向jsp或者servlet发出请求,系统启动web容器
2. 在servlet不管是通过实例化数据库连接类还是直接获得连接,都可以成功(因为我们已经启动web容器了呀,数据库连接随便你获取和关闭)

(完)

阅读全文
0 0
原创粉丝点击