欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

全局数据源

程序员文章站 2022-07-10 16:22:24
...

实验目的:为了研究两个项目同时访问一个全局数据源的时候是创建了一个数据源对象,还是创建了两个数据源对象。

1:将diuid和mysql驱动包(druid-1.0.2.jar和mysql-connector-java-5.1.15.jar)copy至%TOMCAT_HOME%/lib下;
2:配置数据源,将JNDI在%TOMCAT_HOME%/conf/context.xml中配置好,格式如下:
<Resource
        auth="Container"
        driverClassName="com.mysql.jdbc.Driver"
        factory="com.alibaba.druid.pool.DruidDataSourceFactory"
        maxActive="20"
        maxIdel="10"
        maxWait="1000"
        name="jdbc/snf-paiDS"
        password="adminone"
        type="javax.sql.DataSource"
        url="jdbc:mysql://10.27.82.169/pai?zeroDateTimeBehavior=convertToNull" />
<ResourceLink global="jdbc/snf-paiDS " name="jdbc/snf-paiDS" type="javax.sql.DataSource" />
3:在web.xml中配置druid的监控servletMapping:
    <servlet>
        <servlet-name>DruidStatView</servlet-name>
        <servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>DruidStatView</servlet-name>
        <url-pattern>/druid/console/*</url-pattern>
    </servlet-mapping>
4:启动启动空的tomcat,如果启动成功,说明配置正确;
5:在eclipse中关联tomcat,(注意关联后的配置,应为已按上面步骤配置好的)。
6:创建一个空的项目,用来访问数据源。
7:新建一个servlet,并在web.xml中配好servletMapping,例如:
【JAVA代码:】
public class HoldConnection extends HttpServlet {
    private static final long serialVersionUID = 1L;
    private DataSource        ds; //声明数据源
    private List<Connection>  c                = new ArrayList<Connection>(); //存放连接,防止被垃圾回收器回收
    public HoldConnection() {
        super();
        try {
            Context ic = new InitialContext();
            ds = (DataSource) ic.lookup("java:comp/env/jdbc/snf-paiDS");//访问JNDI
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    protected void doGet(HttpServletRequest request,
                         HttpServletResponse response) throws ServletException, IOException {
        try {
            DruidPooledConnection conn = (DruidPooledConnection) ds.getConnection();//创建druid链接
            DruidDataSource dds = (DruidDataSource) ds; //创建druid的数据源
            c.add(conn);//放入list中,防止被回收
            System.out.println(ds);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    protected void doPost(HttpServletRequest request,
                          HttpServletResponse response) throws ServletException, IOException {
            doGet( request, response);
    }
}
【web.xml配置:】
    <servlet>
        <servlet-name>ds</servlet-name>
        <servlet-class>com.suning.phl.dbcp.HoldConnection</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>ds</servlet-name>
        <url-pattern>/ds/*</url-pattern>
    </servlet-mapping>
8:将项目发布到tomcat中启动;
9:访问HoldConnection;
10:访问druid控制台,查看数据源对象。
11:再新建一个项目,重复上面第6-8步;
12:重新访问两个项目中的HoldConnection(注意路径不要一样),然后再访问druid控制台,查看数据源对象,此时发现:创建了两个数据源对象,
由此可以得出结论,在容器中配置的数据源,通过不同的项目实例访问会创建不同的数据源对象。
假设:数据库的连接数最大值设置为1000,容器中的连接数配置为1000.如果只有一个实例访问数据源,那么是没有问题的。
假设有两个实例访问数据源,如果两个实例的总连接数之和大于1000,那么超出的部分是没办法进行数据库访问的。

案例如下:

数据源对象研究案例