QQ拼音生成的时间 2012年7月24日 23:59:11
今天算是比较顺利赶在明天来临,解决了Web开发中Tomcat连接池配置的问题。
网上关于连接池配置的文章千篇一律,而且大多数都是将Tomcat的帮助文档晦涩的翻译了一下就草草了事,很多代码中包含有中文字符,空格,格式不完整,注释添加错误位置。不知道写文章的人,究竟为何为文,以后即便自己用到也会出问题。
还有很多问题,既然配置Tomcat,就因该标注配置的Tomcat是那一个版本,配置的信息添加在什么地方,什么位置都应该一一说清楚。
自己动手亲自配置了一下。这里是基于Tomcat目录下的配置,属于全局的数据库连接池的配置。
1. 在Tomcat1.6.x的按照目录下的conf文件夹下打开server.xml文件
配置*.xml文件不管配置信息是否正确,必须书写xml文件的格式一定要正确。
- <GlobalNamingResources>
- <!-- Editable user database that can also be used by
- UserDatabaseRealm to authenticate users
- -->
- <Resource name="UserDatabase" auth="Container"
- type="org.apache.catalina.UserDatabase"
- description="User database that can be updated and saved"
- factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
- pathname="conf/tomcat-users.xml" />
- <Resource
- name="jdbc/poolmssql"
- auth="Container"
- type="javax.sql.DataSource"
- driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
- url="jdbc:sqlserver://localhost:5140;databaseName=ext"
- username="sa"
- password="shszfdbz"
- maxActive="100"
- maxIdle="30"
- maxWait="10000"
- />
- </GlobalNamingResources>
第二个Resource是配置数据源的信息
2.在在Tomcat1.6.x的按照目录下的conf文件夹下打开context.xml文件
在Context标签之间添加如下内容。
- <ResourceLink name="jdbc/poolmssql" global="jdbc/poolmssql" type="javax.sql.DataSource"/>
各种信息不解释,Tomcat帮助文档解释很清楚。
3.在当前的应用程序的WEB-INF目录下的web.xml文件中添加如下信息
- <description>Mircosoft SQLServer 2005</description>
- <resource-ref>
- <description>DB Connection</description>
- <res-ref-name>jdbc/poolmssql</res-ref-name>
- <res-type>javax.sql.DataSource</res-type>
- <res-auth>Container</res-auth>
- </resource-ref>
4.编写一个测试类
- public class PoolDB {
- public static Connection getConnection() {
- // 初始化查找命名空间
- Context initContext = null;
- // 找到 DataSource
- DataSource ds = null;
- Context envContext = null;
- Connection conn = null;
- PreparedStatement pstmt=null;
- ResultSet rs=null;
- try {
- initContext = new InitialContext();
- envContext = (Context) initContext.lookup("java:/comp/env");
- ds = (DataSource) envContext.lookup("jdbc/poolmssql");
- conn = ds.getConnection();
- System.out.println(conn);
- String sql="select * from Student";
- pstmt=conn.prepareStatement(sql);
- rs=pstmt.executeQuery();
- Student s=null;
- List list=new ArrayList();
- while(rs.next()){
- s=new Student();
- s.setSno(rs.getString("sno"));
- s.setAge(rs.getInt("age"));
- s.setSex(rs.getString("sex"));
- s.setManame(rs.getString("maname"));
- s.setNation(rs.getString("nation"));
- s.setSname(rs.getString("sname"));
- s.setPlace(rs.getString("place"));
- list.add(s);
- }
- for (Object st : list) {
- System.out.println(st.toString());
- }
- } catch (NamingException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (SQLException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- return conn;
- }
这是获得数据库连接的类,这里用到了一个实体类Student,属性可以看出,数据库中已经存在一张表Student并且存有数据。
接下来进行测试,在获得数据库连接的类PoolDB写上main方法:
- public static void main(String[] args) {
- System.out.println(PoolDB.getConnection());
- }
既然是在Tomcat下配置的数据库连接池那么就应该启动Tomcat;接下来运行应用程序,错误直接发生了。
public class InitialContext
此类是执行命名操作的初始上下文。
所有命名操作都相对于某一上下文。该初始上下文实现 Context 接口并提供解析名称的起始点
应为执行的是PoolDB类,并没有相对于上下文的操作所以抛出异常。
5.编写一个*.jsp文件
- <%
- Connection conn=PoolDB.getConnection();
- %>
使用到PoolDB类。
然后在通过浏览器来访问义页面,执行正常,查询到数据库表Student中的内容。
- jdbc:sqlserver://localhost:5140;selectMethod=direct;lastUpdateCount=true;databaseName=ext;, UserName=sa, Microsoft SQL Server 2005 JDBC Driver
- Student [age=21, maname=计算机科学与技术, nation=CHINA, place=西安, sex=男, sname=Aiilive, sno=200907010100]
- Student [age=22, maname=软件设计, nation=CHINA, place=西安, sex=男, sname=Secondriver, sno=200907010101]
- Student [age=19, maname=翰林儒学, nation=唐, place=兰若镇, sex=男, sname=宁采臣, sno=200907010102]
- Student [age=45, maname=擒妖科学与技术, nation=道山, place=兰若镇, sex=男, sname=燕赤霞, sno=200907010103]
- Student [age=27, maname=大唐时尚, nation=天庭, place=高老庄, sex=男, sname=猪八戒, sno=200907010104]
- Student [age=21, maname=自由文艺, nation=唐, place=兰若寺, sex=女, sname=聂小倩, sno=200907010105]
- Student [age=18, maname=塔与塔文化研究, nation=唐, place=西湖, sex=女, sname=白娘子, sno=200907010106]
- Student [age=21, maname=翰林儒学, nation=唐, place=长安, sex=男, sname=许仙, sno=200907010107]
6.接下来根据自己亲自在Tomcat1.6.x版本下的操作,去除掉在WEB-INF下的web.xml的配置信息,仍然可以获得第5条中查询的结果
7.如图可以看到真相。
眼睛一亮就可以看到,这里的sqljdbc2005.jar驱动包绝对不是很多网上的文章所说的那样放在Tomcat的common文件夹下,可惜Tomcat1.6.就只用lib文件。
如上图:itext-5.2.1.zip是通过引用的包,这里仅仅体现sqljdbc2005.jar绝对是放在Web工程的lib目录下面的。
8.在Tomcat安装目录的conf文件夹下的context.xml文件中的资源连接必须写
- <ResourceLink name="jdbc/poolmssql" global="jdbc/poolmssql" type="javax.sql.DataSource"/>
不然将会产生如下问题。
- javax.naming.NameNotFoundException: Name jdbc is not bound in this Context
- at org.apache.naming.NamingContext.lookup(NamingContext.java:770)
- at org.apache.naming.NamingContext.lookup(NamingContext.java:153)
- at xiao.zhang.dbc.PoolDB.getConnection(PoolDB.java:33)
- at org.apache.jsp.index_jsp._jspService(index_jsp.java:111)
错误信息提示很清楚所配置的数据库连接池没能子会话中找到。
9.还用一些给单独的工程配置,所要做的操作和添加的配置信息是相同的只是在不同的位置。
本文出自 “野马红尘” 博客,谢绝转载!