zoukankan      html  css  js  c++  java
  • Jakarta的公共连接池实现 BasicDataSource

    Jakarta的公共连接池实现 - BasicDataSource - 风的呼唤 - ITeye技术网站

    |





    Jakarta的公共连接池实现 - BasicDataSource    

                  如果你的手头没有连接池的本地(native)实现,你可以使用Jakarta提供的公共连接池实现[org.apache.commons.dbcp.BasicDataSource],它可以和DataSource管理器"合作"的很好。另外,Struts还在它的util包里包含了一个GenericDataSource类,这也是一个连接池实现。但是这只是一个非常简单的实现方案,不推荐使用,因为它可能在Struts的以后版本中被BasicDataSource或其它的数据源实现替换掉。



      下面是一段Struts-config.xml配置文件中的数据源配置(使用GenericDataSource数据源实现),你可以更改相应的设置以适合你自己的系统。







    <!-- configuration for GenericDataSource wrapper -->

    <data-sources>

             <data-source>

               <set-property

                     property="autoCommit"

                     value="false"/>

               <set-property

                     property="description"

                     value="Example Data Source Configuration"/>

               <set-property

                     property="driverClass"

                     value="org.postgresql.Driver"/>

               <set-property

                     property="maxCount"

                     value="4"/>

               <set-property

                     property="minCount"

                     value="2"/>

               <set-property

                     property="password"

                     value="mypassword"/>

               <set-property

                     property="url"

                     value="jdbc:postgresql://localhost/mydatabase"/>

               <set-property

                     property="user"

                     value="myusername"/>

             </data-source>

    </data-sources>



    使用BasicDataSource数据源实现的配置方案如下:



    <data-sources>

            <!-- configuration for commons BasicDataSource -->

            <data-source type="org.apache.commons.dbcp.BasicDataSource">

                    <set-property

                      property="driverClassName"

                      value="org.postgresql.Driver" />

                    <set-property

                      property="url"

                      value="jdbc:postgresql://localhost/mydatabase" />

                    <set-property

                      property="username"

                      value="me" />

                    <set-property

                      property="password"

                      value="test" />

                    <set-property

                      property="maxActive"

                      value="10" />

                    <set-property

                      property="maxWait"

                      value="5000" />

                    <set-property

                      property="defaultAutoCommit"

                      value="false" />

                    <set-property

                      property="defaultReadOnly"

                      value="false" />

                    <set-property

                      property="validationQuery"

                      value="SELECT COUNT(*) FROM market" />

            </data-source>

    </data-sources>



      注意,你可以在你的应用系统中定义不止一个数据源,你可以根据需要定义多个数据源,并为它们分别起一个逻辑名(logical name)。这样做可以给你的应用系统提供更好的安全性和可测量性(scalability),你还可以定义一个专用于测试的数据源。



      配置好DataSource以后,你就可以在你的应用系统中使用这些数据源了。下面这段代码演示了怎样在Action类的execute方法中通过这些数据源来生成数据库连接。



    public ActionForward execute(

            ActionMapping mapping,

            ActionForm form,

            HttpServletRequest request,

            HttpServletResponse response)

            throws Exception

    {

            DataSource dataSource;

            Connection cnn;



            try

            {

                    dataSource = getDataSource(request);

                    cnn = dataSource.getConnection();

                    // 数据连接已经建立了,你可以做你想做的事情了

            }

            catch (SQLException e)

            {

                    getServlet().log("处理数据库连接", e);

            }

            finally

            {

                    // 在finally块里包含这些代码

                    // 用以保证连接最后会被关闭

                    try

                    {

                            cnn.close();

                    }

                    catch (SQLException e)

                    {

                            getServlet().log("关闭数据库连接", e);

                    }

            }

    }



      注意:如果你使用公共的BasicDataSource,你提供给pingQuery属性的查询语句(如果你设置了话)必须至少要能返回一行记录。



    例子:SELECT COUNT(*) FROM VALIDTABLE



    你可以把VALIDTABLE替换成你的数据库中包含的任何有效的表。



    [使用多个数据源]



    如果你需要在模块(Module)中使用多于一个的数据源,你可以在配置文件的<data-source>元素里包含一个key属性。



    <data-source>

            <data-source key="A" type="org.apache.commons.dbcp.BasicDataSource">

                    …属性配置略, 同上…

            </data-source>

            <data-source key="B" type="org.apache.commons.dbcp.BasicDataSource">

                    …属性配置略, 同上…

            </data-source>

    </data-source>



    你代码里,你可以通过这些key获得不同的数据源。代码如下:





    try

    {

            dataSourceA = getDataSource(request, "A");

            dataSourceB = getDataSource(request, "B");





    你可以根据需要为每一个模块设置多个数据源。但同一模块里每个数据源的key属性必须唯一,因为Struts模块系统是以每一个模块为单位管理命名空间的。



    [更多的内容请参考:]



    http://www.mail-archive.com/Struts-user@jakarta.apache.org/msg24621.html

    http://www.mail-archive.com/Struts-user@jakarta.apache.org/msg24709.html

    http://www.mail-archive.com/Struts-user@jakarta.apache.org/msg24626.html

    http://www.mail-archive.com/Struts-user@jakarta.apache.org/msg24331.html

    http://www.mail-archive.com/Struts-user@jakarta.apache.org/msg24102.html

    http://www.mail-archive.com/Struts-user@jakarta.apache.org/msg23501.html

    http://www.mail-archive.com/Struts-user@jakarta.apache.org/msg23455.html

    http://www.mail-archive.com/Struts-user@jakarta.apache.org/msg23375.html

    http://www.mail-archive.com/Struts-user@jakarta.apache.org/msg23321.html

    http://www.mail-archive.com/Struts-user@jakarta.apache.org/msg23098.html

    http://www.mail-archive.com/Struts-user@jakarta.apache.org/msg22713.html

    http://www.mail-archive.com/Struts-user@jakarta.apache.org/msg21974.html

    http://www.mail-archive.com/Struts-user@jakarta.apache.org/msg21026.html

    http://www.mail-archive.com/Struts-user@jakarta.apache.org/msg19338.html

    http://www.mail-archive.com/Struts-user@jakarta.apache.org/msg18323.html

    http://www.mail-archive.com/Struts-user@jakarta.apache.org/msg14975.html

    http://www.mail-archive.com/Struts-user@jakarta.apache.org/msg14914.html

    http://www.mail-archive.com/Struts-user@jakarta.apache.org/msg14435.html

    http://www.mail-archive.com/Struts-user@jakarta.apache.org/msg01562.html



    转换/数据传递(Transformation/Data Transfer)

    http://www.mail-archive.com/Struts-user@jakarta.apache.org/msg24480.html

    http://www.mail-archive.com/Struts-user@jakarta.apache.org/msg23623.html

    http://www.mail-archive.com/Struts-user@jakarta.apache.org/msg10195.html

    http://www.mail-archive.com/Struts-user@jakarta.apache.org/msg10205.html



    [提供动态结果集(dynamic result set)]



      大多数的数据库查询结果都会跟你的已经使用的ActionForms一一对应,你只需要把你的查询结果集合提交给相应的ActionForm就可以了。但有时候,结果集(ResultSet)里有些字段并不是ActionForm的属性,或者更糟。



      幸运的是,Struts的自定义标签集并不关心你传递给他们的bean类型。你甚至可以直接输出结果集。但是由于结果集会一直保持着与数据库的连接,并且由于它们把所有的数据都直接传递给了JSP,使得页面变得零乱不堪。那么我们该怎么做呢?



    从Struts 1.1开始,你可以使用新增加的ResultSetDynaClass来把你的结果集转换成一个DynaBeans的ArrayList。Struts自定义标签集可以像一般的JavaBean一样使用DynaBean的属性。(关于DynaActionForm类更详细的信息,请参考Struts用户手册)。



      ResultSetDynaClass类已经包含在于BeanUtils.jar包中,所以你现在所要做的,只需要拿出这个工具,实现自己的传递方案吧…………





    在tomcat的server.xml里面配置数据源,配置如下:



    server.xml



    <Context path="/acb" docBase="e:/eclipse/workspace/acb" debug="2" reloadable="false" crossContext="true">



       <Resource name="jdbc/acb"

            auth="Container"

            type="javax.sql.DataSource"/>

      

       <ResourceParams name="jdbc/acb">

           <parameter>

          <name>factory</name>

          <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>

           </parameter>



           <parameter>

          <name>maxActive</name>

          <value>100</value>

           </parameter>



           <parameter>

          <name>maxIdle</name>

          <value>30</value>

           </parameter>



           <parameter>

          <name>maxWait</name>

          <value>10000</value>

           </parameter>



           <parameter>

         <name>username</name>

         <value>sa</value>

           </parameter>



           <parameter>

         <name>password</name>

         <value>pass</value>

           </parameter>



           <parameter>

           <name>driverClassName</name>

           <value>net.sourceforge.jtds.jdbc.Driver</value>

           </parameter>



           <parameter>

          <name>url</name>

          <value>jdbc:jtds:sqlserver://10.2.146.71:1433;DatabaseName=agri_buissness;SelectMethod=cursor</value>

           </parameter>

        </ResourceParams>

      </Context>



    程序中调用的代码如下:



    Context initctx = new InitialContext();

        Object obj = initctx.lookup(IgenFlowStatic.conJndi);

        dataSource =(DataSource)obj;



    配置文件中:



    <property name="con.jndi" value="java:comp/env/jdbc/acb"/>
  • 相关阅读:
    hihocoder 1049 后序遍历
    hihocoder 1310 岛屿
    Leetcode 63. Unique Paths II
    Leetcode 62. Unique Paths
    Leetcode 70. Climbing Stairs
    poj 3544 Journey with Pigs
    Leetcode 338. Counting Bits
    Leetcode 136. Single Number
    Leetcode 342. Power of Four
    Leetcode 299. Bulls and Cows
  • 原文地址:https://www.cnblogs.com/lexus/p/2570206.html
Copyright © 2011-2022 走看看