使用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容器了呀,数据库连接随便你获取和关闭)
(完)
- 使用Tomcat实现Java连接池(解决main中不能够调用问题)
- selenium中解决不能够转换脚本
- TOMCAT 4.1 中使用自定义标签不能正常调用release()方法的解决
- javadoc 使用中解决不能编码问题
- 解决Myeclipse中不能同时启动两个tomcat的问题
- 【总结】关于tomcat+6.0中使用连接池的问题
- Linux下操作mysql的常用语句,以及解决在putty中不能够输入中文的问题
- sql server 中,解决不能够重新对已有的表结构进行更改设置的问题
- VMware中解决ubuntu不能连接网络问题
- VMware中解决ubuntu不能连接网络问题
- VMware中解决Ubuntu不能连接网络问题
- VMware中解决ubuntu不能连接网络问题---NAT模式
- 从JDK 1.7开始,java程序员不能够调用JDK系统包中以sun开头引入的类
- 从JDK 1.7开始,java程序员不能够调用JDK系统包中以sun开头的类
- ASP.NET中引用JS不能调用JQuery问题 解决
- tomcat中使用连接池
- java调用svnkit连接svn出现Exception in thread "main"怎么解决
- 解决phone suite不能连接手机(连接中断)问题
- PageRank算法 到 textRank
- 【考研】第十四周总结
- 在notebook中使用pyspark遇到的问题
- 有趣的理解面向对象之封装!
- 史上最简单的 MySQL 教程(四十)「数据库变量」
- 使用Tomcat实现Java连接池(解决main中不能够调用问题)
- TCP三次握手&四次分手抓包分析
- JS的闭包
- 点击RecyclerView的条目跳转
- 后缀数组
- angular简单密码判断
- Java中的多线程你只要看这一篇就够了(转载)
- Jmeter断言
- ubuntu 16.04 下安装PCL