首页 > 代码库 > Android新项目GBSS:第3篇 Tomcat连接数据库[天坑,耗了1天才过关]

Android新项目GBSS:第3篇 Tomcat连接数据库[天坑,耗了1天才过关]

搭建好了开发环境,设计好了数据库,接下来该连接数据库了,这一块细节也基本上忘光,只能求助于Google了,大天朝最近围墙建的越来越高,Google基本处于不可用状态,SBBD又只能用来搜广告,谁能拯救我等屌丝码农。

 

步骤1:将mysql-connector-java-5.1.34-bin.jar复制到$CATALINA_HOME/lib文件夹下。下表列出了MySQL JDBC官方驱动和MySQL Server的版本对应关系[突然发现:有时候上QQ只是为了截图]

技术分享

步骤2:配置JNDI数据源和连接池,才发现JNDI是个好东西,非常适用于外部资源引用。

数据源和连接池都在<Resource>标签里定义,区别只是两者各自有不同的属性。

在$CATALINA_HOME/conf/context.xml的<Context>标签内部添加<Resource>标签,具体内容如下:

<context>...<Resource name="jdbc/GBSS" auth="Container"                type="javax.sql.DataSource"                factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"                maxActive="-1" maxIdle="-1" maxWait="10000"                fairQueue="true"                username="XXXXXX" password="XXXXXX"                driverClassName="com.mysql.jdbc.Driver"                url="jdbc:mysql://localhost:3306/GBSS"              /></context>

基本上是和Tomcat6配置是一样的,唯一区别是factory需设置为"org.apache.tomcat.jdbc.pool.DataSourceFactory",表示启用Tomcat7的连接池

其中fairQueue="true"表示允许异步获取连接,这是Tomcat7数据库连接池的新特性,关于Tomcat7 jdbc pool的详细描述,我在另一篇日志中翻译了官方文档。

异步获取连接是Tomcat7新连接池的一大亮点,具体用法如下:

Tomcat7 JDBC connection pool支持异步获取连接,且无需额外增加线程。它通过对数据源添加Future<Connection> getConnectionAsync()方法实现。要想使用这一新特性,首先需满足两个前提条件:

1.必须设置fairQueue="true",就像上面的代码那样

2.必须将数据源对象类型转换为"org.apache.tomcat.jdbc.pool.DataSource"类型

其中Future<Connection>泛型属于java.util.concurrent包

DataSource需要导入org.apache.tomcat.jdbc.pool.DataSource,而不是通常用的javax.sql.DataSource。

典型用例如下所示[JSP]:

<%@ page language="java" pageEncoding="gbk"%><%@page import="java.sql.Connection"%><%@page import="javax.naming.Context"%><%@page import="javax.naming.InitialContext"%><%-- <%@page import="javax.sql.DataSource"%> --%><%@page import="org.apache.tomcat.jdbc.pool.DataSource" %><%@page import="java.util.concurrent.*" %><%@page import="java.sql.Statement"%><%@page import="java.sql.ResultSet"%><%   //连接池的获取    Connection conn = null;    DataSource ds = null;    ResultSet rs  =null;    Statement stmt = null;    Context initCtx = new InitialContext();    ds =(DataSource)initCtx.lookup("java:comp/env/jdbc/GBSS");       if(ds!=null){        out.println("已经获得DataSource!");        out.println("<br>");        Future<Connection> future = ds.getConnectionAsync();        while(!future.isDone()){            out.println("Conncetion is not yet available. Do some background work");        }        try{            Thread.sleep(100);        }catch(InterruptedException x){            Thread.currentThread().interrupt();        }        conn = future.get();        out.println("异步获取连接成功");       try{        stmt = conn.createStatement();        String sql ="select * from user";        rs = stmt.executeQuery(sql);        out.println("以下是从数据库中读取出来的数据:<br>");            while(rs.next()){                out.println("<br>");                out.println(rs.getString("User_Name"));            }       }catch(Exception ex){         ex.printStackTrace();       }finally{          conn.close();          rs.close();          stmt.close();       }   }%>

 

步骤3:将数据源绑定到特定应用中,进入自己的web应用文件夹,在WEB-INF/web.xml的<web-app>标签内添加<resource-ref>标签,具体内容如下:

<?xml version=‘1.0‘ encoding=‘utf-8‘?><web-app>  <resource-ref>      <description>DB Connection</description>      <res-ref-name>jdbc/GBSS</res-ref-name>      <res-type>javax.sql.DataSource</res-type>      <res-auth>Container</res-auth>  </resource-ref></web-app>

最重要的就是这句<res-ref-name>jdbc/GBSS</res-ref-name>。

 

至此,关于Tomcat连接数据库的配置工作全部完成,测试代码就用上面讲述异步获取连接的代码就行。

------------------------------------------------------------------------------------------------------------------------

下面,来重点说说使用Eclipse开发web项目,部署到Tomcat,进行数据库连接的各种天坑。

 

纯净版的Eclipse开发Dynamic Web Project十分的不方便,大家有目共睹,但是我实在喜欢免费和开源,实在不喜欢用破解版又极其笨重的MyEclipse,只能硬着头皮找一个俱佳的解决方案,所以遇到了各种天坑,还好,最终都解决了。

 

第1步:在Eclipse里面新建Server,这很简单,window-preferences-Server里面Add一个Tomcat即可,指向自己的Tomcat安装地址。

第2步:新建Dynamic Web Project,runtime基于刚才新建的server,允许生成web.xml文件,项目建立完成。

第3步:重要一步,Eclipse运行web项目,Run on server不是直接将web项目部署到tomcat的webapps下面,而是放在了"$EclipseWorkspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps"这么一个奇怪的文件夹里面,Eclipse之所以这么做,是为了创建一个tomcat实例来进行部署,这样可以不侵犯tomcat的conf文件夹内容,它想着反正还有export to war功能,开发者们开发完成将war包手工挪到$CATALINA_HOME/webapps里面不也可以。但是这样的做法带来的后果就是:a.必须每次打开Eclipse才能运行项目。b.我们习惯了修改tomcat的conf文件夹下的server.xml和context.xml,但总是发现不起作用,本人这一天来就深受其困扰。

解决方法:打开Servers窗口,如果看不到服务器,就基于第1步新建的服务器Add一个,此时项目导航窗口会多一个Servers,这个很有用,双击Servers窗口里面的服务器,在弹出的窗口中修改ServerLocation,如下图:

技术分享

默认在第一个选项,勾选为第2个,并且配置相关路径,Deploy path选webapps,可以看到Eclipse会takes control of Tomcat installation。如果这块窗口是灰色不能修改,是因为服务器里面有部署的项目,remove掉,然后clean服务器,不行就再新建一个服务器。

配置好后,再次Run on server,Eclipse就会将项目部署到$CATALINA_HOME/webapps中,上面的2个问题可以得到圆满解决。

第4步:解决了2个问题,又会迎来新的问题。以上做完后,部署项目以后,会导致原有的$CATALINA_HOME/conf文件夹变成backup文件夹,Eclipse新建了一个conf文件夹,而且如果你被坑过,你就知道:无论怎么修改conf文件夹里面的文件,下次项目部署以后里面的内容并没有发生变化。

解决方案:那句takes control of Tomcat installation提示已经解释了一切,Eclipse将原有的conf改名为backup,新建一个conf,里面的文件内容来自于Eclipse维护的tomcat实例。所以想修改这个conf文件夹内容,直接修改时徒劳的,需要用到Eclipse项目导航窗口自动生成的Servers项目,修改相应的tomcat实例的config,如下图:

技术分享

想修改什么,就点开相应的文件修改,包括上文提到的配置数据源,连接池需要修改的context.xml文件,都是在这里面修改。然后,部署项目,就会发现$CATALINA_HOME/conf里面的内容自动更新了,修改也能够产生效果。

 

至此,Tomcat连接数据库,设置数据源,配置数据库连接池,使用Eclipse方便的部署项目都一一得到解决。

Android新项目GBSS:第3篇 Tomcat连接数据库[天坑,耗了1天才过关]