首页 > 代码库 > 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天才过关]