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方便的部署项目都一一得到解决。

时间: 2024-10-24 18:55:37

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

从零开始的Android新项目1 - 架构搭建篇

记录一下新项目的搭建. 试想一下,如果没有历史负担,没有KPI压力,去新搭建一个项目,你会怎么设计和实现呢? 本系列文章不是教你怎么从0开始学Android,从0开始怎么建一个项目,而定位于零负担的情况下,在2016年怎么去创建一个好的Android项目,其中一部分技术并不太适合刚入门的初学者. Application specific 类似clean architecture,分为三层 presentation - data - domain. 关于Clean Architecture由于国内

Android新项目:第2篇 数据库设计

今晚设计了一晚上的数据库,用了一下MyEclipse workbench,感觉小屏幕电脑用的太不爽了,一堆的窗口挤在一起. 整理一下遇到的零碎的东西: 字段约束: PK:belongs to primary key:主键 NN:not null:不能为空 UQ:unique index:唯一 BIN:is binary column:此列为二进制数据 UN:unsigned data type:无符号数据类型 ZF:fill up values for that column with 0's

从零开始的Android新项目11 - 组件化实践(1)

最近更新不太频繁,一方面工作上比较忙,除了 Android 也在负责前端,另外周末和深夜也在帮人做 Go 后台.设计技术方案.管进度的事情(因为报酬不错没忍心拒绝,而且确实对个人成长还有帮助),所以实在对不住. 另外,文章最底下有捐款啊,最近真是都没钱吃饭了... 前言 这里的组件化,指的是 MDCC 2016 上冯森林提出的<回归初心,从容器化到组件化>. 我个人一直是比较反感黑科技的,其中首当其冲的就是 插件化 以及 保活.作为一个开发者,除了研究技术,提高自己以外,是否应该考虑些其他东西

从零开始的Android新项目10 - React Native &amp; Redux

本篇来讲讲 React Native 和 Redux,和其他一上来就啪啪啪丢上来一堆翻译的东西不同,本文会从简单的例子入手,让大家能快速地明白 React Native 是什么,Redux 和常见的 MVC.MVP 等有什么区别,怎么去组织一个 Redux 架构的 React Native 项目. 为避免大家还没入门就放弃,预计下一篇才会从我们项目中的实践出发,讲讲更复杂的应用场景. 什么是React Native React Native 使你能够基于 JavaScript 和 React 在

创建一个ArcGIS for Android 新项目并显示出本地的地图

1,我的Android版本是:Android4.4.2. 2,我的ArcgisAndroidSDK是:arcgis-android-sdk-v10.2.3. 一,地图发布 首先需要在ArcCatalog(或Arcgis Server Manager,这个貌似需要将文件夹共享)中,发布地图服务.如何发布就不用说了,需要注意的是: 1)坐标系统选择'Projected Coordinate System'->'World'下的'WGS_1984_Web_Mercator'; 2)需要选择'Servi

Android开源项目第二篇——工具库篇

本文为那些不错的Android开源项目第二篇——开发工具库篇,主要介绍常用的开发库,包括依赖注入框架.图片缓存.网络相关.数据库ORM建模.Android公共库.Android 高版本向低版本兼容.多媒体相关及其他. Android开源项目系列汇总已完成,包括: Android开源项目第一篇——个性化控件(View)篇 Android开源项目第二篇——工具库篇 Android开源项目第三篇——优秀项目篇 Android开源项目第四篇——开发及测试工具篇 Android开源项目第五篇——优秀个人和

Android开源项目第一篇——个性化控件(View)篇

本文为那些不错的Android开源项目第一篇——个性化控件(View)篇,主要介绍Android上那些不错个性化的View,包括ListView.ActionBar.Menu.ViewPager.Gallery.GridView.ImageView.ProgressBar及其他如Dialog.Toast.EditText.TableView.Activity Animation等等. Android开源项目系列汇总已完成,包括: Android开源项目第一篇——个性化控件(View)篇 Andr

android教程:Android创建新项目及开发

android教程:Android创建新项目及开发,这篇文章是比较简单的知识,比较适合才入门的同学们看,当然,大家也可以来看看我总结的,给小编一点意见,说说你们的看法! 创建一个新项目是很简单的,只要你安装了Eclipse插件,并且你的Eclipse软件版本在3.2或3.3,你就可以开始开发了. 首先, 看一下要创建Hello, World程序从高级层面上有哪些步骤: 1.通过 File -> New -> Project 菜单,建立新项目Android Project 2.填写新项目各种参数

Android创建新项目及开发

创建一个新项目是很简单的,只要你安装了Eclipse插件,并且你的Eclipse软件版本在3.2或3.3,你就可以开始开发了. 首先, 看一下要创建"Hello, World"程序从高级层面上有哪些步骤: 1, 通过 File -> New -> Project 菜单,建立新项目"Android Project" 2, 填写新项目各种参数. 3, 编辑自动生成的代码模板. 仅此而已,我们通过下面的详细说明来完成每个步骤. 1.创建一个新的Android项